网工干货知识

超全学习笔记
当前位置:首页 > 干货知识

TCP中用于数据恢复的快速恢复技术

更新时间:2026年03月27日   作者:spoto   标签(Tag):

当RTO计时器到期,但并未收到ACK响应时,发送方可以确认该数据包因中间设备的拥塞而丢失了。此时,发送方需要谨慎处理这种拥塞状态。快速恢复是一种用于处理数据包丢失的技术。所谓“恢复”,指的是在一段时间内停止发送新的数据包。

当检测到数据包丢失时,TCP发送方会执行以下4个步骤:

  1. 将cwnd减少了50%。
  2. 将 ssthresh 的值减少 cwnd 的 50%。
  3. 重新传输丢失的数据包。
  4. 进入快速恢复阶段。

快速恢复阶段:

这分为两部分:

  1. 那半扇沉默的窗户
  2. 在新的ACK信号到达发送端之前,继续保持inflight=cwnd的状态。

那半扇沉默的窗户所谓“发送方处于沉默状态的时间”,指的是发送方在等待接收方发送数据的时间。因为当检测到数据包丢失时,cwnd的值会减半。在此之前,inflight的值与cwnd的值相等,但现在inflight的值大约是cwnd的两倍。因此,发送方不会发送任何新的数据包,也不会因为每次收到ACK而增加其cwnd值。发送方会一直收到DUP-ACK信号,直到接收方接收到重新发送的数据包为止。

在飞行过程中的网络速度达到 cwnd 之后这段沉默的半段时间到此为止了。现在,DUP-ACK会继续发送下去。因此,发送方不会增加其传输速率,但会保持一个与cwnd相等的传输值。 当收到一个DUP-ACK时,飞行中的数据包数量就会比之前减少1个。因此,为了保持飞行中的数据包数量与发送的数据包数量相等,发送方需要向网络中发送一个新的数据包。 当接收方最终接收到重新传输的数据包,并发送新的ACK信号给发送方时,发送方就会从快速恢复阶段退出,直接进入AIMD阶段。 发送方已经完成了恢复阶段,因为已经确认丢失的数据包已被接收方收到,因此网络不再处于拥堵状态了。 不过,必须谨慎地增加cwnd的值,以避免过早出现拥塞现象。否则,就会陷入AIMD状态。

快速恢复技术:

在TCP Reno和TCPNewreno中使用的快速恢复技术:

它面临着一个被称为“沉默的半窗”的问题。这个问题会导致可用的网络资源被浪费。因为当发送方保持沉默时,网络带宽就被浪费了。另一个问题是,这种情况会延迟应用程序的运行,从而让最终用户感到沮丧。如果发送方不发送数据的话,接收方就不得不等待,这会导致数据传输的延迟,进而影响到用户的体验。那么,解决这个问题的方法是什么呢?

一种解决方案是改进对“飞行中”数据的估计,这可以通过使用SACK技术来实现。如果发送方知道更新后的“飞行中”数据值,那么半窗口内的静默时间就会很快结束。另一种解决方案是采用速率减半技术(在Linux系统中,这是默认设置)。还有一种更先进的解决方案是比例速率降低技术(这一技术目前是Linux系统的默认设置,且被定义在RFC 6937中)。

无需使用SACK协议的快速恢复机制:

无需使用SACK协议的快速恢复机制
在快速恢复之前:
cwnd = 10, inflight = 10

快速恢复开始时的初始阶段:
cwnd = 5, ssthresh = 5, inflight = pipe = 10

在管道达到与cwnd相等的状态之前,这段时间内都处于沉默状态。

  1. DUP-ACK到达发送方时,对应的管道编号为10-1=9。
  2. DUP-ACK到达发送方:管道编号=9-1=8
  3. DUP-ACK到达发送方时,管道编号为8-1=7。
  4. DUP-ACK到达发送方:管道编号=7-1=6
  5. DUP-ACK到达发送方时,管道值变为6-1=5。此时,cwnd的值也等于管道值,沉默状态就此结束。
  6. DUP-ACK到达发送方时,其值为:pipe=5-1=4,同时pipe<cwnd>。此时,发送方会发送一个新的数据包,其值为:pipe=4+1=5。
  7. DUP-ACK到达发送方时,其值为:pipe=5-1=4,且pipe<cwnd。此时,发送方会发送一个新的数据包,其值为:pipe=4+1=5。

这个过程会持续下去,直到发送的数据包被接收方确认为止。

使用SACK实现快速恢复:

该网络存在传输拥塞的问题。当网络无法正确接收数据包时,发送方会同时发送大量数据包,这会对网络造成严重的负面影响。

使用SACK实现快速恢复

初始状态:

pipe = 5 segments
cwnd= 5 segments
ssthresh = 5 segments

当沉默的时间达到一半时,就会出现这种情况,此时 pipe=cwnd。

DUP-ACK与SACK数据块一起被发送过来。其中,SACK数据块表明有3个数据包丢失了。

pip= 5-1-3= 1
pipe < cwnd 

需要传输新的数据包 = cwnd-pipe

现在,发送方将发送4个新的数据包。这就是所谓的……突发传输。

              马上抢免费试听资格
意向课程:*必选
姓名:*必填
联系方式:*必填
QQ:
思博SPOTO在线咨询

相关资讯

即刻预约

免费试听-咨询课程-获取免费资料