HTTP/3
QUIC プロトコル上で動作する次世代の HTTP
ネットワークWeb
HTTP/3 とは
HTTP/3 は、2022 年に RFC 9114 として標準化された HTTP の最新バージョンである。TCP の代わりに QUIC (UDP ベース) をトランスポート層に使用し、接続確立の高速化とヘッドオブラインブロッキングの解消を実現する。
HTTP/1.1 → HTTP/2 → HTTP/3
| 観点 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| トランスポート | TCP | TCP | QUIC (UDP) |
| 多重化 | なし (パイプライン) | ストリーム多重化 | ストリーム多重化 |
| HoL ブロッキング | あり | TCP 層で発生 | 解消 |
| 接続確立 | TCP + TLS (2〜3 RTT) | TCP + TLS (2〜3 RTT) | 0〜1 RTT |
| ヘッダー圧縮 | なし | HPACK | QPACK |
QUIC プロトコル
QUIC は Google が 2012 年に開発し、IETF が 2021 年に RFC 9000 として標準化したトランスポートプロトコル。
HTTP/2: [HTTP/2] → [TLS 1.3] → [TCP] → [IP]
HTTP/3: [HTTP/3] → [QUIC (TLS 1.3 内蔵)] → [UDP] → [IP]
QUIC の主な特徴:
- 0-RTT 接続: 以前接続したサーバーには TLS ハンドシェイクなしで即座にデータを送信
- 独立したストリーム: 1 つのストリームでパケットロスが起きても他のストリームに影響しない (HTTP/2 の TCP 層 HoL ブロッキングを解消)
- コネクションマイグレーション: IP アドレスが変わっても (Wi-Fi → モバイル) 接続を維持
ヘッドオブラインブロッキングの解消
HTTP/2 は TCP 上で多重化するため、1 つのパケットロスが全ストリームをブロックする。HTTP/3 は QUIC のストリームが独立しているため、この問題が発生しない。
HTTP/2 (TCP):
ストリーム A: [パケット1] [パケット2:ロス] → 全ストリーム待機
ストリーム B: ブロック
ストリーム C: ブロック
HTTP/3 (QUIC):
ストリーム A: [パケット1] [パケット2:ロス] → A だけ再送待ち
ストリーム B: 正常に進行
ストリーム C: 正常に進行
モバイル回線やパケットロスが多い環境で特に効果が大きい。
AWS での対応状況
CloudFront は HTTP/3 をサポートしており、ディストリビューションの設定で有効化できる。クライアント (ブラウザ) と CloudFront 間が HTTP/3 で通信し、CloudFront とオリジン間は HTTP/1.1 または HTTP/2 を使用する。
主要ブラウザ (Chrome、Firefox、Safari、Edge) は全て HTTP/3 に対応済み。
HTTP/2 からの移行
HTTP/3 は HTTP/2 と同じセマンティクス (メソッド、ステータスコード、ヘッダー) を使うため、アプリケーション層の変更は不要。CDN やロードバランサーの設定で有効化するだけで利用できる。
関連書籍も参考になる。