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
   422   423   424   425   426   427   428   429   430   431   432