Skip to main content

6. 版本协商

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

版本协商数据包设置第一个字节的高位,因此符合第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字段之后,版本协商数据包包含一个支持版本字段列表,每个字段标识发送数据包的端点支持的一个版本。版本协商数据包不包含其他字段。端点必须(MUST)忽略不包含支持版本字段或包含截断的支持版本值的数据包。

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

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

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

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