Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
HTTP/3
Search
Yasunori Higashiyama
December 21, 2024
0
160
HTTP/3
C++ MIX #12の発表資料です
Yasunori Higashiyama
December 21, 2024
Tweet
Share
Featured
See All Featured
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.8k
Art, The Web, and Tiny UX
lynnandtonic
298
20k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Site-Speed That Sticks
csswizardry
5
470
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.2k
4 Signs Your Business is Dying
shpigford
183
22k
Optimising Largest Contentful Paint
csswizardry
36
3.2k
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
160
15k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.4k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
19
1.1k
Transcript
HTTP/3 2024/12/20 東山裕徳
目次 ⚫HTTP/3について ⚫ヘッダの圧縮 ⚫サーバ実装とデモ
HTTP/3について ⚫HTTPの最新メジャーバージョン ⚫TCPではなく「QUIC」を使う
QUIC ⚫UDPベースのプロトコル ⚫TLS 1.3による暗号化 ⚫TCPと同じようにパケットが欠けたり順番が入れ替わらないようになって いる
QUICストリーム ⚫一つのコネクションの中に「ストリーム」が複数ある ⚫ストリーム単位で順番が入れ替わらないように制御
HTTP/2 ⚫TCPを使う ⚫TCPのコネクション上に「ストリーム」という仮想的な通信路を構築する
HTTP/2のイメージ TCPコネクション GET index.html POST /api/hoge body GET photo.jpg index.html
① photo.jpg ① photo.jpg ② index.html ②
HTTP/2のイメージ GET index.html POST /api/hoge body GET photo.jpg index.html ①
photo.jpg ① photo.jpg ② index.html ② リクエスト レスポンス 複数のリクエストに対するレス ポンスが並行して返される
HTTP/3で解決できた課題 ⚫HTTP/2の場合 ⚫ TCPパケットが途中で欠落すると再送を待つ ⚫ 「index.html」を全部受信できていても途中「photo.jpg」のパケットが欠けていたら 再送されるのを待つ ⚫HTTP/3ではQUICのストリームを活用 ⚫ index.htmlのダウンロードとphoto.jpgのダウンロードはお互い影響しない
HTTPヘッダ ⚫ヘッダ名と値で構成 ⚫ ここは変わりなし ⚫ヘッダの通信での表現方法が変わった
HTTPヘッダ ⚫HTTP/1.1 ⚫ ヘッダ: 値[改行] ⚫HTTP/2とHTTP/3 ⚫ バイナリ形式で表現 ⚫ ヘッダ圧縮
ヘッダ圧縮 ⚫HTTP/2と3で同じ ⚫ 文字列の圧縮 ⚫ 静的テーブル ⚫ 動的テーブル ⚫動的テーブルの追加・参照が大きく異なる
ヘッダの表現 ⚫整数 ⚫ 可変長 ⚫ HTTP/2とHTTP/3では同じ ⚫文字列 ⚫ ハフマン符号を使用して圧縮
静的なテーブル ⚫indexを指定することでヘッダ名・値を指定 ⚫ 例: index=46なら「content-type: application/json」 ⚫ ヘッダ名だけ定義されている場合もある ⚫定義はHTTP/2と3で異なる ⚫HTTP/3でだいぶ拡張
動的なテーブル ⚫HTTP/2ではリクエストと同時に動的テーブルに追加するかどうか指定でき た ⚫HTTP/3では専用のストリームを使ってヘッダの追加をリクエストする ⚫ HTTP/3ではストリームの順番について保証はない ⚫ 圧縮リクエスト側と受信側で順番にヘッダをテーブルに格納するにはリクエスト順に処 理されないといけない
用語の整理 ⚫エンコーダ ⚫ 動的テーブルに追加リクエストする側 ⚫デコーダ ⚫ 圧縮したヘッダを受ける側
動的テーブルへの追加リクエスト ⚫エンコーダからデコーダへのリクエスト ⚫次の3種類の方法で動的テーブルへの追加リクエストを行う ⚫ indexでヘッダ名を指定、値を文字列で指定 ⚫ ヘッダ名と値を文字列で指定 ⚫ 既にテーブルにあるエントリを複製
デコーダからエンコーダへの通知 ⚫動的テーブルに何個追加できたか ⚫ 前回通知してから増えた数を通知 ⚫動的テーブルを参照するリクエストが処理できたか ⚫ストリームのキャンセルの通知
動的テーブルを使うリクエスト ⚫動的テーブルを使用する場合はHTTPヘッダの指定の前に「何個動的テーブ ルに追加されている必要があるか」と「ベースとなる位置」を指定する ⚫リクエストより先に動的テーブルの追加リクエストが処理される保証はな い ⚫ なので「何個追加されている必要があるか」明示する
実装 ⚫QUICの実装については「quicly」を使用しました ⚫https://github.com/YasunoriHigashiyama/quic_test
実装 ⚫UDPの送受信は1スレッドで行う ⚫QUICパケットの復号化は各スレッドで行いたい ⚫ quiclyの暗号化のためのコンテキストは各スレッドで保持 ⚫パケットを受信した時点ではどのスレッドで処理すればよいかわからない のでスレッド間で受け渡し
テストクライアント ⚫quiche ⚫ https://github.com/cloudflare/quiche ⚫ Rust製 ⚫aioquic ⚫ https://github.com/aiortc/aioquic ⚫
Python製
参考資料 ⚫https://github.com/flano-yuki/http3-note ⚫n月刊ラムダノート Vol.2, No.1(2020)