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

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


                 1, 接收方进行丢包事件检测, 如果检测到发生了丢包事件, 就发送                  IACK. 该  IACK  可以携带报文序号     (PKT.SEQ)
                 丢失区间, 该区间指示接收缓存中最大的              PKT.SEQ  和次大  (第  2  大) 的  PKT.SEQ, 最大的  PKT.SEQ  和次大的
                 PKT.SEQ  两者的差值可以指示哪些数据报文发生丢失. 发送方解析最大的                    PKT.SEQ  和次大的   PKT.SEQ, 可以准
                 确找到对应的报文并重传.

                        ...  UDP   基于 TACK 的      数据
                          报文头      协议报文头

                                                                 IACK 报文   基于 TACK 的   最大报文    次大报文
                   数据报文   类型 长度 数据序号 报文序号      ...  数据          (丢包驱动的)     协议报文头       序号      序号
                       图 18 基于   UDP  实现的数据报文格式                    图 19 基于   UDP  实现的  IACK  报文格式

                    基于  UDP  实现的  TACK  报文格式如图     20  所示. 对于一个   TACK  报文, 其报文头可参照经典        TCP ACK  报文
                 包含一个确认号      SEQ, 指示当前收到的连续的数据序号的最大值, 含义是告知发送方该数据序号之前的数据报文
                 都已经接收到, 发送方可以释放这些数据占用的缓存. TACK                  报文相比   TCP ACK  报文, 将携带更多的反馈信息.
                 例如, 丢包信息, 包含丢包率和        HOL.SEQ  字段.HOL.SEQ  可指示接收缓存中最小的数据序号. TACK            报文头中的
                 确认号   SEQ  和丢包信息中的     HOL.SEQ  字段, 共同指示了接收缓存中的第一个接收缓存空洞                   (receive-buffer-
                 bubble, RBB), 即最早丢失的数据报文的字节范围         (byte range).
                    TACK  除了指示丢包信息以外, 其报文数据部分还可以指示带宽信息                       (如  delivery rate)、窗口信息  (如
                 congestion window)、时延信息  (如  ACK Delay) 等. 作为扩展, 只要整个  TACK  报文不超过    MSS, TACK  还可以进
                 行扩展, 携带更多额外      RBB (Additional RBB) 用来指示更多的历史丢包信息等, 每个          Additional RBB  都由左边界
                 (left edge of additional RBB) 和右边界  (right edge of additional RBB) 共同表示.
                    基于  UDP  实现  TACK  机制, 可以参考经典     TCP  协议, 提供类   POSIX  套接字接口. 采用客户端-服务端模式,
                 则接口定义及其调用流程可参考如图             21  所示.


                                                               客户端接口
                   TACK   基于 TACK 的      反馈信息       扩展          tack_socket tack_connect  tack_send  tack_close
                    报文     协议报文头
                                                               服务端接口
                    时延信息带宽信息丢包信息        ...  历史丢包信息   ...       tack_socket tack_listen tack_accept  tack_recv  tack_close
                      图 20 基于  UDP  实现的  TACK  报文格式              图 21 基于   UDP  实现的类  POSIX  套接字接口
                  4.3.2    基于  TCP  的实现
                    基于  TCP  实现  TACK  机制, 如图  17  所示的两种基本的形态: 基于内核         TCP  的改进和基于用户态       IP  的  TCP
                 实现. 其中, 用户态    IP  的  TCP  实现基于  Netmap  或者  DPDK  等  UIO  实现与网卡之间的数据交互. 不论采用哪种形
                 态, 基于  TCP  实现  TACK  机制需要的协议修改基本相同.
                    经典   TCP  通常使用报文头中的       40  字节选项  (Option) 字段区域对   TCP  进行扩展, 例如    Timestamp  选项、
                 SACK  选项和  MSS  选项等. 理论上, TCP-TACK   可利用   TCP  选项字段定义更多的       ACK  类型, 扩展报文以携带更
                 多的反馈信息. 然而, 由于选项字段区域限制为             40  字节, TACK  报文可能无法使用这些有限的长度, 来携带传输所
                 需要的所有反馈信息. 例如, 在丢包严重的情况下, 基于选项进行扩展的                    TACK  报文无法携带超过      4  个  RBB.
                    在这种情况下, TCP-TACK      可通过扩展     TCP  选项区域定义更多      ACK  类型, 然后通过扩展     TCP  的数据区域
                 (data field) 以使  ACK  可携带更多的反馈信息. 这种设计来源于以下考虑: (1) TCP          选项的扩展可以充分地使用报
                 文头部剩余空间; (2) 数据区域的扩展, 只增加          ACK  报文大小, 不会增加报文数目, 不会违背           TACK  机制的设计初
                 衷; (3) 如前面所述, 基于   TACK  机制的传输控制, 可以不支持        ACK Piggybacking  机制. 扩展  ACK  报文的数据区域
                 以用于反馈控制信息具有可行性.
                    具体的   TCP  选项扩展和    TCP  数据区域扩展方案, 可以参考        Li 等人在文献    [30] 中示例. 此处不再赘述. 针对
                 TCP  进行选项字段扩展, 其报文可能无法通过网络路径中广泛存在的中间盒                      (middlebox) 的过滤, 即某些中间盒可
   431   432   433   434   435   436   437   438   439   440   441