Skip to main content

6. 版本协商 (Version Negotiation)

接收到具有长包头且版本不理解或不支持的数据包的 QUIC 端点可能会发送版本协商数据包 (Version Negotiation Packet) 作为响应。具有短包头的数据包不会触发版本协商。

版本协商数据包设置第一个字节的高位,因此符合第 5.1 节中定义的具有长包头的数据包格式。版本协商数据包可以通过版本字段识别,该字段设置为 0x00000000。

Version Negotiation Packet {
Header Form (1) = 1,
Unused (7),
Version (32) = 0,
Destination Connection ID Length (8),
Destination Connection ID (0..2040),
Source Connection ID Length (8),
Source Connection ID (0..2040),
Supported Version (32) ...,
}

图 4: 版本协商数据包

版本协商数据包的第一个字节中,仅最高有效位具有任何定义的值。标记为 "Unused" (未使用) 的其余 7 位在发送时可以设置为任何值,并且在接收时必须 (MUST) 被忽略。

在源连接 ID 字段之后,版本协商数据包包含支持的版本字段 (Supported Version Fields) 列表,每个字段标识发送数据包的端点支持的一个版本。版本协商数据包不包含其他字段。端点必须 (MUST) 忽略不包含支持的版本字段或包含截断的支持的版本值的数据包。

版本协商数据包不使用完整性或机密性保护。特定的 QUIC 版本可能包括允许端点检测支持的版本集中的修改或损坏的协议元素。

端点必须 (MUST) 在目标连接 ID 字段中包含从其接收的数据包的源连接 ID 字段的值。源连接 ID 字段的值必须 (MUST) 从接收到的数据包的目标连接 ID 字段复制,该字段最初由客户端随机选择。回显两个连接 ID 给客户端一定程度的保证,即服务器接收到了数据包,并且版本协商数据包不是由无法观察数据包的攻击者生成的。

接收到版本协商数据包的端点可能会更改它决定用于后续数据包的版本。端点在何种条件下更改其 QUIC 版本将取决于它选择的 QUIC 版本。

有关支持 QUIC 版本 1 的端点如何生成和使用版本协商数据包的更详细描述,请参见 [QUIC-TRANSPORT]。