关于 QUIC 的一些个人理解
作者:互联网
RFC_8999: QUIC 的版本无关属性
QUIC 长包头
格式:
1 Long Header Packet { 2 Header Form (1) = 1, 3 Version-Specific Bits (7), 4 Version (32), 5 Destination Connection ID Length (8), 6 Destination Connection ID (0..2040), 7 Source Connection ID Length (8), 8 Source Connection ID (0..2040), 9 Version-Specific Data (..), 10 }
图示:
解析:
Header Form(首部形式):
-
- 长度:1 位
- 值:1
- 用于区分包的类型。
Version-Specific Bits(特定于版本的位):
-
- 长度:7 位
- 值特定于版本
Version(版本):
-
- 长度:32 位(4 字节)
- QUIC 端点可以使用此值来标识 QUIC 版本。
- 值为 0x00000000 的 Version 字段保留用于版本协商,所有其他值都可能有效。
- 当一个 QUIC 端点接收到一个带有长包头和一个它不理解或不支持的版本的数据包时,可能会发送一个版本协商数据包作为响应。
Destination Connection ID Length(目标连接 ID 长度):
-
- 长度:8 位
- 无符号整型
- 定义了目标连接 ID 字段(Destination Connection ID)的字节长度。
Destination Connection ID(目标连接 ID):
-
- 长度:0 ~ 2040 位(即 0 ~ 255 字节)
- 不透明
- 连接 ID 的主要功能是确保较低协议层(UDP、IP 及以下)的寻址更改不会导致 QUIC 连接的数据包被传送到错误的 QUIC 端点。
- 端点和支持它们的中介使用连接 ID 来确保每个 QUIC 数据包都可以传递到端点的正确实例。
- 每个端点使用特定于版本的方法选择连接 ID,同一 QUIC 连接的数据包可能使用不同的连接 ID。
Source Connection ID Length(源连接 ID 长度):
-
- 长度:8 位
- 无符号整型
- 定义了源的连接 ID 字段(Source Connection ID)的字节长度。
Source Connection ID(源连接 ID):
-
- 长度:0 ~ 2040 位
- 不透明
Version-Specific Data(特定于版本的数据):
-
- 长度:任意
- 包含特定于版本的内容
QUIC 短包头
格式:
1 Short Header Packet { 2 Header Form (1) = 0, 3 Version-Specific Bits (7), 4 Destination Connection ID (..), 5 Version-Specific Data (..), 6 }
图示:
解析:
Header Form(首部形式):
-
- 长度:1 位
- 值:1
- 用于区分包的类型。
Version-Specific Bits(特定于版本的位):
-
- 长度:7 位
- 值特定于版本
Destination Connection ID(目标连接 ID):
-
- 长度:0 ~ 2040 位(即 0 ~ 255 字节)
- 不透明
Version-Specific Data(特定于版本的数据):
-
- 长度:任意
- 包含特定于版本的内容
QUIC 版本协商包
格式:
1 Version Negotiation Packet { 2 Header Form (1) = 1, 3 Unused (7), 4 Version (32) = 0, 5 Destination Connection ID Length (8), 6 Destination Connection ID (0..2040), 7 Source Connection ID Length (8), 8 Source Connection ID (0..2040), 9 Supported Version (32) ..., 10 }
图示:
解析:
版本协商包可以看作长包头的实例。
Header Form(首部形式):
-
- 长度:1 位
- 值:1
- 用于区分包的类型。
Unused(未使用):
-
- 长度:7 位
- 在发送时可置为任意值,在接受时必须忽略。
Version(版本):
-
- 长度:32 位(4 字节)
- 值:0x00000000(全部置 0)
Destination Connection ID Length(目标连接 ID 长度):
-
- 长度:8 位
- 无符号整型
- 定义了目标连接 ID 字段(Destination Connection ID)的字节长度。
Destination Connection ID(目标连接 ID):
-
- 长度:0 ~ 2040 位(即 0 ~ 255 字节)
- 不透明
Source Connection ID Length(源连接 ID 长度):
-
- 长度:8 位
- 无符号整型
- 定义了源的连接 ID 字段(Source Connection ID)的字节长度。
Source Connection ID(源连接 ID):
-
- 长度:0 ~ 2040 位
- 不透明
- 端点必须使用接收到的分组的源连接 ID 作为自己的目标连接 ID。
- 端点必须使用接收到的分组的目标连接 ID 作为自己的源连接 ID,该字段最初由客户端随机选择。
- 由于连接 ID 不透明,故通过回显源连接 ID 和目标连接 ID,客户端可以确保服务器收到了包,并且确保版本协商包不是由无法观察包的攻击者生成的。
- 接收到版本协商包的端点可能会更改其决定用于后续分组的 QUIC 版本。端点更改其 QUIC 版本的条件将取决于它选择的 QUIC 版本。
Supported Version(支持的版本):
-
- 长度:32 位,该字段可重复多次
- 包含支持版本字段的列表,每个字段标识发送数据包的端点所支持的版本。
- 版本协商包不包含其他字段。端点必须忽略不包含 Supported Version 字段或包含截断的 Supported Version 值的数据包。
- 版本协商数据包不使用完整性或机密性保护。特定的 QUIC 版本可能包含协议元素,允许端点在支持的版本中集中检测修改或损坏。
安全和隐私
中间盒可能会观察到特定版本的 QUIC 的特征,并假设当其他版本的 QUIC 表现出类似的特征时,表达的是相同的潜在语义。
在 QUIC 版本1中,已经做出了一些努力来消除或掩盖一些可观察到的特征,但许多这些特征仍然存在。
其他 QUIC 版本可能会做出不同的设计决定,因此显示出不同的特点。
QUIC 版本号并不出现在所有 QUIC 包中,这意味着根据版本特定的特征从流中可靠地提取信息需要中间盒保留它们看到的每个连接ID的状态。本文档(RFC 8999)中描述的版本协商包不受完整性保护;它只对攻击者的插入提供适度的保护。
如果端点因此尝试了不同的 QUIC 版本,则它必须验证版本协商数据包的语义内容。
【未完待续】
标签:Version,QUIC,个人,Connection,理解,版本,长度,ID 来源: https://www.cnblogs.com/EnddleRD/p/16034103.html