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

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


                                                发送方                 接收方

                                   报文 2 在 t 1  时刻发送          丢失
                                                   ...
                                   报文 J 在 t 2  时刻发送
                                  若 t 2 −t 1 >乱序窗口,                    ACK/SACK
                                      检测到丢包                             回复已经收到的最新的报文
                                重传报文 2 在 t 3  时刻发送            丢失
                                                   ...                      发送时间 t 2
                                  报文 K 在 t 4  时刻发送
                                 若 t 4 −t 3 >乱序窗口,                     ACK/SACK
                                     检测到丢包                             回复已经收到的最新的报文
                                重传报文 2 在 t 5  时刻发送                          发送时间 t 4


                                                   图 15 RACK   丢包检测

                    在  TACK  机制中, 丢包检测在接收方完成. 具体地, 接收方根据报文               PKT.SEQ  的乱序情况检测丢包事件, 通
                 过丢包驱动的     IACK, 反馈丢包信息到发送方. 基于        IACK  的丢包检测算法, 其本质上就是接收端版本的              RACK  算
                 法. 与  RACK  的区别, 体现在   RACK  使用  (严格递增的) 时间戳, 而       TACK  机制使用一个严格递增的报文序号
                 (PKT.SEQ), 本质上时间戳和      PKT.SEQ  具有相同的作用. IACK     基于报文序号      PKT.SEQ  进行丢包检测, 由于
                 PKT.SEQ  是一个严格递增的量, 因此可以根据          PKT.SEQ  的不同  (如图  16  所示的  PKT.SEQ=2  和  PKT.SEQ=5) 来
                 区分重传报文与原始报文. 如图         16  所示, IACK  也可以准确地识别重传报文的丢失情况.

                                               发送方                  接收方
                                    报文 1 (PKT.SEQ=1)
                                    报文 2 (PKT.SEQ=2)
                                    报文 3 (PKT.SEQ=3)         丢失          检测到丢包
                                                                 IACK     IACK 延迟
                                    报文 4 (PKT.SEQ=4)
                                 重传报文 2 (PKT.SEQ=5)                    答复 PKT.SEQ 区间 [1, 3]
                                    报文 5 (PKT.SEQ=6)        丢失           检测到丢包
                                    报文 6 (PKT.SEQ=7)
                                                                 IACK
                                                                       答复 PKT.SEQ 区间 [4, 6]
                                 重传报文 2 (PKT.SEQ=8)
                                    报文 7 (PKT.SEQ=9)
                                                    图 16 IACK  丢包检测

                    值得一提的是, 如果      TCP  不开启时间戳选项, 当发送方触发重传数据报文后, 接收方即使收到了该数据报文,
                 发送方也无法判断确认接收的数据报文是来自原始请求的响应, 还是来自重传请求的响应, 这就带来了重传二义
                 性  (retransmission ambiguity). 重传二义性影响采样  RTT  测量值的准确性, 进而影响重发超时阈值计算的准确度,
                 可能会增大数据报文超时重传的概率. 时间戳和报文序号都能将重复报文和原始报文区分出来, 因此, 两者都能够
                 提高  RTT  测量的准确性.
                  4.2.6    IACK  与  NACK
                    不论是否携带      SACK  选项, TCP  的  ACK  均是一种“正”反馈, 即反馈哪些报文成功接收. 容易想到, 还存在与
                 其相反的“负”反馈, 称为      NACK/NAK (Negative ACK). ACK  告诉发送方哪些报文收到了, 而       NACK  告诉发送方哪
                 些报文丢失了. 传输同样多的数据报文, NACK            的数量通常少于      ACK  的数量, 然而采用    NACK  意味着发送方必须
                 被动地等待丢包信息, 没有丢包信息则表明报文成功接收, 但需等待多久则无法明确表示. NACK                            作为一种错误控
                 制机制, 已经被广泛地应用在         WebRTC [40]  , UDT [41]  , RBUDP [42] , NACK Option [43] 和  NORM [44] 等传输解决方案.
                    丢包驱动的     IACK  与 NACK  具有相同的思想. 准确地说, IACK       是一个比    NACK  更一般化的概念, 它的触发
                 条件是发生即时事件. 这些即时事件不仅可以是丢包事件, 还可以是缓冲区耗尽事件、RTT                             更新请求事件等. 因
                 此, 可以认为   IACK  是  NACK  的扩展.
   429   430   431   432   433   434   435   436   437   438   439