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
170
HTTP/3
C++ MIX #12の発表資料です
Yasunori Higashiyama
December 21, 2024
Tweet
Share
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
49
14k
Designing for humans not robots
tammielis
253
25k
Writing Fast Ruby
sferik
628
62k
Site-Speed That Sticks
csswizardry
10
690
StorybookのUI Testing Handbookを読んだ
zakiyama
30
5.9k
Building Applications with DynamoDB
mza
95
6.5k
Speed Design
sergeychernyshev
32
1k
Making the Leap to Tech Lead
cromwellryan
134
9.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Fashionably flexible responsive web design (full day workshop)
malarkey
407
66k
A better future with KSS
kneath
238
17k
Why Our Code Smells
bkeepers
PRO
336
57k
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)