跳到主要内容

12. 数据包与帧

12. 数据包与帧

QUIC endpoint 通过交换 packet 进行通信. packet 具有机密性和完整性保护 (见第 12.1 节), 并承载于 UDP datagram 中 (见第 14 节).

此 version 的 QUIC 在连接建立期间使用 long packet header (第 17.2 节). 带有 long header 的 packet 包括 Initial (第 17.2.2 节), 0-RTT (第 17.2.3 节), Handshake (第 17.2.4 节), 以及 Retry (第 17.2.5 节). version negotiation 使用带有 long header 的 version-independent packet (第 17.2.1 节).

带有 short header 的 packet (第 17.3 节) 设计为具有最小开销, 并在连接建立且 1-RTT key 可用之后使用.

12.1 受保护的 Packet

QUIC packet 根据 packet 类型具有不同级别的密码保护. 第 17 节概述了 packet 类型及其保护级别.

12.2 合并 Packet

Initial (第 17.2.2 节), 0-RTT (第 17.2.3 节), 以及 Handshake (第 17.2.4 节) packet 包含 Length 字段, 该字段确定 packet 的结束位置. 该长度同时包括 Packet Number 和 Payload 字段, 这两个字段均受机密性保护且最初未知. 一旦移除 packet protection, 即可获知 Payload 字段的长度.

使用 Length 字段, 发送方可以将多个 QUIC packet 合并到一个 UDP datagram 中. 这可以减少完成密码握手并开始发送数据所需的 UDP datagram 数量. 接收方 MUST 能够处理合并的 packet.

12.3 Packet Number

packet number 是范围为 0 到 2^62-1 的整数. 在 QUIC 中, packet number 被划分为三个空间:

  • Initial 空间: 所有 Initial packet (第 17.2.2 节) 都在此空间中.
  • Handshake 空间: 所有 Handshake packet (第 17.2.4 节) 都在此空间中.
  • Application data 空间: 所有 0-RTT (第 17.2.3 节) 和 1-RTT (第 17.3.1 节) packet 都在此空间中.

每个空间中的 packet number 都从 packet number 0 开始. 在同一 packet number space 中发送的后续 packet MUST 将 packet number 至少增加 1.

12.4 帧与帧类型

移除 packet protection 后, QUIC packet 的 payload 由一系列完整 frame 组成, 如图 13 所示. Version Negotiation, Stateless Reset, 以及 Retry packet 不包含 frame.

Packet Payload {
Frame (8..),
...
}

图 13: QUIC Payload

包含 frame 的 packet 的 payload MUST 至少包含一个 frame, 并且 MAY 包含多个 frame 和多种 frame type. endpoint MUST 将收到不包含 frame 的 packet 视为类型为 PROTOCOL_VIOLATION 的 connection error. frame 始终完整地放在单个 QUIC packet 内, 不能跨越多个 packet.

每个 frame 都以 Frame Type 开始, 用于指示其类型, 后跟额外的类型相关字段:

Frame {
Frame Type (i),
Type-Dependent Fields (..),
}

图 14: 通用 Frame 布局

12.5 Frame 与编号空间

某些 frame 在不同 packet number space 中被禁止使用. 第 17 节描述了哪些 frame 可以出现在哪些 packet type 中的规则, 表 3 对此进行了汇总.

Frame TypeInitial0-RTTHandshake1-RTT
PADDINGYYYY
PINGYYYY
ACKY-YY
RESET_STREAM-Y-Y
STOP_SENDING-Y-Y
CRYPTOY-YY
NEW_TOKEN---Y
STREAM-Y-Y
MAX_DATA-Y-Y
MAX_STREAM_DATA-Y-Y
MAX_STREAMS-Y-Y
DATA_BLOCKED-Y-Y
STREAM_DATA_BLOCKED-Y-Y
STREAMS_BLOCKED-Y-Y
NEW_CONNECTION_ID-Y-Y
RETIRE_CONNECTION_ID---Y
PATH_CHALLENGE-Y-Y
PATH_RESPONSE---Y
CONNECTION_CLOSEYYYY
HANDSHAKE_DONE---Y

表 3: Frame 与 Packet Number Space