Page 427 - 《软件学报》2024年第4期
P. 427
李彤 等: 传输控制中的确认机制研究 2005
Range). 除去最新的触发 SACK 的第 1 个 Range, 其他 Range 用历史的 Range 进行填充. 因此, SACK 机制中 ACK
构造时遵循以下 3 个原则: (a) 第 1 个 Range 需要指出是哪一个片段触发了 SACK 选项; (b) 尽可能多地把所有的
Range 填满; (c) SACK 要报告最近接收的不连续的 Range.
SACK 选项中, Type=5 表示这是选择确认 (SACK), 该字段占用一个字节. Length 表示 TCP 选项长度, 占用一
个字节, 左边界和右边界各占用 4 字节, 总共用掉了 10 字节. 每新增加一个 Range, 将占用 8 字节. 如图 12 所示头
部长度字段长 4 位, 所能表示的最大十进制为 15, 15×32/8 = 60, 故报文首部最大长度为 60 字节, 从而 TCP 选项字
段最大长度为 40 字节. 因此, SACK 选项最多携带 4 组 Range. 实际上, TCP 默认开启一些重要的 TCP 扩展选项
(如 Timestamp 选项, 占用 10 字节), 所以 SACK 通常最多携带 3 组 Range.
由于 TCP 选项字段的长度限制, 导致 SACK 携带的 Range 数量有限, 在极端网络丢包和抖动场景下, 收益有
限. 例如, 面对反向丢包时, 选择重传无法精确表达, 不必要的重传无法避免, 导致带宽浪费.
(3) D-SACK
RFC 2883 定义的 D-SACK (Duplicate SACK) 是对 SACK 选项的进一步扩展 [32] . D-SACK 规定接收方收到重
复数据报文时, SACK 选项的第 1 个 Range 用来传递最近接收到的重复报文的数据序号. 也就是说, 发送方根据
SACK 信息可得知哪些数据丢失了; 发送方根据 D-SACK 信息可得知哪些数据被重复接收了. 发送方根据 D-SACK
推测不必要的重传, 进而指导后续的丢包检测和重传等操作.
(4) Delayed ACK
TCP ACK, SACK, D-SACK 规定了 TCP 的确认机制中的类型和信息两大要素. 确认机制中的第 3 大要素——
触发条件, 则遵循 Delayed ACK 机制. Delayed ACK 最早由 RFC 1122 提出 [26] , 后面在 RFC 5681 中进行了更新 [27] .
Delayed ACK 机制规定满足以下任意一个条件时, 接收端需要发送一个 ACK 报文: (a) 每收到 2 个的数据报文 (报
文大小等于 MSS); (b) 每经过一个时钟周期, 且没有后续报文到达; (c) 出现乱序.
注意, 当出现乱序时, TCP 的 ACK 报文将携带 SACK 选项, 即 SACK 报文. 前面已对 Delayed ACK 进行了详
细地分析和讨论, 此处不再赘述.
3.2.2 QUIC 的确认机制
(1) QUIC 报文和帧
QUIC 报文 (packet) 由一个或多个帧 (frame) 组成 [33] . 报文是 QUIC 协议实现可靠传输的基本单位, 换句话说,
QUIC 报文丢失后, 其包含的所有帧都需要在后续的传输过程中重传. 为了实现多路复用, QUIC 规定同一个报文
中的多个帧可以来自不同的流 (stream), 且数据帧和控制帧 (如 ACK Frame) 可以包含在同一个报文中.
(2) QUIC ACK Frame
在 QUIC 中, 类型值为 0x02–0x03 的帧为 ACK Frame. QUIC 协议的确认机制基于 ACK Frame 进行实现.
ACK Frame 格式如下所示 [33] .
ACK Frame {
Type (i) = 0x02..0x03,
Largest Acknowledged (i),
ACK Delay (i),
ACK Range Count (i),
First ACK Range (i),
ACK Range (..) …,
[ECN Counts (..)],
}
其中, Type = 0x03 表示 ACK Frame 携带显式拥塞通知 (explicit congestion notification, ECN) 信息; Largest
Acknowledged 表示接收方确认的最大报文序号 (在 QUIC 中称为 packet number, 在本文中称为 PKT.SEQ); ACK