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
130
HTTP/3
C++ MIX #12の発表資料です
Yasunori Higashiyama
December 21, 2024
Tweet
Share
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
53
13k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.1k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
Building Applications with DynamoDB
mza
91
6.1k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
920
For a Future-Friendly Web
brad_frost
175
9.4k
The Language of Interfaces
destraynor
155
24k
Become a Pro
speakerdeck
PRO
26
5k
Six Lessons from altMBA
skipperchong
27
3.5k
GraphQLの誤解/rethinking-graphql
sonatard
67
10k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
280
13k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
95
17k
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)