19. 帧类型和格式
19. 帧类型和格式 (Frame Types and Formats)
如第 12.4 节所述, 数据包包含一个或多个 frames. 本节描述核心 QUIC frame types 的格式和语义.
19.1 PADDING Frames
PADDING frame (type=0x00) 没有语义值. PADDING frames 可用于增加数据包大小. Padding 可用于将 Initial packet 增加到所需的最小大小, 或为受保护的数据包提供针对流量分析的保护.
19.2 PING Frames
端点可以使用 PING frames (type=0x01) 验证其对端是否仍然存活, 或检查到对端的可达性. PING frame 不包含额外字段.
19.3 ACK Frames
接收方发送 ACK frames (types 0x02 and 0x03), 用于告知发送方它们已经接收并处理的数据包. ACK frame 包含一个或多个 ACK Ranges. ACK Ranges 标识已确认的数据包.
19.3.1 ACK Ranges
每个 ACK Range 由按 packet number 降序交替出现的 Gap 和 ACK Range Length 值组成.
19.3.2 ECN Counts
ACK frame 使用最低有效位 (即 type 0x03) 指示 ECN 反馈, 并报告已接收的 QUIC 数据包, 这些数据包在其 IP header 中带有关联的 ECT(0), ECT(1), 或 CE ECN codepoints.
19.4 RESET_STREAM Frames
端点使用 RESET_STREAM frame (type=0x04) 突然终止 stream 的发送部分.
19.5 STOP_SENDING Frames
端点使用 STOP_SENDING frame (type=0x05) 表示根据应用请求, 传入数据在接收时即被丢弃.
19.6 CRYPTO Frames
CRYPTO frame (type=0x06) 用于传输加密握手消息. 除 0-RTT 外, 它可以在所有 packet types 中发送.
19.7 NEW_TOKEN Frames
服务器发送 NEW_TOKEN frame (type=0x07), 向客户端提供一个 token, 供客户端在未来连接的 Initial packet header 中发送.
19.8 STREAM Frames
STREAM frames 隐式创建一个 stream 并携带 stream data. STREAM frame 采用 0b00001XXX 形式 (即从 0x08 到 0x0f 的值集合).
19.9 MAX_DATA Frames
MAX_DATA frame (type=0x10) 用于流量控制, 告知对端可在整个连接上发送的数据总量上限.
19.10 MAX_STREAM_DATA Frames
MAX_STREAM_DATA frame (type=0x11) 用于流量控制, 告知对端可在一个 stream 上发送的数据量上限.
19.11 MAX_STREAMS Frames
MAX_STREAMS frame (type=0x12 or 0x13) 告知对端允许其打开的给定类型 streams 的累计数量.
19.12 DATA_BLOCKED Frames
当发送方希望发送数据但因连接级流量控制而无法发送时, SHOULD 发送 DATA_BLOCKED frame (type=0x14).
19.13 STREAM_DATA_BLOCKED Frames
当发送方希望发送数据但因 stream 级流量控制而无法发送时, SHOULD 发送 STREAM_DATA_BLOCKED frame (type=0x15).
19.14 STREAMS_BLOCKED Frames
当发送方希望打开 stream 但因其对端设置的最大 stream 限制而无法打开时, SHOULD 发送 STREAMS_BLOCKED frame (type=0x16 or 0x17).
19.15 NEW_CONNECTION_ID Frames
端点发送 NEW_CONNECTION_ID frame (type=0x18), 向其对端提供可替代的 connection IDs, 这些 ID 可在连接迁移时用于打破可关联性.
19.16 RETIRE_CONNECTION_ID Frames
端点发送 RETIRE_CONNECTION_ID frame (type=0x19), 表示它将不再使用其对端签发的某个 connection ID.
19.17 PATH_CHALLENGE Frames
端点可以使用 PATH_CHALLENGE frames (type=0x1a) 检查到对端的可达性, 并在连接迁移期间进行路径验证.
19.18 PATH_RESPONSE Frames
PATH_RESPONSE frame (type=0x1b) 作为对 PATH_CHALLENGE frame 的响应发送.
19.19 CONNECTION_CLOSE Frames
端点发送 CONNECTION_CLOSE frame (type=0x1c or 0x1d), 通知其对端连接正在关闭. type 为 0x1c 的 CONNECTION_CLOSE frame 用于指示 QUIC 层的错误或无错误. type 为 0x1d 的 CONNECTION_CLOSE frame 用于指示使用 QUIC 的应用发生错误.
19.20 HANDSHAKE_DONE Frames
服务器使用 HANDSHAKE_DONE frame (type=0x1e) 向客户端指示握手确认.
19.21 扩展 Frames
QUIC frames 不使用自描述编码. 因此, 端点需要理解所有 frames 的语法, 才能成功处理数据包. 这允许对 frames 进行高效编码, 但也意味着端点不能发送其对端未知类型的 frame.
希望使用新 frame 类型的 QUIC 扩展 MUST 首先确保对端能够理解该 frame. 端点可以使用 transport parameter 来表示其愿意接收 extension frame types.