HTTP/1.1・HTTP/2・HTTP/3のレイヤ構造比較図
同じHTTPでも下層が違えば詰まり方も違う。3バージョンの層構造を横並びにし、HOLブロッキングがどの層で起き、どこで消えるかを文章図解で一気に理解できる。
- 1.HTTP/1.1とHTTP/2はTLS over TCPの上に載るが、HTTP/3はTCP+TLSをQUIC over UDPに置き換える。QUICはトランスポートとセキュリティを一体化した1層として動く。
- 2.HOLブロッキングはHTTP/1.1ではアプリ層(直列リクエスト)、HTTP/2ではアプリ層は解消するがTCP層(順序保証)に残る。HTTP/3はQUICがストリームを独立管理するためトランスポート層でも解消する。
- 3.層構造の違いは接続確立コストにも効く。TCP+TLSは複数往復、QUICは初回1往復・再訪0往復で暗号化込みのハンドシェイクが完了する。
同じHTTPでも「下に何があるか」が違う
HTTP/1.1・HTTP/2・HTTP/3は、アプリケーション層から見れば同じ「メソッド・URL・ヘッダ・ボディ」というセマンティクスを共有します。違うのはその下に積まれたトランスポートとセキュリティの層構造です。この層構造の差こそが、性能特性と「どこで詰まるか」を決めます。
本稿では3バージョンを横並びにして、(1) 各層の積み方、(2) ハンドシェイクの往復数、(3) HOL(Head-of-Line)ブロッキングが発生・解消する層、を文章で図解します。前提として、より上の層が下の層のサービスを利用し、下の層の制約をそのまま引き継ぐ、という関係を意識してください。
3バージョンの層スタックを縦に積む
まず各バージョンの層を、上(アプリ)から下(物理に近い側)へ並べます。同じ行が「だいたい同じ役割の層」に対応するよう揃えています。
HTTP/1.1 HTTP/2 HTTP/3
アプリ │ HTTPセマンティクス │ HTTPセマンティクス │ HTTPセマンティクス
整形 │ テキスト行ベース │ バイナリフレーム │ バイナリフレーム
多重化 │ (なし・直列) │ HTTP/2ストリーム │ QUICストリーム ┐
暗号化 │ TLS │ TLS │ │ QUIC
順序保証│ TCP │ TCP │ (QUIC内蔵) ┘
到達 │ IP │ IP │ UDP → IP
最大の差は右端の2バージョンの境目です。HTTP/1.1とHTTP/2は TLS over TCP という独立した2層を別々に積みます。一方HTTP/3は、多重化・暗号化・順序保証・フロー制御をまとめてQUICという1つのトランスポート層に統合し、それをUDPの上に載せます。UDPは「ポート番号付きでパケットを投げるだけ」の薄い層で、信頼性も順序保証も持ちません。それらをQUICが自前で実装しているのが要点です。
TCPはOSカーネルやミドルボックス(NAT・ファイアウォール)に深く埋め込まれ、新機能の追加が事実上不可能でした。QUICは「すでにどこでも通るUDP」を土台にユーザー空間でトランスポートを再実装することで、TCPの硬直を回避しました。だからQUICの改良はアプリ更新だけで配布でき、進化速度がTCPと比べ物になりません。
ハンドシェイクの往復数を比べる
層が分かれているほど、接続確立で握る相手も増えます。RTT(往復遅延)単位で比較します。
| バージョン | トランスポート確立 | 暗号化確立 | 初回合計(最短) | 再訪(0-RTT) |
|---|---|---|---|---|
| HTTP/1.1 (TLS1.2) | TCP 3ウェイ=1 RTT | TLS 2 RTT | 約3 RTT | なし |
| HTTP/2 (TLS1.3) | TCP 3ウェイ=1 RTT | TLS1.3 1 RTT | 約2 RTT | TLS1.3の1-RTT再開 |
| HTTP/3 (QUIC) | QUICとTLS1.3を統合 | (同上に統合) | 1 RTT | 0 RTT 可能 |
HTTP/1.1とHTTP/2では、TCPの3ウェイハンドシェイクが完了してからTLSを始めるという直列依存があります。TLSはTCPという信頼できるバイト列の上でしか動けないからです。HTTP/3のQUICはトランスポートの確立とTLS1.3の鍵交換を同じ往復に相乗りさせるため、初回でも1 RTTで暗号化済みの通信が始まります。さらに過去に接続した相手なら、前回の鍵材料を使って**最初のパケットにアプリデータを同梱(0-RTT)**できます。
0-RTTで送るデータは、攻撃者が傍受して再送するリプレイ攻撃に弱いという原理的な弱点があります。同じリクエストが二重に届いても安全な操作(GETなど冪等な参照)に限って使うのが鉄則で、購入確定のような副作用を持つ操作を0-RTTに載せてはいけません。速さと安全のトレードオフが層統合の代償です。
HOLブロッキングは「どの層で起きるか」が全て
3バージョンを分ける最重要点が、HOLブロッキングの発生層です。HOLブロッキングとは「先頭の処理が詰まると後続が全部待たされる」現象で、どの層がそれを引き起こすかがバージョンごとに違います。
| バージョン | アプリ層のHOL | トランスポート層のHOL | 理由 |
|---|---|---|---|
| HTTP/1.1 | 発生する | (同上に内包) | 1接続で1リクエストずつ直列。前の応答待ちで後続が止まる |
| HTTP/2 | 解消 | 残る | ストリーム多重化でアプリ層は並列化。だが1本のTCPがロス時に全体を保留 |
| HTTP/3 | 解消 | 解消 | QUICがストリームごとに順序保証を分離。1ストリームのロスが他を止めない |
順を追って、なぜそうなるかを層で説明します。
HTTP/1.1(アプリ層で発生). 1本のTCP接続上でリクエストとレスポンスを1往復ずつ処理します。先行リクエストの応答が返るまで後続を送れない(パイプライン化は実装上ほぼ使われない)ため、アプリ層そのものが直列化のボトルネックです。ブラウザはオリジンあたり6本程度の並列接続でごまかしますが、根治ではありません。
HTTP/2(アプリ層は解消・TCP層に移動). 通信をフレームに分割し、ストリームIDで識別して1本のTCPに多重化します。これでアプリ層のHOLは消えます。しかし全ストリームが1本のTCPを共有するため、途中のパケットが1つ失われると、TCPは「順序通りにバイト列を渡す」保証を守るために再送が届くまで後続の全データを上位へ渡さず保留します。ロスが特定の1ストリームのフレームに起きただけでも、TCPは接続全体を止める。これがTCP層のHOLブロッキングで、HTTP/2の多重化の限界です(詳細は HTTP/2の多重化とHPACK を参照)。
HTTP/3(トランスポート層でも解消). QUICはストリームをトランスポート層で独立に管理します。各ストリームが自分専用のシーケンス番号空間と再送・順序保証を持つため、ストリームAのパケットが落ちても、ストリームBは無関係に配送を続けられます。TCPのような「接続全体で1つの順序付きバイト列」という制約がそもそも無いのです。
パケットロス時の挙動(ストリーム1のパケットが1個欠落したと仮定)
HTTP/2 (1本のTCP)
stream1: [P1][--欠落--][P3] ┐
stream2: [P1][P2][P3] ├→ TCPが順序保証 → stream2も保留され停止
stream3: [P1][P2][P3] ┘ (接続全体がHOLブロッキング)
HTTP/3 (QUICが各ストリームを分離)
stream1: [P1][--欠落--][P3] → このストリームだけ再送待ち
stream2: [P1][P2][P3] → 影響なし・即配送
stream3: [P1][P2][P3] → 影響なし・即配送
試験・面接で問われるのは「HTTP/2でHOLブロッキングは解消したか」です。正確な答えは**『アプリ層では解消、TCP層に移動』**。完全に消えるのはHTTP/3でQUICがストリームを分離してからです。「HTTP/2=アプリ層HOLのみ解消」「HTTP/3=トランスポート層HOLも解消」を層とセットで覚えるのが安全です。
層統合がもたらす副次効果:コネクションマイグレーション
層を統合した恩恵はHOLだけではありません。TCP接続は4つ組(送信元IP・ポート・宛先IP・ポート)で同一性を定義するため、スマホがWi-Fiからモバイル回線に切り替わって送信元IPが変わると接続が切れ、張り直しになります。QUICは接続をコネクションIDという独立した識別子で管理するため、IPが変わってもコネクションIDが同じなら同じ接続として継続できます。これがコネクションマイグレーションで、TCPが下層のIPアドレスに縛られていた制約を、層の再設計で外した例です。
QUICはUDPを使うため、UDPを遮断するファイアウォール下では通りません。実運用ではサーバーが Alt-Svc ヘッダで「HTTP/3も話せる」と広告し、クライアントはまずHTTP/2(TCP)で繋いでから裏でHTTP/3を試す、という段階的アップグレードを行います。HTTP/3が使えない環境では自動でHTTP/2へ落ちる設計です。
まとめ
HTTP/1.1とHTTP/2は TLS over TCP の2層を別々に積むのに対し、HTTP/3は多重化・暗号化・順序保証を統合したQUICをUDPの上に1層で載せる点が層構造の核心です。この差がHOLブロッキングの発生層を決め、HTTP/1.1はアプリ層、HTTP/2はTCP層に残り、HTTP/3はQUICのストリーム分離でトランスポート層でも解消します。層統合はハンドシェイクの往復削減(1 RTT/0-RTT)やコネクションマイグレーションといった副次効果も生みます。プロトコル選定の全体像は Webパフォーマンス を、応答再利用の観点は HTTPキャッシュ を、TCP上の双方向通信の選択肢は WebSocket を併せて読むと判断がつながります。
Web/フロントエンド Article
HTTP/1.1・HTTP/2・HTTP/3のレイヤ構造比較図を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
HTTP/3
比較で見る軸
難易度: advanced / カテゴリ: Web/フロントエンド / タグ数: 6
導入後に効く点
HOLブロッキングはHTTP/1.1ではアプリ層(直列リクエスト)、HTTP/2ではアプリ層は解消するがTCP層(順序保証)に残る。HTTP/3はQUICがストリームを独立管理するためトランスポート層でも解消する。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- Web/フロントエンド
- タグ数
- 6
判断チェックリスト
- 自社の用途が「HTTP/3 / QUIC」に近いか確認する。
- 強みである「HTTP/1.1とHTTP/2はTLS over TCPの上に載るが、HTTP/3はTCP+TLSをQUIC over UDPに置き換える。QUICはトランスポートとセキュリティを一体化した1層として動く。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。