7. HTTP Framing Layer (HTTP帧层)
HTTP帧在QUIC流上传输,如第6节所述。HTTP/3定义了三种流类型:控制流、请求流和推送流。本节描述HTTP/3帧格式及其允许的流类型;概述见表1。附录A.2提供了HTTP/2和HTTP/3帧之间的比较。
表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) 恰好包含其描述中标识的字段。包含额外字节或提前终止的帧有效载荷必须 (MUST) 被视为类型为H3_FRAME_ERROR的连接错误。特别是,冗余长度编码必须 (MUST) 被验证为自洽的。
当流干净地终止时,如果流上的最后一个帧被截断,这必须 (MUST) 被视为类型为H3_FRAME_ERROR的连接错误。突然终止的流可能在帧的任何点被重置。
7.2. Frame Definitions (帧定义)
7.2.1. DATA
DATA帧(type=0x00)传送与HTTP请求或响应内容相关的任意可变长度字节序列。
DATA帧必须 (MUST) 与HTTP请求或响应相关联。如果在控制流上接收到DATA帧,接收方必须 (MUST) 以类型为H3_FRAME_UNEXPECTED的连接错误响应。
DATA Frame {
Type (i) = 0x00,
Length (i),
Data (..),
}
7.2.2. HEADERS
HEADERS帧(type=0x01)用于携带使用QPACK编码的HTTP字段段。
HEADERS Frame {
Type (i) = 0x01,
Length (i),
Encoded Field Section (..),
}
HEADERS帧只能在请求流或推送流上发送。如果在控制流上接收到HEADERS帧,接收方必须 (MUST) 以类型为H3_FRAME_UNEXPECTED的连接错误响应。
7.2.3. CANCEL_PUSH
CANCEL_PUSH帧(type=0x03)用于在接收推送流之前请求取消服务器推送。
CANCEL_PUSH Frame {
Type (i) = 0x03,
Length (i),
Push ID (i),
}
当客户端发送CANCEL_PUSH帧时,表示不希望接收承诺的资源。服务器应该 (SHOULD) 中止发送资源。无论推送流是否已打开,当服务器确定承诺不会被履行时,都应该 (SHOULD) 发送CANCEL_PUSH帧。
CANCEL_PUSH帧在控制流上发送。在请求流或推送流上接收CANCEL_PUSH帧必须 (MUST) 被视为类型为H3_FRAME_UNEXPECTED的连接错误。
7.2.4. SETTINGS
SETTINGS帧(type=0x04)传达影响端点如何通信的配置参数,例如对对等行为的偏好和约束。
SETTINGS Frame {
Type (i) = 0x04,
Length (i),
Setting (..),
}
SETTINGS帧必须 (MUST) 作为每个控制流的第一个帧发送。SETTINGS帧禁止 (MUST NOT) 在任何其他流上发送。
SETTINGS帧包含零个或多个设置。每个设置由设置标识符和值组成,都编码为QUIC可变长度整数。
定义的设置标识符包括:
-
SETTINGS_MAX_FIELD_SECTION_SIZE (0x06):默认值没有限制。该值通知对等方发送方准备接受的字段段的最大大小(以字节为单位)。
-
SETTINGS_QPACK_MAX_TABLE_CAPACITY (0x01):QPACK相关设置。
-
SETTINGS_QPACK_BLOCKED_STREAMS (0x07):QPACK相关设置。
接收到相同设置标识符多次的SETTINGS帧必须 (MUST) 被视为类型为H3_SETTINGS_ERROR的连接错误。
7.2.5. PUSH_PROMISE
PUSH_PROMISE帧(type=0x05)用于在请求流上从服务器到客户端携带承诺的请求头字段段。
PUSH_PROMISE Frame {
Type (i) = 0x05,
Length (i),
Push ID (i),
Encoded Field Section (..),
}
PUSH_PROMISE帧只能在请求流上发送。在控制流或推送流上接收PUSH_PROMISE帧必须 (MUST) 被视为类型为H3_FRAME_UNEXPECTED的连接错误。
7.2.6. GOAWAY
GOAWAY帧(type=0x07)用于启动连接的优雅关闭。
GOAWAY Frame {
Type (i) = 0x07,
Length (i),
Stream ID/Push ID (i),
}
GOAWAY帧始终在控制流上发送。在请求流或推送流上接收GOAWAY帧必须 (MUST) 被视为类型为H3_FRAME_UNEXPECTED的连接错误。
7.2.7. MAX_PUSH_ID
MAX_PUSH_ID帧(type=0x0d)由客户端用于控制服务器可以发起的服务器推送数量。
MAX_PUSH_ID Frame {
Type (i) = 0x0d,
Length (i),
Push ID (i),
}
MAX_PUSH_ID帧始终在控制流上发送。在请求流或推送流上接收MAX_PUSH_ID帧必须 (MUST) 被视为类型为H3_FRAME_UNEXPECTED的连接错误。
服务器禁止 (MUST NOT) 发送MAX_PUSH_ID帧。客户端必须 (MUST) 将服务器发送的MAX_PUSH_ID帧视为类型为H3_FRAME_UNEXPECTED的连接错误。
7.2.8. Reserved Frame Types (保留帧类型)
格式为 0x1f * N + 0x21(N为非负整数)的帧类型被保留以行使忽略未知类型的要求。这些帧没有语义,可以在任何流上发送。
帧的有效载荷和长度由实现任意选择。接收到保留帧类型的帧必须 (MUST) 被接受并忽略。