Page 432 - 《软件学报》2024年第4期
P. 432

2010                                                       软件学报  2024  年第  35  卷第  4  期


                    基于  TACK  机制的传输协议, 原则上可以摒弃传统的滑动窗口机制, 而替代以一种无食言                         (No Reneging) 机
                 制. No Reneging  机制是一种缓存管理机制, 它要求接收方不能将接收缓存中的已成功接收的数据报文丢弃. 那么,
                 为什么   TCP  要采用滑动窗口机制而不采用缓存管理机制呢? 本质的原因就在于                     TCP  报文被成功接收后, 接收方
                 是可以将不连续的数据报文丢弃的, 也就是说, TCP              是可食言的. 滑动窗口机制要求左边界的报文确认后才能滑
                 动, 而  No Reneging  缓存管理机制只要有新的已接收数据报文得到确认, 就可以继续发送报文. 根据发送窗口的定
                 义, 发送窗口大小被限制为不超过拥塞窗口和接收窗口的较小值. 其中, 接收窗口通过                          ACK  报文由接收方反馈给
                 发送方. No Reneging  机制下剩余可发送数据量的更新策略为:            发送窗口−在接收缓存中的已确认数据量 .
                    值得一提的是, 当原始数据包         K  丢失后, 发送方会将需要重传的数据报文放到待发送队列, 重新编号                    (比如数
                 据报文   K+i) 后重新发送给接收方. 由于使用了单调递增的              PKT.SEQ, 传输控制对重传报文的处理跟原始报文的
                 处理完全相同. 因此, 基于      TACK  机制的传输协议, 在数据报文的处理逻辑方面比               TCP  相对简单.
                    (3) QUIC  相关机制
                    QUIC  协议同样采用了      No Reneging  缓存管理机制, 因此, QUIC  也采用了区别于传统滑动窗口的机制, 从而
                 克服  HoLB  问题. 并且, QUIC  协议同样采用了与      TACK  机制类似的双     SEQ  机制. 具体地, QUIC 使用单调递增的
                 packet number 来记录每个报文的发送顺序, 同样根据           packet number 的乱序来检测丢包事件. TACK       机制使用
                 DATA.SEQ  来确认重传报文和原始报文的内容是否一致, 而在               QUIC  协议中, 使用数据流标识       (Stream ID) 作为数
                 据报文多路复用传输到接收方后能正常组装的依据. 重传报文和原始报文单靠                          Stream ID 的比对无法判断两个数
                 据报文内容一致. 因此, QUIC      协议在每个数据报文中增加          stream offset 字段, 标识当前数据报文在当前      Stream ID
                 中的字节偏移量, 从而指导数据的有序组装. 换句话说, QUIC                协议中的    Packet Number 等价于  TACK  机制中的
                 PKT.SEQ, QUIC  协议中的  stream offset 等价于  TACK  机制中的  DATA.SEQ.
                  4.2   机制对比和分析
                  4.2.1    TACK  与  SACK
                    TCP  的  ACK  报文可以携带   SACK  选项, 也称  SACK  报文. SACK  选项由数据接收方发送, 以通知数据发送方
                 已经接收、并且在接收方接收缓存中排队的非连续数据区间                      (Range). 这些区间信息可以帮助发送方识别已经传
                 输成功的数据, 避免不必要的重传. 由于           TCP  选项字段的长度限制, 导致       SACK  携带的区间数量有限, 面对反向丢
                 包时, 选择重传无法精确表达, 不必要的重传无法避免, 导致带宽浪费.
                    SACK  选项字段长度受限的原因, 是因为           TCP  需要支持  ACK Piggybacking  机制, 所以  SACK  选项字段只能
                 放在有限的报文头部. 如前面介绍的, ACK Piggybacking         能够间接地减少      ACK  报文的数目. 然而, 当应用      TACK
                 机制时, ACK  数目通常已经足够小. 因此, 基于         TACK  机制的传输控制, 可以考虑不支持          ACK Piggybacking  机制.
                 在这种情况下, 除了在报文头部可以携带区间信息以外, 还可以让                    ACK  报文自带数据部分, 该数据部分并不是真
                 正的数据, 而是用于反馈控制的         Range 信息.
                  4.2.2    TACK  与  HACK
                    为了提高    IEEE 802.11  无线链路的传输性能, Salameh 等人提出了      HACK (hierarchical ACK) [36] . HACK  通过改
                 变  Wi-Fi 介质访问控制   (MAC), 在链路层   ACK  报文中携带    TCP ACK  原本需要反馈的信息, 去掉了        TCP ACK  对
                 频谱资源的需求, 从而提高        TCP  的性能. 下面从   3  个方面来讨论   TACK  和  HACK  的区别.
                    第一, TACK  减少了端到端的      ACK  报文数目, 而   HACK  只减少了无线链路上的        ACK  报文数目. 因此, TACK
                 在减少   ACK  开销这方面更为通用, 可用于解决非对称网络中              ACK  路径拥塞的问题     [37]  .
                    第二, HACK  要求修改网卡, 但不需要修改         TCP; TACK  要求修改   TCP, 但不需要修改网卡.
                    第三, 由于链路层      ACK  和传输层   ACK  的触发时间通常是异步的, 所以         HACK  很可能会导致     ACK  延迟. 因
                 此, HACK  不能解决传输方面的挑战, 如丢包恢复延迟大、时延评估偏差、流量突发和接收窗口通告延迟等.
                  4.2.3    TACK  与  RACK
                    TACK  是为了减少    ACK  数目, 但是又不影响协议性能的一种传输协议确认机制. 确认机制需要支撑的协议功
   427   428   429   430   431   432   433   434   435   436   437