Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
HTTP/3
Search
Yasunori Higashiyama
December 21, 2024
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
HTTP/3
C++ MIX #12の発表資料です
Yasunori Higashiyama
December 21, 2024
Featured
See All Featured
Ecommerce SEO: The Keys for Success Now & Beyond - #SERPConf2024
aleyda
1
2.2k
Between Models and Reality
mayunak
4
460
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
7.9k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2.2k
Designing for Performance
lara
611
70k
Designing Experiences People Love
moore
143
24k
Discover your Explorer Soul
emna__ayadi
2
1.3k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.8k
The Curious Case for Waylosing
cassininazir
1
510
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
Code Reviewing Like a Champion
maltzj
528
40k
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)