RFC 9000: QUIC
ヘッドオブラインブロッキングと接続確立の遅延というTCPの課題を、QUICがUDP上でどう解決したかを精読。ストリーム多重化・1-RTT確立・接続移行の仕組みまで一気に掴める。
- RFC 9000(2021年)はUDP上で多重化・暗号化・接続移行を行うQUICを定義する。TLS統合はRFC 9001、損失検出と輻輳制御は9002へ分離し、HTTP/3(9114)が上で動く。
- ストリーム多重化をトランスポート層に組み込み、あるストリームのパケット損失が他ストリームの配送を妨げない設計とした。TCP(RFC 9293)ではバイト列が単一のため避けられなかったヘッドオブラインブロッキングを解消している。
- TLS 1.3(RFC 8446)をハンドシェイクに統合して1-RTTで暗号化接続を確立し、再接続時は0-RTTでデータ送信まで可能にした。コネクションIDで接続を識別するため、Wi-Fiからモバイル回線への切替でも接続を維持できる。
このRFCが決めたこと
横にスクロール
RFC 9000(2021年5月)は、UDPの上に構築された汎用トランスポートプロトコルQUICを定義した文書だ。Googleが実験的に展開していたプロトコルを母体にIETFで再設計されたもので、ストリーム多重化・TLS 1.3による暗号化・接続移行までをひとつのプロトコルとして一体設計し、TCPが数十年かけて積み上げてきた機能を別の形で作り直した。
QUICの標準は4本のRFCで構成される。中核のRFC 9000がコネクションとストリームの仕組みを、RFC 9001がTLS 1.3との統合を、RFC 9002が損失検出と輻輳制御を、RFC 8999がバージョンに依存しない不変部分を定める。翌2022年6月には、QUICを前提に再設計されたHTTP/3がRFC 9114として発行された。
なぜUDPの上に作ったのか。TCPはOSカーネルに実装されているため、新機能が全端末に行き渡るまでに何年もかかる。さらに経路上のルータやファイアウォールがTCPヘッダを覗き、書き換える前提で動いており、プロトコルを変更すると通信自体が壊れる。この「オシフィケーション(硬直化)」を避けるため、QUICはどの環境でも通るUDPを最小限の器として使い、トランスポートの機能一式をユーザー空間のライブラリとして実装できるようにした。カーネルを改修しなくても、アプリケーションの更新だけでプロトコルを進化させられる。
QUICはUDPの「信頼性がない」性質をそのまま引き継ぐわけではない。到達保証・順序制御・輻輳制御はすべてQUIC自身が実装する。UDPは、NATやファイアウォールを通過できる最小限の土台として選ばれただけだ。
要点の精読
ストリーム多重化がトランスポート層に入った
TCP(RFC 9293)が運べるのは単一のバイト列だ。HTTP/2は1本のTCP接続に複数のストリームを多重化したが、パケットが1つ失われると、TCPは再送が届くまで後続データを(無関係なストリームの分まで)アプリケーションに渡せない。これがトランスポート層のヘッドオブラインブロッキングだ。
QUICはストリームをトランスポート層そのものの概念にした。各ストリームは独立した順序空間を持ち、あるストリームのパケットが失われても、他のストリームのデータは到着し次第アプリケーションへ渡される。損失の影響が当該ストリームだけに閉じる。
| 構成 | 多重化の場所 | 1パケット損失の影響 |
|---|---|---|
| HTTP/1.1 + TCP | なし(接続を並列に張る) | その接続の全リクエストが待つ |
| HTTP/2 + TCP | アプリケーション層 | 全ストリームが待つ |
| HTTP/3 + QUIC | トランスポート層 | 該当ストリームだけが待つ |
TLS 1.3統合による1-RTT/0-RTT接続確立
従来のHTTPSは、TCPの3ウェイハンドシェイクで1往復、その上のTLS 1.3(RFC 8446)でさらに1往復、計2-RTTを要した。QUICはトランスポートとTLSのハンドシェイクを一体化し(RFC 9001)、初回接続でも1-RTTで暗号化済みのアプリケーションデータを送り始められる。さらに一度接続したサーバーへの再接続なら、最初のパケットにデータを同乗させる0-RTTも使える。
TCP + TLS 1.3 : SYN → SYN/ACK → ACK → TLSハンドシェイク → データ(計2-RTT)
QUIC 初回 : Initial(ClientHello) → 応答 → データ(1-RTT)
QUIC 再接続 : Initial + 0-RTTデータ → 応答(0-RTT)
コネクションIDによる接続移行
TCPの接続は送信元・宛先のIPアドレスとポートの4タプルで識別されるため、Wi-Fiからモバイル回線に切り替わってアドレスが変わった瞬間に接続は切れる。QUICは接続をコネクションIDという識別子で管理する。経路やアドレスが変わってもコネクションIDが継続していれば同じ接続として扱われ、スマートフォンが自宅のWi-Fiを離れてもダウンロードや通話は張り直しなしで続く。なお移行先アドレスの正当性はパス検証で確認することが必須とされ、なりすましによる乗っ取りや、偽装アドレスへトラフィックを反射させる攻撃を防いでいる。
パケット番号は再送でも増え続ける
TCPのシーケンス番号はバイト位置を表すため、再送セグメントは元と同じ番号を持つ。届いたACKが元の送信と再送のどちらへの応答なのか区別できず、RTT測定が曖昧になる(再送曖昧性)。QUICのパケット番号は送信のたびに増え続け、失われたデータの再送も新しい番号の新しいパケットとして送られる。どの送信に対するACKかが常に一意に定まるため、RTT標本が正確になり、RFC 9002の損失検出と輻輳制御はこの土台の上に組み立てられている。
ほぼ全体が暗号化され、中間装置から見えない
TCPではシーケンス番号やフラグが平文で流れるため、中間装置がそれに依存した処理を積み重ね、結果としてプロトコルの進化を止めてきた。QUICはペイロードだけでなく、ACKや制御情報を含むパケットのほぼ全体を暗号化し、パケット番号すらヘッダ保護で隠す。ネットワークから観測できるのは、コネクションIDやバージョンなど、RFC 8999が不変と定めたごく一部にすぎない。中間装置が中身に依存できない構造にしたこと自体が、将来の変更可能性を守る設計になっている。
つまずきやすい点
まず、QUICはHTTP/3専用ではない。RFC 9000は汎用トランスポートであり、HTTP/3(RFC 9114)は最初の代表的な利用者にすぎず、DNS over QUIC(RFC 9250)のように他プロトコルの土台にもなっている。次に、0-RTTはリプレイ攻撃を前提に使う必要がある。攻撃者は盗聴した0-RTTパケットを複製して再送信できるため、そこに載せてよいのは再生されても害のない操作(HTTPなら安全なメソッド)に限られる。
また、UDPを遮断するネットワークは現実に存在する。そのためブラウザはHTTP/3への対応をAlt-Svcヘッダなどで知り、つながらなければTCPベースのHTTP/2以下へフォールバックする(HTTPのバージョンを参照)。最後に、コネクションIDはロードバランサと相性問題を起こす。4タプルが変わっても接続が続くため、アドレスベースの分散では移行後のパケットが別のサーバーに届いてしまう。コネクションIDに振り分け情報を埋め込むなど、QUICを理解した分散設計が必要になる。
まとめ
RFC 9000は、カーネルと中間装置に固定されて動けなくなったTCPの機能群を、UDPの上でユーザー空間に作り直した再出発だ。多重化・1-RTT接続・接続移行を標準装備にしたうえで、ほぼ全体の暗号化によって進化の自由まで確保した点にこのRFCの本質がある。関連するRFCの解説はRFC精読から辿れる。
RFC精読の記事ガイド
RFC 9000: QUICを実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
RFC
比較で見る軸
難易度: advanced / カテゴリ: RFC精読 / タグ数: 5
導入後に効く点
ストリーム多重化をトランスポート層に組み込み、あるストリームのパケット損失が他ストリームの配送を妨げない設計とした。TCP(RFC 9293)ではバイト列が単一のため避けられなかったヘッドオブラインブロッキングを解消している。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- RFC精読
- タグ数
- 5
判断チェックリスト
- 自社の用途が「RFC / QUIC」に近いか確認する。
- 強みである「RFC 9000(2021年)はUDP上で多重化・暗号化・接続移行を行うQUICを定義する。TLS統合はRFC 9001、損失検出と輻輳制御は9002へ分離し、HTTP/3(9114)が上で動く。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。