速读原著-TCP/IP(快速重传与快速恢复算法)

第21章 TCP的超时与重传

21.7 快速重传与快速恢复算法

拥塞避免算法的修改建议 1 9 9 0年提出 [Jacobson 1990b]。在我们的例子(见 2 1 . 5节)中已经可以看到这些实施中的修改。
在介绍修改之前,我们认识到在收到一个失序的报文段时, T C P立即需要产生一个 A C K(一个重复的A C K)。这个重复的A C K不应该被迟延。该重复的 A C K的目的在于让对方知道收到一个失序的报文段,并告诉对方自己希望收到的序号。

由于我们不知道一个重复的 A C K是由一个丢失的报文段引起的,还是由于仅仅出现了几个报文段的重新排序,因此我们等待少量重复的 A C K到来。假如这只是一些报文段的重新排序,则在重新排序的报文段被处理并产生一个新的 A C K之前,只可能产生1 ~ 2个重复的A C K。

如果一连串收到 3个或3个以上的重复A C K,就非常可能是一个报文段丢失了(我们在 2 1 . 5节中见到过这种现象)。于是我们就重传丢失的数据报文段,而无需等待超时定时器溢出。这就是快速重传算法。接下来执行的不是慢启动算法而是拥塞避免算法。这就是快速恢复算法。

在图2 1 - 7中可以看到在收到3个重复的A C K之后没有执行慢启动。相反,发送方进行重传,接着在收到重传的A C K以前,发送了3个新的数据的报文段(报文段 67, 69和7 1)。在这种情况下没有执行慢启动的原因是由于收到重复的 A C K不仅仅告诉我们一个分组丢失了。由于接收方只有在收到另一个报文段时才会产生重复的 A C K,而该报文段已经离开了网络并进入了接收方的缓存。也就是说,在收发两端之间仍然有流动的数据,而我们不想执行慢启动来突然减少数据流。

这个算法通常按如下过程进行实现:

  1. 当收到第3个重复的A C K时,将s s t h re s h设置为当前拥塞窗口 c w n d的一半。重传丢失的报文段。设置c w n d为s s t h re s h加上3倍的报文段大小。
  2. 每次收到另一个重复的 A C K时,c w n d增加1个报文段大小并发送 1个分组(如果新的c w n d允许发送)。
  3. 当下一个确认新数据的A C K到达时,设置c w n d为s s t h re s h(在第1步中设置的值)。这个A C K应该是在进行重传后的一个往返时间内对步骤 1中重传的确认。另外,这个 A C K也应该是对丢失的分组和收到的第 1个重复的A C K之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。

在下一节中我们将看到变量 c w n d和s s t h re s h的计算过程。快速重传算法最早出现在 4.3BSD Ta h o e版本中,但它随后错误地使用了慢启动。快速恢复算法出现在4.3BSD Reno版本中。

发布了1545 篇原创文章 · 获赞 1483 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/weixin_42528266/article/details/104794701