TLS・QUIC・HTTP/3 — 詰まりをほどく新世代
同じページを開くのに、なぜ新しいプロトコルが必要なのか。鍵は「詰まり(ヘッドオブラインブロッキング)」と「往復(RTT)」という2つのムダです。HTTP/1.1の直列、HTTP/2の多重化とTCPの限界、そしてUDPの上に独立ストリームを作ったQUIC(HTTP/3)へ。1つの遅延・1つの欠落が誰を止めるのかを、流れるパケットで見比べます。TLSの中身を前提にします。
1. 直列の詰まり — HTTP/1.1
HTTP/1.1では、1本のコネクションは要求を1つずつ順番に処理します。前の応答が返るまで次に進めないので、途中の1つが重いと、後ろの要求がまとめて待たされます。これが要求レベルのヘッドオブラインブロッキングです(ブラウザは接続を6本ほど並べてごまかしますが、1本の中では直列のまま)。
下のデモでR2の重さを上げると、R3・R4の完了がどれだけ後ろへずれるか見てください。
2. 多重化 — HTTP/2 が1本に混ぜて流す
HTTP/2は、複数のリクエスト/レスポンスを小さなフレームに刻み、1本のTCP接続に混ぜて(多重化して)同時に流します。もう順番待ちの列は要りません。すべてのストリームが最初から並行して進むので、最初のデータがどれも早く届きます。
下のデモで1.1と2を切り替えて、3つのリソースの進み方の違いを見てください。
3. TCPの壁とQUIC — 1個の欠落は誰を止めるか
HTTP/2の多重化には落とし穴があります。土台のTCPは順序を保証するため、1個のセグメントが失われると、その後ろに届いたデータは全ストリーム分まとめて待たされます。多重化したのに、パケット1個で全員が止まる — これがTCPレベルのヘッドオブラインブロッキングです。
QUICはこれを、UDPの上に独立したストリームを自前で作ることで解きます。あるストリームのパケットが欠けても、止まるのはそのストリームだけ。下のデモで方式を切り替え、パケットを落として誰が止まるか確かめてください。
4. ハンドシェイクの往復 — 速く安全につなぐ
安全な通信を始めるには、鍵の合意と相手の確認が要ります。その往復(RTT)が少ないほど、最初の1バイトが早く届きます。TLS 1.2はTCPの1往復+TLSの2往復で計3往復。TLS 1.3はTLS部分を1往復に短縮。QUICは接続確立と暗号化を統合して1往復、再接続時は0-RTTで最初のパケットに暗号化データを同送できます。
下のデモで方式を選び、往復遅延を変えてください。遠い相手(遅延が大きい)ほど、往復を減らす効果が効いてきます。
5. まとめ — 詰まりと往復を、両方けずる
- HTTP/1.1:1本の接続で要求を直列処理。1つの遅れが後続をまとめて止める(要求レベルの詰まり)。
- HTTP/2:1本のTCPに多重化して詰まりを解消。ただしTCPの順序保証由来の詰まりが残る。
- QUIC / HTTP/3:UDP上に独立ストリームを構築。1個の欠落はそのストリームだけを止める。
- 往復(RTT):TLS1.3・QUIC・0-RTTと世代が進むほど、安全な接続確立に要する往復が減る。
- 速さと安全は対立しない。詰まりと往復という2つのムダを削ることで両立させたのが新世代。