Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
HTTP/3
Search
Yasunori Higashiyama
December 21, 2024
0
190
HTTP/3
C++ MIX #12の発表資料です
Yasunori Higashiyama
December 21, 2024
Tweet
Share
Featured
See All Featured
A designer walks into a library…
pauljervisheath
210
24k
Design in an AI World
tapps
0
100
Building a Scalable Design System with Sketch
lauravandoore
463
34k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
249
1.3M
Embracing the Ebb and Flow
colly
88
4.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
2.8k
Into the Great Unknown - MozCon
thekraken
40
2.2k
Code Reviewing Like a Champion
maltzj
527
40k
Test your architecture with Archunit
thirion
1
2.1k
The Curious Case for Waylosing
cassininazir
0
190
Tell your own story through comics
letsgokoyo
0
760
Docker and Python
trallard
47
3.7k
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)