メインコンテンツまでスキップ

2. HTTP/2プロトコルの概要

HTTP/2は、HTTPセマンティクスのための最適化されたトランスポートを提供します。HTTP/2はHTTPのすべてのコア機能をサポートしていますが、HTTP/1.1よりも効率的であることを目指しています。

HTTP/2は、TCP接続([TCP])上で実行される接続指向のアプリケーション層プロトコルです。クライアントはTCP接続の開始者です。

HTTP/2の基本的なプロトコル単位はフレームです(セクション4.1)。各フレームタイプは異なる目的を果たします。たとえば、HEADERSフレームとDATAフレームはHTTPリクエストとレスポンスの基礎を形成します(セクション8.1)。SETTINGS、WINDOW_UPDATE、PUSH_PROMISEなどの他のフレームタイプは、他のHTTP/2機能をサポートするために使用されます。

リクエストの多重化は、各HTTPリクエスト/レスポンス交換を独自のストリーム(セクション5)に関連付けることによって実現されます。ストリームはほぼ独立しているため、ブロックされたりストールしたりしたリクエストまたはレスポンスが他のストリームの進行を妨げることはありません。

多重化の効果的な使用は、フロー制御と優先順位付けに依存します。フロー制御(セクション5.2)は、受信者が処理できるものに送信されるデータを制限することにより、多重化されたストリームを効率的に使用できることを保証します。優先順位付け(セクション5.3)は、限られたリソースが最も効果的に使用されることを保証します。このHTTP/2の改訂版は、[RFC7540]の優先順位シグナリングスキームを非推奨にします。

接続で使用されるHTTPフィールドには大量の冗長データが含まれる可能性があるため、それらを含むフレームは圧縮されます(セクション4.3)。これは、一般的なケースでのリクエストサイズに特に有利な影響を与え、多くのリクエストを1つのパケットに圧縮できるようにします。

最後に、HTTP/2は、サーバーがクライアントにレスポンスをプッシュ(または「push」)できる新しいオプションの相互作用モードを追加します(セクション8.4)。これは、サーバーがクライアントが必要とすることを予測するデータをクライアントに投機的に送信できるようにすることを目的としており、潜在的な待ち時間の短縮と引き換えに一部のネットワーク使用量をトレードオフします。サーバーは、PUSH_PROMISEフレームとして送信するリクエストを合成することでこれを行います。その後、サーバーは、別のストリームで合成リクエストへのレスポンスを送信できます。

2.1. ドキュメントの構成

HTTP/2仕様は4つの部分に分かれています:

  • HTTP/2の開始(セクション3)は、HTTP/2接続がどのように開始されるかをカバーしています。

  • フレーム(セクション4)とストリーム(セクション5)レイヤーは、HTTP/2フレームが構造化され、多重化されたストリームに形成される方法を説明しています。

  • フレーム(セクション6)とエラー(セクション7)の定義には、HTTP/2で使用されるフレームタイプとエラータイプの詳細が含まれています。

  • HTTPマッピング(セクション8)と追加要件(セクション9)は、HTTPセマンティクスがフレームとストリームを使用してどのように表現されるかを説明しています。

フレームレイヤーとストリームレイヤーの概念の一部はHTTPから分離されていますが、この仕様は完全に汎用的なフレームレイヤーを定義していません。フレームレイヤーとストリームレイヤーは、HTTPのニーズに合わせて調整されています。

2.2. 規約と用語

このドキュメントのキーワード"MUST"、"MUST NOT"、"REQUIRED"、"SHALL"、"SHALL NOT"、"SHOULD"、"SHOULD NOT"、"RECOMMENDED"、"NOT RECOMMENDED"、"MAY"、および"OPTIONAL"は、BCP 14 [RFC2119] [RFC8174]に記載されているように解釈されるものとします。ただし、ここに示すようにすべて大文字で表示される場合に限ります。

すべての数値はネットワークバイトオーダーです。特に明記されていない限り、値は符号なしです。リテラル値は、必要に応じて10進数または16進数で提供されます。16進リテラルには、10進リテラルと区別するために"0x"が前に付けられます。

この仕様は、RFC 9000 [QUIC]のセクション1.3で説明されている規約を使用してバイナリフォーマットを記述しています。このフォーマットはネットワークバイトオーダーを使用し、高位ビットが低位ビットの前にリストされることに注意してください。

以下の用語が使用されます:

client: HTTP/2接続を開始するエンドポイント。クライアントはHTTPリクエストを送信し、HTTPレスポンスを受信します。

connection: 2つのエンドポイント間のトランスポート層接続。

connection error: HTTP/2接続全体を使用不可能にするエラー。

endpoint: 接続のクライアントまたはサーバーのいずれか。

frame: HTTP/2接続内の最小の通信単位。ヘッダーと、フレームタイプに従って構造化された可変長のオクテットのシーケンスで構成されます。

peer: エンドポイント。特定のエンドポイントを議論する際、"peer"は議論の主題から離れたエンドポイントを指します。

receiver: フレームを受信しているエンドポイント。

sender: フレームを送信しているエンドポイント。

server: HTTP/2接続を受け入れるエンドポイント。サーバーはHTTPリクエストを受信し、HTTPレスポンスを送信します。

stream: HTTP/2接続内のフレームの双方向フロー。

stream error: 個々のHTTP/2ストリームのエラー。

最後に、"gateway"、"intermediary"、"proxy"、および"tunnel"という用語は、[HTTP]のセクション3.7で定義されています。仲介者は、異なる時間にクライアントとサーバーの両方として機能します。

メッセージボディに適用される"content"という用語は、[HTTP]のセクション6.4で定義されています。