跳到主要内容

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