QUIC / HTTP/3

UDP 上に構築された暗号化・多重化トランスポートプロトコル QUIC と、その上で動作する HTTP/3 の包括的整理。TCP + TLS が数十年かけて獲得した機能を、ossification を回避しつつ単一プロトコルに統合した。2025年10月時点で全 Web トラフィックの約 35% が HTTP/3 で配信されている。


1. QUIC の概要

Google QUIC (gQUIC) から IETF QUIC へ

年出来事
2012Google が社内で QUIC の実験を開始
2013Google が QUIC を公表。Chromium に実装。独自暗号ハンドシェイク (QUIC Crypto) を使用
2015IETF に Internet-Draft を提出
2016IETF QUIC Working Group 設立。Google 独自仕様 (gQUIC) から標準化プロセスへ
2018HTTP over QUIC を「HTTP/3」と命名
2021 (5月)RFC 9000 (QUIC Transport), RFC 9001 (QUIC-TLS), RFC 9002 (Loss Detection & Congestion Control) が Proposed Standard として公開。gQUIC 非推奨化
2022 (6月)RFC 9114 (HTTP/3), RFC 9204 (QPACK), RFC 9218 (Extensible Prioritization Scheme) 公開
2023 (5月)RFC 9369 (QUIC v2) 公開
2025-2026Multipath QUIC が draft-21 (2026年3月)。WebTransport が W3C Working Draft。全ブラウザが HTTP/3 をネイティブサポート

gQUIC → IETF QUIC の最大の変更点: 独自暗号ハンドシェイク (QUIC Crypto) を廃止し、TLS 1.3 を統合。ワイヤフォーマットも全面再設計。

コア RFC 群

RFCタイトル内容
RFC 8999Version-Independent Properties of QUICバージョン間で不変の性質を定義
RFC 9000QUIC: A UDP-Based Multiplexed and Secure Transportトランスポート層の本体仕様
RFC 9001Using TLS to Secure QUICTLS 1.3 ハンドシェイクの統合方法
RFC 9002QUIC Loss Detection and Congestion Controlパケットロス検出と輻輳制御
RFC 9114HTTP/3HTTP セマンティクスの QUIC マッピング
RFC 9204QPACKHTTP/3 用ヘッダ圧縮
RFC 9218Extensible Prioritization Scheme for HTTPHTTP/2・HTTP/3 共通の優先度方式
RFC 9369QUIC Version 2ossification 対策としてのバージョン2

なぜ QUIC が必要か: TCP + TLS の問題

sequenceDiagram
    participant C as クライアント
    participant S as サーバー

    Note over C,S: TCP + TLS 1.3 (2-RTT)
    C->>S: SYN
    S->>C: SYN-ACK
    C->>S: ACK + TLS ClientHello
    S->>C: TLS ServerHello + Finished
    C->>S: TLS Finished + HTTP Request
    Note over C,S: 合計 2 RTT で初回データ送信

    Note over C,S: QUIC (1-RTT)
    C->>S: QUIC Initial (ClientHello 内包)
    S->>C: QUIC Handshake (ServerHello + Finished 内包)
    C->>S: QUIC 1-RTT (HTTP Request)
    Note over C,S: 合計 1 RTT で初回データ送信
TCP + TLS の問題QUIC での解決
ハンドシェイクに 2-3 RTTTLS 1.3 統合で 1-RTT、再接続時 0-RTT
Head-of-Line Blocking (HoL)独立ストリームでストリーム間の HoL を排除
IP/ポートでコネクション識別 → ネットワーク切り替えで切断Connection ID による識別。コネクションマイグレーション
ミドルボックスの ossification (TCP オプション拡張不能)ほぼ全パケットが暗号化。ミドルボックスが内部を見れない
カーネル実装 → 更新が OS リリースに縛られるユーザー空間実装 → アプリケーションと共にデプロイ

なぜ UDP 上に構築するか

  1. カーネル変更不要: 新しいトランスポートプロトコルを IP プロトコル番号で定義すると、全 OS カーネルの対応が必要。UDP はすでに全デバイスで動作する
  2. NAT/ファイアウォール通過: UDP port 443 は多くのネットワークで通過可能
  3. ユーザー空間実装: UDP ソケット上でプロトコルロジックを実装することで、アプリケーションと同じペースで進化できる
  4. ミドルボックス ossification の回避: TCP は数十年の最適化の結果、ミドルボックスが TCP ヘッダの構造に依存した処理を行うようになり、プロトコル拡張が事実上不可能に。UDP は「何も仮定しない」ため自由度が高い

2. QUIC の技術的詳細

コネクション確立 (0-RTT / 1-RTT)

1-RTT ハンドシェイク (初回接続)

QUIC は TLS 1.3 を統合しており、トランスポート層のハンドシェイクと暗号ハンドシェイクが不可分。TCP のように「先に TCP 接続 → 次に TLS」という2段階がない。

  1. クライアントが Initial パケットを送信 (TLS ClientHello を内包)
  2. サーバーが Handshake パケットで応答 (TLS ServerHello + 証明書 + Finished を内包)
  3. クライアントが Handshake 完了 + 最初の 1-RTT データ (HTTP リクエスト等) を送信

重要: QUIC の Initial パケット自体も暗号化されている (ただし鍵は公知の値から導出されるため、機密性ではなくフォーマット保護が目的)。Handshake 以降のパケットは完全に暗号化される。

0-RTT (再接続時)

以前の接続で取得した PSK (Pre-Shared Key) / セッションチケットを使い、ハンドシェイク完了前にアプリケーションデータを送信。

クライアント → サーバー: Initial + 0-RTT データ (HTTP GET 等)
サーバー → クライアント: Handshake + 1-RTT レスポンス

接続確立のレイテンシがゼロ。モバイルユーザーや Edge CDN での再接続に特に有効。

0-RTT のリプレイ攻撃リスクと対策

0-RTT データは前方秘匿性 (Forward Secrecy) を持たない。攻撃者が 0-RTT パケットをキャプチャして再送すると、サーバーが同じリクエストを再度処理する可能性がある。

対策説明
冪等性の要求0-RTT では冪等なリクエスト (GET 等) のみ送信すべき。非冪等操作 (POST による送金等) は 1-RTT 確立後に
PSK Binder による一意性検証PSK Binder が 0-RTT リクエストごとに一意。Cloudflare はこれをリプレイ検出キーとして使用
リプレイキャッシュサーバーが受信済み 0-RTT のタイムスタンプ/ノンスを Bloom Filter 等で追跡
時間ウィンドウ制限セッションチケットの有効期間を短く設定 (例: 数分)
アプリケーション層の防御サーバーアプリケーションが 0-RTT データを「暫定的」として扱い、ハンドシェイク完了後に確定

Connection ID によるコネクション識別

TCP はコネクションを (送信元 IP, 送信元ポート, 宛先 IP, 宛先ポート) の 4-tuple で識別する。QUIC は Connection ID (可変長、最大 20バイト) で識別する。

コネクションマイグレーション

sequenceDiagram
    participant Phone as スマートフォン
    participant Server as サーバー

    Note over Phone: Wi-Fi: 192.168.1.10
    Phone->>Server: QUIC パケット (CID: 0xABCD)
    Server->>Phone: QUIC パケット (CID: 0x1234)

    Note over Phone: Wi-Fi → セルラーに切り替え
    Note over Phone: IP: 10.0.0.5 に変更

    Phone->>Server: QUIC パケット (CID: 0xABCD, PATH_CHALLENGE)
    Server->>Phone: PATH_RESPONSE + 新 CID
    Note over Phone,Server: コネクション継続 (再ハンドシェイク不要)

Anycast との相性

TCP + Anycast の問題: BGP 経路変更でパケットが別 PoP に到達 → TCP 状態がない → RST → 切断。

QUIC + Anycast の解決策:

  1. 初回は Anycast で最寄り PoP に接続
  2. Connection ID にルーティング情報をエンコード (QUIC-LB: draft-ietf-quic-load-balancers)
  3. ロードバランサーが Connection ID から正しいサーバーに転送
  4. PoP 障害時も Connection ID ベースで別 PoP にマイグレーション可能

ストリーム多重化

Head-of-Line Blocking の解消

graph TD
    subgraph "HTTP/2 over TCP"
        TCP["TCP バイトストリーム (順序保証)"]
        S1_2["Stream 1"] --> TCP
        S2_2["Stream 2"] --> TCP
        S3_2["Stream 3"] --> TCP
        TCP -->|"パケットロス → 全ストリーム停止"| Block["HoL Blocking"]
    end

    subgraph "HTTP/3 over QUIC"
        S1_3["Stream 1"] -->|"独立した損失回復"| OK1["継続"]
        S2_3["Stream 2"] -->|"パケットロス"| Loss["このストリームのみ停止"]
        S3_3["Stream 3"] -->|"独立した損失回復"| OK3["継続"]
    end

ストリームの種類

種類ID の偶奇開始者用途
クライアント開始双方向0, 4, 8, …クライアントHTTP リクエスト/レスポンス
サーバー開始双方向1, 5, 9, …サーバーサーバープッシュ (HTTP/3 では未使用)
クライアント開始単方向2, 6, 10, …クライアントQPACK エンコーダストリーム等
サーバー開始単方向3, 7, 11, …サーバーQPACK デコーダストリーム等

フロー制御

QUIC は 2 層のフロー制御を持つ:

層制御対象目的
ストリームレベル個別ストリームのバッファ消費1つの高帯域ストリームが他のストリームを圧迫しない
コネクションレベルコネクション全体のバッファ消費受信者のメモリ保護

MAX_STREAM_DATA フレームと MAX_DATA フレームで受信ウィンドウを動的に通知。TCP のウィンドウスケーリングに相当するが、ストリーム単位の粒度がある。

輻輳制御

QUIC の輻輳制御はプラグ可能 (pluggable) に設計されている。RFC 9002 は New Reno をベースラインとして定義するが、実装は任意のアルゴリズムを使用可能。

アルゴリズム特徴主な使用
New RenoRFC 9002 のリファレンス。ロスベース仕様準拠のベースライン
CUBICロスベース。TCP のデフォルト (Linux)。高 BDP ネットワーク向けCloudflare quiche (デフォルト), 多くの実装
BBR (v1/v2/v3)モデルベース。帯域幅と RTT を推定。ロスに鈍感Google (Chromium), LiteSpeed
HyStart++スロースタートの改良。CUBIC と組み合わせCloudflare quiche
Copa, Aero 等研究段階のアルゴリズム学術研究

BBR vs CUBIC の本質的な違い: CUBIC はパケットロスを輻輳の信号とする。BBR はボトルネック帯域幅と RTT を推定し、パケットロスと輻輳を区別する。無線ネットワークのような物理的パケットロスが多い環境では BBR が有利。

パケットロスとリカバリ

TCP の問題QUIC の解決
シーケンス番号の再利用 (再送パケットが同じ seq) → RTT 推定が曖昧パケット番号は単調増加。再送パケットも新しい番号 → RTT 推定が正確
SACK (Selective ACK) は TCP オプションで容量制限ACK フレームに任意数の ACK Range を含めることが可能
NACK なし、ACK + SACK で推定ACK ベース (NACK なし) だが、豊富な ACK Range で同等の情報量
RTO (Retransmission Timeout) の曖昧性PTO (Probe Timeout) で早期にプローブパケットを送信し、タイムアウト待ちを削減

3. HTTP/3

HTTP/3 = HTTP over QUIC

HTTP/3 (RFC 9114) は HTTP のセマンティクス (メソッド、ヘッダ、ステータスコード等) を QUIC トランスポート上にマッピングしたもの。HTTP のセマンティクス自体は HTTP/1.1, HTTP/2, HTTP/3 で共通 (RFC 9110)。

HTTP/2 との主要な違い

項目HTTP/2HTTP/3
トランスポートTCP + TLS 1.2/1.3QUIC (UDP + TLS 1.3 統合)
多重化の HoLTCP 層で HoL Blocking ありストリーム間の HoL なし
ヘッダ圧縮HPACKQPACK
ハンドシェイクTCP 3-way + TLS = 2-3 RTT1-RTT (初回), 0-RTT (再接続)
コネクションマイグレーション不可可能 (Connection ID)
優先度制御依存ツリーモデル (複雑、実装差大)RFC 9218 (urgency + incremental)
サーバープッシュあり (広く使用)仕様上あり、実質廃止

QPACK vs HPACK

項目HPACK (RFC 7541)QPACK (RFC 9204)
設計対象HTTP/2 (TCP 上の順序保証あり)HTTP/3 (QUIC の独立ストリーム)
動的テーブル更新ストリーム内でインライン専用の単方向ストリームで送受信
HoL Blockingなし (TCP が順序保証)設計で回避 (静的テーブル参照と Literal はブロックしない)
静的テーブルサイズ61 エントリ (値付き 14、~23%)99 エントリ (値付き 78、~80%)
順序依存あり (1 TCP コネクション内で順次処理)なし (エンコーダ/デコーダストリームで同期)

HPACK は TCP の順序保証に依存して動的テーブルを更新するが、QUIC ではストリーム間の順序が保証されないため、QPACK はエンコーダストリーム (送信側→受信側) とデコーダストリーム (受信側→送信側) の2本の単方向ストリームで動的テーブルの同期を行う。

Server Push の実質的廃止

HTTP/2 で導入されたサーバープッシュは、HTTP/3 でも仕様上は存在するが、実質的に廃止されている:

HTTP/3 Priority (RFC 9218)

HTTP/2 の依存ツリーモデルは複雑で実装間の差異が大きく、実質的に機能しなかった。RFC 9218 で全面的に再設計:

Priority: u=3, i

4. Edge Computing と QUIC/HTTP/3

CDN での QUIC 活用

graph LR
    Mobile["モバイルユーザー"] -->|"QUIC (0-RTT)"| PoP["Edge PoP<br/>(Anycast)"]
    PoP -->|"QUIC or TCP"| Origin["Origin"]

    Note1["1. Anycast で最寄り PoP に到達"] -.-> PoP
    Note2["2. 0-RTT で即座にレスポンス開始"] -.-> PoP
    Note3["3. Connection ID でマイグレーション耐性"] -.-> PoP
QUIC の Edge 価値説明
0-RTT の意味Edge PoP でTLS 終端 → 再訪問ユーザーは 0-RTT で即座にデータ取得。CDN の TLS 終端メリットをさらに強化
Anycast + Connection IDBGP 経路変更でもコネクション維持。QUIC-LB (draft-ietf-quic-load-balancers) で Connection ID にルーティング情報をエンコード
モバイルユーザーWi-Fi → セルラー切り替えでもストリーミング/ダウンロードが中断しない
DDoS 耐性QUIC の Initial パケットはステートレスリトライ (Retry パケット) で増幅攻撃を軽減

Cloudflare の QUIC 実装 (quiche / tokio-quiche)

Cloudflare は QUIC/HTTP/3 実装 quiche を Rust で開発し、全 Edge PoP で運用:

モバイルユーザーへの影響

コネクションマイグレーションは理論上の機能ではなく、モバイルユーザーの日常体験に直接影響する:


5. パフォーマンス

ベンチマーク実測値

Cloudflare 測定 (blog.cloudflare.com, 2024)

メトリクスHTTP/3HTTP/2差
TTFB (平均)176ms201msHTTP/3 が 12.4% 高速
小さいページ (15KB)443ms458msHTTP/3 がわずかに高速
大きいページ (1MB)2.33s2.30sHTTP/2 がわずかに高速

大きいページで HTTP/3 が遅い原因: テスト時の HTTP/2 は BBRv1、HTTP/3 は CUBIC を使用。輻輳制御アルゴリズムの差が支配的。

Request Metrics 測定 (距離別)

場所 (サーバーからの距離)HTTP/3 の HTTP/2 比改善
New York (~1,000マイル)200-325ms 高速
London (大西洋横断)600-1,200ms 高速 (NY の 3-3.5 倍の改善)
Bangalore (長距離)さらに大きな改善幅

距離が長いほど QUIC の 0-RTT / 1-RTT 削減効果が顕著。

Catchpoint 測定 (6カ国、TTFB)

HTTP/3 は中央値 TTFB を 41.8% 削減。

LCP (Largest Contentful Paint) 実測

HTTP/3 ユーザー: 1.44秒、HTTP/2 ユーザー: 1.67秒 → 13.8% 改善。

パフォーマンス特性まとめ

シナリオHTTP/3 の優位性理由
高レイテンシ (長距離)大1-RTT / 0-RTT の効果が RTT に比例
パケットロスの多い環境大ストリーム間 HoL Blocking なし
モバイル (ネットワーク切替)大コネクションマイグレーション
再訪問ユーザー大0-RTT で即座にデータ送信
低レイテンシ LAN小〜なしRTT 削減の効果が小さい
大容量ファイル転送小〜逆転輻輳制御の成熟度次第。TCP の BBR が有利なケースも
初回接続中1-RTT (QUIC) vs 2-3 RTT (TCP+TLS)
再接続大0-RTT (QUIC) vs 1-2 RTT (TCP+TLS)

6. 実装

主要な QUIC 実装

実装言語組織特徴
quicheRustCloudflare全 Cloudflare Edge で運用。CUBIC/BBR/HyStart++ プラグ可能。tokio-quiche で非同期統合
QuinnRustコミュニティTokio ネイティブ。安定ネットワークで高スループット。Rust エコシステムのデファクト
s2n-quicRustAWSAWS のプロダクション品質。s2n-tls と統合
NeqoRustMozillaFirefox の QUIC 実装
msquicCMicrosoftWindows カーネル統合。高パフォーマンス。ロス/リオーダリング耐性が高い
ngtcp2Cコミュニティ (tatsuhiro-t)nghttp3 と組み合わせ。curl の HTTP/3 バックエンド
quic-goGoコミュニティGo エコシステムのデファクト。MASQUE 実装 (masque-go) もあり
mvfstC++MetaMeta プロダクション。proxygen と統合
lsquicCLiteSpeedLiteSpeed Web Server の QUIC 実装。BBR サポートが早期
Chromium QUICC++GoogleChrome / Chromium の実装。gQUIC から IETF QUIC に移行済
picoquicCコミュニティ (huitema)リファレンス実装寄り。fuzzing ツール fuzi_q を同梱
XQUICCAlibabaクロスプラットフォーム
linuxquicCコミュニティLinux カーネル内 QUIC 実装 (実験段階)
aioquicPythonコミュニティPython asyncio ベース
AppleQuicC/ObjC/SwiftApplemacOS/iOS ネイティブ。プロプライエタリ

ブラウザ対応状況 (2026年5月)

ブラウザHTTP/3 サポート備考
Chrome87+ (2020年11月〜)デフォルト有効
Firefox88+ (2021年4月〜)デフォルト有効
Safari14+ (2020年〜)実験的 → 16 以降デフォルト
Edge87+ (Chromium ベース)Chrome と同等

全主要ブラウザでデフォルト有効。HTTP/3 の発見は Alt-Svc ヘッダまたは DNS HTTPS レコードで行われる。


7. QUIC の課題と批判

UDP ベースの問題

問題詳細
ファイアウォール/ISP のブロック企業ネットワークやホテル Wi-Fi で UDP 443 がブロックされるケースあり。ブラウザは TCP (HTTP/2) にフォールバック
国家レベルの検閲2025年1月時点で中国の GFW が SNI ベースで QUIC をブロック。ただし、複数 UDP データグラムにまたがる ClientHello の再組み立てには対応していない
NAT タイムアウトUDP の NAT エントリは TCP より短い (30秒〜2分 vs 数時間)。QUIC はキープアライブが必要

CPU 負荷

ミドルボックスの不透明性

QUIC パケットのほぼ全体が暗号化されているため:

OS カーネルでの最適化の遅れ


8. 将来の展望

QUIC v2 (RFC 9369)

2023年5月公開。QUIC v1 と機能的にほぼ同一だが、ワイヤフォーマットの一部 (Initial パケットの salt, Retry パケットの鍵等) を意図的に変更。目的:

Multipath QUIC (draft-ietf-quic-multipath-21, 2026年3月)

単一コネクションで複数のネットワークパスを同時使用:

graph LR
    Device["スマートフォン"] -->|"パス 1: Wi-Fi"| Server["サーバー"]
    Device -->|"パス 2: セルラー"| Server
    Note["同一 QUIC コネクション<br/>パスごとに独立した CID と<br/>パケット番号空間"]

WebTransport

QUIC 上でブラウザから低レイテンシのデータグラム/ストリーム通信を行う API:

項目WebSocketWebTransport
トランスポートTCPQUIC (HTTP/3 上)
多重化なし (1コネクション = 1ストリーム)複数ストリーム + データグラム
HoL Blockingありなし
信頼性常に reliablereliable (ストリーム) + unreliable (データグラム) 選択可能
0-RTT不可可能

MASQUE (Multiplexed Application Substrate over QUIC Encryption)

QUIC / HTTP/3 上でプロキシングを行うプロトコル群:

RFC/Draft名前機能
RFC 9298Proxying UDP in HTTPHTTP/3 CONNECT-UDP で UDP トラフィックをプロキシ
draft-ietf-masque-quic-proxy-08 (2026年3月)QUIC-Aware Proxyingプロキシが QUIC short header を認識し、UDP 4-tuple を再利用。スループット向上

押さえどころ (カード化候補)

関連

Graph