7. HTTPフレーミング層 (HTTP Framing Layer)
HTTPフレームは、セクション6で説明されているように、QUICストリーム上で運ばれます。HTTP/3は3つのストリームタイプを定義します:コントロールストリーム、リクエストストリーム、およびプッシュストリーム。このセクションでは、HTTP/3フレーム形式とそれらの許可されたストリームタイプについて説明します。概要については表1を参照してください。
表1:HTTP/3フレームとストリームタイプの概要
| フレーム | コントロールストリーム | リクエストストリーム | プッシュストリーム | セクション |
|---|---|---|---|---|
| DATA | 否 | 是 | 是 | 7.2.1 |
| HEADERS | 否 | 是 | 是 | 7.2.2 |
| CANCEL_PUSH | 是 | 否 | 否 | 7.2.3 |
| SETTINGS | 是(1) | 否 | 否 | 7.2.4 |
| PUSH_PROMISE | 否 | 是 | 否 | 7.2.5 |
| GOAWAY | 是 | 否 | 否 | 7.2.6 |
| MAX_PUSH_ID | 是 | 否 | 否 | 7.2.7 |
| Reserved | 是 | 是 | 是 | 7.2.8 |
SETTINGSフレームはコントロールストリームの最初のフレームとしてのみ発生できます。これは表1で(1)で示されています。
QUICフレームとは異なり、HTTP/3フレームは複数のパケットにまたがることができることに注意してください。
7.1. フレームレイアウト (Frame Layout)
すべてのフレームは次の形式を持ちます:
HTTP/3 Frame Format {
Type (i),
Length (i),
Frame Payload (..),
}
フレームには次のフィールドが含まれます:
- Type(タイプ):フレームタイプを識別する可変長整数
- Length(長さ):フレームペイロードのバイト長を記述する可変長整数
- Frame Payload(フレームペイロード):Typeフィールドによって決定されるセマンティクスを持つペイロード
各フレームのペイロードは、その説明で識別されたフィールドを正確に含まなければなりません (MUST)。追加のバイトを含むまたは早期に終了するフレームペイロードは、H3_FRAME_ERRORタイプの接続エラーとして扱わなければなりません (MUST)。
7.2. フレーム定義 (Frame Definitions)
7.2.1. DATA
DATAフレーム(type=0x00)は、HTTPリクエストまたはレスポンスコンテンツに関連する任意の可変長バイトシーケンスを伝達します。
DATAフレームはHTTPリクエストまたはレスポンスに関連付けられている必要があります (MUST)。コントロールストリームでDATAフレームを受信した場合、受信者はH3_FRAME_UNEXPECTEDタイプの接続エラーで応答しなければなりません (MUST)。
7.2.2. HEADERS
HEADERSフレーム(type=0x01)は、QPACKを使用してエンコードされたHTTPフィールドセクションを運ぶために使用されます。
HEADERSフレームは、リクエストストリームまたはプッシュストリームでのみ送信できます。コントロールストリームでHEADERSフレームを受信した場合、受信者はH3_FRAME_UNEXPECTEDタイプの接続エラーで応答しなければなりません (MUST)。
7.2.3. CANCEL_PUSH
CANCEL_PUSHフレーム(type=0x03)は、プッシュストリームを受信する前にサーバープッシュのキャンセルを要求するために使用されます。
クライアントがCANCEL_PUSHフレームを送信するとき、約束されたリソースを受信したくないことを示しています。サーバーはリソースの送信を中止すべきです (SHOULD)。
CANCEL_PUSHフレームはコントロールストリームで送信されます。リクエストストリームまたはプッシュストリームでCANCEL_PUSHフレームを受信することは、H3_FRAME_UNEXPECTEDタイプの接続エラーとして扱わなければなりません (MUST)。
7.2.4. SETTINGS
SETTINGSフレーム(type=0x04)は、エンドポイントがどのように通信するかに影響を与える設定パラメータを伝達します。
SETTINGSフレームは、各コントロールストリームの最初のフレームとして送信されなければなりません (MUST)。SETTINGSフレームは他のストリームで送信してはなりません (MUST NOT)。
定義された設定識別子:
- SETTINGS_MAX_FIELD_SECTION_SIZE (0x06):フィールドセクションの最大サイズ
- SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x01):QPACK関連設定
- SETTINGS_QPACK_BLOCKED_STREAMS (0x07):QPACK関連設定
7.2.5. PUSH_PROMISE
PUSH_PROMISEフレーム(type=0x05)は、リクエストストリームでサーバーからクライアントへ約束されたリクエストヘッダーフィールドセクションを運ぶために使用されます。
PUSH_PROMISEフレームはリクエストストリームでのみ送信できます。コントロールストリームまたはプッシュストリームでPUSH_PROMISEフレームを受信することは、H3_FRAME_UNEXPECTEDタイプの接続エラーとして扱わなければなりません (MUST)。
7.2.6. GOAWAY
GOAWAYフレーム(type=0x07)は、接続のグレースフルシャットダウンを開始するために使用されます。
GOAWAYフレームは常にコントロールストリームで送信されます。リクエストストリームまたはプッシュストリームでGOAWAYフレームを受信することは、H3_FRAME_UNEXPECTEDタイプの接続エラーとして扱わなければなりません (MUST)。
7.2.7. MAX_PUSH_ID
MAX_PUSH_IDフレーム(type=0x0d)は、クライアントがサーバーが開始できるサーバープッシュの数を制御するために使用されます。
MAX_PUSH_IDフレームは常にコントロールストリームで送信されます。サーバーはMAX_PUSH_IDフレームを送信してはなりません (MUST NOT)。
7.2.8. 予約フレームタイプ (Reserved Frame Types)
形式0x1f * N + 0x21(Nは非負整数)のフレームタイプは、未知のタイプを無視する要件を行使するために予約されています。これらのフレームにはセマンティクスがなく、任意のストリームで送信できます。