TCP面试系列快重传与快恢复

TCP 面试系列第八弹,TCP 快重传与快恢复。

快重传算法首先要求接收方每收到一个失序的报文段后就立即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等待自己发送数据时才进行捎带确认。

快重传示意图如下:

如上图所示,接收方收到了 M1 和 M2 后都分别发出了确认。现假定接收方没有收到 M3 但接着收到了 M4。显然,接收方不能确认 M4,因为 M4 是收到的失序报文段(按照顺序的 M3 还没有收到)。

根据之前介绍的 TCP 可靠传输原理,接收方可以什么都不做,也可以在适当时机发送一次对 M2 的确认。但按照快重传算法的规定,接收方应及时发送对 M2 的重复确认,这样做可以让发送方及早知道报文段 M3 没有到达接收方。因此,接下来,发送方发送 M5 和 M6 后,接收方收到后,也还是要再次发出对 M2 的重复确认。

快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段 M3,而不必继续等待为 M3 设置的重传计时器到期。

与快重传配合使用的还有快恢复算法,其过程有以下两个要点:

  1. 当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限ssthresh 减半。这是为了预防网络发生拥塞。请注意,接下去不执行慢开始算法。
  2. 由于发送方现在认为网络很可能没有发生拥塞(如果网络发生了严重的拥塞,就不会一连有好几个报文段连续到达接收方,也就不会导致接收方连续发送重复确认),因此与慢开始不同之处是现在不执行慢开始算法(即拥塞窗口 cwnd 现在不设置为 1),而是把 cwnd 值设置为慢开始门限 ssthresh 减半后的数值,然后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

如下图所示:注意图上关键点,从收到 3 个重复的确认,执行快重传算法。

上图给出了快重传和快恢复的示意图,并标明了“TCP Reno版本”,这是目前使用得很广泛的版本。

图中还画出了已经废弃不用的虚线部分(TCP Tahoe 版本)。请注意它们的区别就是:新的 TCP Reno 版本在快重传之后采用快恢复算法而不是采用慢开始算法。