Skip to main content

5. QUIC数据包

QUIC端点交换包含一个或多个QUIC数据包的UDP数据报。本节描述QUIC数据包的不变特性。QUIC的某个版本可能允许在单个UDP数据报中包含多个QUIC数据包,但不变属性仅描述数据报中的第一个数据包。

QUIC定义了两种类型的数据包报头:长报头和短报头。具有长报头的数据包由第一个字节的最高有效位设置为1来标识;具有短报头的数据包将该位清零。

QUIC数据包可能受到完整性保护,包括报头。但是,QUIC版本协商数据包不受完整性保护;参见第6节。

除了此处描述的值外,QUIC数据包的有效载荷是特定于版本的且长度任意。

5.1. 长报头

长报头采用图2所述的形式。

Long Header Packet {
Header Form (1) = 1,
Version-Specific Bits (7),
Version (32),
Destination Connection ID Length (8),
Destination Connection ID (0..2040),
Source Connection ID Length (8),
Source Connection ID (0..2040),
Version-Specific Data (..),
}

图2:QUIC长报头

具有长报头的QUIC数据包将第一个字节的高位设置为1。该字节中的所有其他位都是特定于版本的。

接下来的四个字节包括一个32位的版本字段。版本在第5.4节中描述。

下一个字节包含其后的目标连接ID字段的长度(以字节为单位)。此长度编码为8位无符号整数。目标连接ID字段跟随在目标连接ID长度字段之后,长度在0到255字节之间。连接ID在第5.3节中描述。

下一个字节包含其后的源连接ID字段的长度(以字节为单位)。此长度编码为8位无符号整数。源连接ID字段跟随在源连接ID长度字段之后,长度在0到255字节之间。

数据包的其余部分包含特定于版本的内容。

5.2. 短报头

短报头采用图3所述的形式。

Short Header Packet {
Header Form (1) = 0,
Version-Specific Bits (7),
Destination Connection ID (..),
Version-Specific Data (..),
}

图3:QUIC短报头

具有短报头的QUIC数据包将第一个字节的高位设置为0。

具有短报头的QUIC数据包在第一个字节之后立即包含目标连接ID。短报头不包括目标连接ID长度、源连接ID长度、源连接ID或版本字段。具有短报头的数据包中目标连接ID的长度未在数据包中编码,也不受本规范约束。

数据包的其余部分具有特定于版本的语义。

5.3. 连接ID

连接ID是任意长度的不透明字段。

连接ID的主要功能是确保较低协议层(UDP、IP及以下)的地址变化不会导致QUIC连接的数据包被传递到错误的QUIC端点。端点和支持它们的中间设备使用连接ID来确保每个QUIC数据包都能传递到端点的正确实例。在端点处,连接ID用于标识数据包所针对的QUIC连接。

连接ID由每个端点使用特定于版本的方法选择。同一QUIC连接的数据包可能使用不同的连接ID值。

5.4. 版本

版本字段包含一个4字节标识符。端点可以使用此值来标识QUIC版本。值为0x00000000的版本字段保留用于版本协商;参见第6节。所有其他值都是潜在有效的。

本文档中描述的属性适用于所有版本的QUIC。不符合本文档中描述的属性的协议不是QUIC。未来的文档可能会描述适用于特定QUIC版本或QUIC版本范围的其他属性。