Skip to main content

7. HTTP Framing Layer (HTTP帧层)

HTTP帧在QUIC流上传输,如第6节所述。HTTP/3定义了三种流类型:控制流、请求流和推送流。本节描述HTTP/3帧格式及其允许的流类型;概述见表1。附录A.2提供了HTTP/2和HTTP/3帧之间的比较。

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

帧类型控制流请求流推送流章节
DATA7.2.1
HEADERS7.2.2
CANCEL_PUSH7.2.3
SETTINGS是(1)7.2.4
PUSH_PROMISE7.2.5
GOAWAY7.2.6
MAX_PUSH_ID7.2.7
Reserved7.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) 被接受并忽略。