用語辞典・通信プロトコル

HTTP/2

HTTP/2とは

HTTP/2は、一つのTCP接続で複数の要求を並行処理し、ヘッダー圧縮などを行うHTTPの版です。HTTP/2(Hypertext Transfer Protocol Version 2/ハイパーテキスト・トランスファー・プロトコル・バージョン・ツー)で、エイチティーティーピー・ツーと読みます。

HTTPのメソッド、URI、状態コード、フィールドの意味は保ったまま、メッセージを小さなバイナリーフレームへ分けます。各要求・応答をストリームへ割り当て、複数ストリームのフレームを一つの接続へ交互に流します。

HTTP/2の多重化は「複数のTCP接続を同時に作る」ことではなく、一つのTCPバイト列の中で、ストリーム番号付きフレームを交互に運ぶ仕組みです。

複数のHTTPメッセージを色別のフレームへ分割し、一つのTLS・TCP接続で交互に運ぶTCP区間が一つ欠けると、その後ろにある全ストリームのバイトが回復を待つ
ブラウザーの三つのHTTP要求をフレームへ分け、HPACKでヘッダーを圧縮し、ストリーム別フロー制御を通して一つのTLS・TCP接続へ多重化し、欠けたTCP区間より後ろの全色ストリームが待つHTTP/2の図解
図1フレームの交互配置は実装と優先度で変わります。図の色や個数は固定の送信順を表すものではありません。

接続、ストリーム、メッセージ、フレームを階層として読む

HTTPの要求・応答を保ちながら、転送時だけフレームへ細分化するストリームごとの状態と、接続全体の状態を取り違えない
Connection一つのTCP接続

設定、圧縮表、接続フロー制御を共有し、双方向でフレームを運ぶ

Stream独立した交換

番号で識別し、通常一つの要求と対応する応答を双方向に構成する

HEADERSHTTPフィールド

メソッド、対象、状態、通常フィールドをHPACK形式で符号化する

DATAHTTP内容

要求本文や応答本文を、ストリームのDATAフレームとして運ぶ

Control接続の管理

SETTINGS、PING、GOAWAYなどが能力、疎通、終了範囲を伝える

Flow受信量の制御

DATAに対し、接続全体と各ストリームの二段階で空き容量を通知する

図2フレーム境界とHTTPメッセージ境界は同一ではありません。HEADERSの後に複数DATAが続き、終端フラグでストリーム方向の終了を示します。

バイナリーフレームにより、複数交換を曖昧なく多重化する

HTTP/1.1は開始行とフィールドをテキストとして送り、本文長やチャンクでメッセージ境界を定めます。HTTP/2は長さ、種類、フラグ、ストリーム識別子を持つ固定形式のフレームヘッダーで区切ります。「バイナリーだから内容が暗号化される」という意味ではありません。

クライアントが開始する通常ストリームには規則に沿う番号を割り当て、応答フレームは同じストリームへ返ります。あるストリームをRST_STREAMで止めても、接続と他ストリームは継続できます。接続全体を穏やかに終えるGOAWAYは、処理済み範囲を伝えて再試行判断を助けます。

HPACKは、同じヘッダーを表へ登録して短い参照へ置き換える

HPACK(エイチパック)はHTTP/2のヘッダー圧縮方式です。よく使う名前・値の静的表と、接続中に双方が更新する動的表を使い、CookieやUser-Agentなど繰り返す文字列を短い索引として送れます。

送信側と受信側の動的表が同じ順に更新される必要があるため、ヘッダーブロックの復号には接続上の先行情報が関わります。圧縮後サイズ、表サイズ、展開後フィールド量へ上限を設け、メモリー消費や過大なヘッダーを制限します。

フロー制御は受信側を守り、優先度は送信順の希望を伝える

HTTP/2のフロー制御はDATAフレームへ適用され、受信側がWINDOW_UPDATEで追加受信可能量を通知します。ストリームの窓が空いていても接続全体の窓が尽きれば送れず、その逆も同様です。TCPの受信ウィンドウとはさらに別の層です。

優先度は重要な資源を先に送りたい希望ですが、初期の依存木方式は運用上複雑で、RFC 9113では該当機構が非推奨になりました。実装やCDNが常に希望どおり配分する保証はなく、資源設計や測定も必要です。

TCPの順序保証により、一つの欠落が接続全体のフレーム解析を止める

HTTP/2ではストリームが論理的に独立していても、すべてのフレームは一つのTCPバイト列に並びます。途中のTCPセグメントが失われると、後続セグメントが届いていても、TCPが欠落を回復して順序を整えるまでアプリへ渡せません。

これがHTTP/2に残る、トランスポート層の先頭待ちによる停滞です。アプリケーション層で多重化できることと、トランスポート層で各ストリームが独立して損失から回復できることは別です。後者を改善するため、HTTP/3はQUICを使います。

WebのHTTP/2は通常TLS上で、ALPNによりh2を選ぶ

HTTPS接続では、TLSハンドシェイクのALPNでクライアントとサーバーがh2を合意します。証明書とTLS設定はHTTPSとして検証し、合意できなければHTTP/1.1など別の対応方式になることがあります。

平文TCP上のHTTP/2も仕様上ありますが、Webブラウザーでの一般的な利用はHTTPSです。開発者ツールの「h2」表示は転送版を示し、URL、HTTPメソッド、キャッシュ意味論が別物へ変わったわけではありません。

仕様の確認資料:RFC 9113「HTTP/2」RFC 7541「HPACK」RFC 7301「TLS ALPN Extension」

関連用語