5. QUIC数据包 (QUIC Packets)
QUIC 端点交换包含一个或多个 QUIC 数据包的 UDP 数据报。本节描述 QUIC 数据包的不变特性。QUIC 的某个版本可以允许在单个 UDP 数据报中包含多个 QUIC 数据包,但不变属性仅描述数据报中的第一个数据包。
QUIC 定义了两种类型的数据包包头 (Packet Headers): 长包头 (Long Header) 和短包头 (Short Header)。具有长包头的数据包通过第一个字节的最高有效位 (Most Significant Bit) 被设置为 1 来识别; 具有短包头的数据包该位被清零。
QUIC 数据包可能受完整性保护 (Integrity Protected),包括包头。但是, QUIC 版本协商数据包 (Version Negotiation Packets) 不受完整性保护; 参见第 6 节。
除了此处描述的值之外, QUIC 数据包的载荷 (Payload) 是版本特定的 (Version-Specific) 且长度任意 (Arbitrary Length)。
5.1 长包头 (Long Header)
长包头采用图 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 位的版本字段 (Version Field)。版本在第 5.4 节中描述。
下一个字节包含其后的目标连接 ID 字段 (Destination Connection ID Field) 的字节长度。该长度编码为 8 位无符号整数。目标连接 ID 字段跟随目标连接 ID 长度字段,长度在 0 到 255 字节之间。连接 ID 在第 5.3 节中描述。
下一个字节包含其后的源连接 ID 字段 (Source Connection ID Field) 的字节长度。该长度编码为 8 位无符号整数。源连接 ID 字段跟随源连接 ID 长度字段,长度在 0 到 255 字节之间。
数据包的其余部分包含版本特定的内容。
5.2 短包头 (Short Header)
短包头采用图 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 长度 (Destination Connection ID Length)、源连接 ID 长度 (Source Connection ID Length)、源连接 ID 或版本 (Version) 字段。具有短包头的数据包中目标连接 ID 的长度未在数据包中编码,并且不受本规范的约束。
数据包的其余部分具有版本特定的语义。
5.3 连接ID (Connection ID)
连接 ID (Connection ID) 是任意长度的不透明字段 (Opaque Field)。
连接 ID 的主要功能是确保较低协议层 (UDP、IP 及以下) 的寻址变化不会导致 QUIC 连接的数据包被传递到错误的 QUIC 端点。连接 ID 由端点和支持它们的中间设备 (Intermediaries) 使用,以确保每个 QUIC 数据包能够被传递到端点的正确实例。在端点处,连接 ID 用于标识数据包所属的 QUIC 连接。
连接 ID 由每个端点使用版本特定的方法选择。同一 QUIC 连接的数据包可能使用不同的连接 ID 值。
5.4 版本 (Version)
版本字段 (Version Field) 包含一个 4 字节标识符。该值可以被端点用于标识 QUIC 版本。值为 0x00000000 的版本字段保留用于版本协商; 参见第 6 节。所有其他值都可能有效。
本文档中描述的属性适用于 QUIC 的所有版本。不符合本文档中描述的属性的协议不是 QUIC。未来的文档可能描述适用于特定 QUIC 版本或一系列 QUIC 版本的附加属性。