Skip to main content

7. HTTP 帧层 (HTTP Framing Layer)

HTTP 帧在 QUIC 流上携带, 如第 6 节所述。HTTP/3 定义了三种流类型: 控制流、请求流和推送流。本节描述 HTTP/3 帧格式及其允许的流类型; 参见表 1 的概述。

表 1: HTTP/3 帧和流类型概述

帧类型 (Frame)控制流 (Control Stream)请求流 (Request Stream)推送流 (Push Stream)章节 (Section)
DATANoYesYes7.2.1
HEADERSNoYesYes7.2.2
CANCEL_PUSHYesNoNo7.2.3
SETTINGSYes (1)NoNo7.2.4
PUSH_PROMISENoYesNo7.2.5
GOAWAYYesNoNo7.2.6
MAX_PUSH_IDYesNoNo7.2.7
ReservedYesYesYes7.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 字段确定

每个帧的有效负载必须恰好包含其描述中标识的字段。包含标识字段之后的额外字节或在标识字段结束之前终止的帧有效负载必须被视为类型为 H3_FRAME_ERROR 的连接错误。

7.2. 帧定义 (Frame Definitions)

7.2.1. DATA

DATA 帧 (type=0x00) 传送与 HTTP 请求或响应内容关联的任意可变长度字节序列。

DATA 帧必须与 HTTP 请求或响应关联。如果在控制流上接收到 DATA 帧, 接收方必须以类型为 H3_FRAME_UNEXPECTED 的连接错误响应。

7.2.2. HEADERS

HEADERS 帧 (type=0x01) 用于携带使用 QPACK 编码的 HTTP 字段段。

HEADERS 帧只能在请求流或推送流上发送。如果在控制流上接收到 HEADERS 帧, 接收方必须以类型为 H3_FRAME_UNEXPECTED 的连接错误响应。

7.2.3. CANCEL_PUSH

CANCEL_PUSH 帧 (type=0x03) 用于在接收推送流之前请求取消服务器推送。

当客户端发送 CANCEL_PUSH 帧时, 它表示不希望接收承诺的资源。服务器应当中止发送资源。

CANCEL_PUSH 帧在控制流上发送。在请求流或推送流上接收 CANCEL_PUSH 帧必须被视为类型为 H3_FRAME_UNEXPECTED 的连接错误。

7.2.4. SETTINGS

SETTINGS 帧 (type=0x04) 传送影响端点通信方式的配置参数。

SETTINGS 帧必须作为每个控制流的第一帧发送。SETTINGS 帧禁止在任何其他流上发送。

定义的设置标识符包括:

  • 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 的连接错误。

7.2.6. GOAWAY

GOAWAY 帧 (type=0x07) 用于发起连接的优雅关闭。

GOAWAY 帧始终在控制流上发送。在请求流或推送流上接收 GOAWAY 帧必须被视为类型为 H3_FRAME_UNEXPECTED 的连接错误。

7.2.7. MAX_PUSH_ID

MAX_PUSH_ID 帧 (type=0x0d) 由客户端用于控制服务器可以发起的服务器推送数量。

MAX_PUSH_ID 帧始终在控制流上发送。服务器禁止发送 MAX_PUSH_ID 帧。

7.2.8. 保留帧类型 (Reserved Frame Types)

格式为 0x1f * N + 0x21 (对于非负整数值 N) 的帧类型被保留, 以行使忽略未知类型的要求。这些帧没有语义, 并且可以在任何流上发送。