TCP的快速恢复机制详解
字数 1888 2025-11-06 12:41:12

TCP的快速恢复机制详解

知识点描述
TCP的快速恢复机制是TCP拥塞控制算法的重要组成部分,与快速重传机制协同工作。它的主要目标是在检测到数据包丢失(通过重复ACK判断)但网络并未完全瘫痪的情况下,更高效地恢复数据传输,避免TCP连接退回到耗时的慢启动阶段,从而提升网络带宽的利用率。

核心问题
在只有快速重传机制时,当发送方收到3个重复ACK并重传丢失的数据包后,它会将拥塞窗口(cwnd)设置为1个最大报文段(MSS),然后进入慢启动阶段。这种做法过于保守,因为重复ACK的出现意味着网络仍然有能力传输数据(接收方仍在接收后续数据包),此时直接将窗口降至1会严重降低吞吐量。

解决方案:快速恢复
快速恢复在快速重传之后立即启动,其核心思想是:在重传丢失的数据包期间,不是将窗口缩小到1并进入慢启动,而是通过一种更温和的方式调整窗口,保持在网络中“飞行中”的数据包数量相对稳定,从而平滑地恢复数据流。

循序渐进讲解

步骤一:触发条件——快速重传

  1. 发送方连续发送多个数据包,例如序列号为1, 2, 3, 4, 5。
  2. 假设数据包2在网络中丢失,而数据包3, 4, 5成功到达接收方。
  3. 对于每一个到达的、序列号大于期望值(即数据包2)的数据包(如3, 4, 5),接收方都会回复一个对数据包2的确认(即ACK 2)。这种对同一个数据包的重复确认,就是“重复ACK”。
  4. 当发送方收到第3个重复的ACK(即第3个ACK 2)时,它推断数据包2很可能已经丢失,而不是仅仅乱序。此时,快速重传被触发:发送方立即重传数据包2,而不用等待重传计时器超时。

步骤二:进入快速恢复状态并调整窗口

  1. 在执行快速重传(重传数据包2)的同时,TCP进入快速恢复状态。
  2. 关键操作是设置新的拥塞窗口(cwnd)和慢启动阈值(ssthresh):
    • ssthresh = cwnd / 2:将慢启动阈值设置为当前拥塞窗口的一半。这记录了网络拥塞发生时的“安全”窗口大小。
    • cwnd = ssthresh + 3 * MSS:为什么是这么设置?
      • ssthresh:代表了我们对当前网络容量的新估计。
      • + 3 * MSS:这是因为我们收到了3个重复ACK。每个重复ACK都意味着有一个数据包已经离开了网络(被接收方成功接收),同时有一个新的空间出现在了接收方的缓冲区。因此,我们可以认为网络的负载能力在此时允许我们再“注入”3个新的数据包。这个操作相当于“欺骗性”地保持网络中数据包的数量。

步骤三:在快速恢复状态期间的数据传输

  1. 此时,拥塞窗口(cwnd)被设置为了一个新值(例如,从20个MSS变为 10 + 3 = 13个MSS)。
  2. 在这个新的cwnd限制下,发送方可以继续发送新的数据包(只要序列号允许)。这与慢启动有本质区别。慢启动在重传后几乎停止发送新数据,而快速恢复允许数据流继续。
  3. 每当发送方再收到一个重复ACK(第4个,第5个……),它就将cwnd再增加1个MSS。这是因为每个额外的重复ACK同样意味着又有一个数据包成功到达接收方,网络中可以再容纳一个数据包。这有助于维持管道中的数据量。

步骤四:退出快速恢复状态——收到新的ACK

  1. 当发送方重传的数据包(数据包2)最终到达接收方时,接收方此时可能已经缓存了数据包3, 4, 5。
  2. 接收方会检查它的缓存,发现现在可以连续确认到数据包5了。于是,它会向发送方回复一个累积确认,例如ACK 6(表示期望收到序列号为6的数据包)。
  3. 这个ACK 6是一个新的、更高级别的ACK(它确认了之前未被确认的数据),而不是重复ACK。这是退出快速恢复状态的信号。
  4. 发送方收到这个新ACK后,执行以下操作:
    • cwnd = ssthresh:将拥塞窗口设置为步骤二中计算出的慢启动阈值。
    • 退出快速恢复状态

步骤五:恢复后的阶段——拥塞避免

  1. 退出快速恢复后,cwnd被设置为ssthresh。此时,TCP进入拥塞避免阶段。
  2. 在拥塞避免阶段,cwnd的增长不再是指数级的(慢启动),而是线性的(每经过一个RTT,cwnd增加1个MSS),即“加性增”,从而更谨慎地探测剩余带宽。

总结
快速恢复机制的精妙之处在于它区分了超时重传重复ACK触发的重传。超时通常意味着更严重的拥塞(网络可能已中断),因此需要激进地退到慢启动。而重复ACK意味着网络仍在工作,只是有个别包丢失,因此采用更平滑的恢复策略,显著提升了TCP在轻微拥塞情况下的性能。它与快速重传、慢启动、拥塞避免共同构成了TCP的拥塞控制体系。

TCP的快速恢复机制详解 知识点描述 TCP的快速恢复机制是TCP拥塞控制算法的重要组成部分,与快速重传机制协同工作。它的主要目标是在检测到数据包丢失(通过重复ACK判断)但网络并未完全瘫痪的情况下,更高效地恢复数据传输,避免TCP连接退回到耗时的慢启动阶段,从而提升网络带宽的利用率。 核心问题 在只有快速重传机制时,当发送方收到3个重复ACK并重传丢失的数据包后,它会将拥塞窗口(cwnd)设置为1个最大报文段(MSS),然后进入慢启动阶段。这种做法过于保守,因为重复ACK的出现意味着网络仍然有能力传输数据(接收方仍在接收后续数据包),此时直接将窗口降至1会严重降低吞吐量。 解决方案:快速恢复 快速恢复在快速重传之后立即启动,其核心思想是:在重传丢失的数据包期间,不是将窗口缩小到1并进入慢启动,而是通过一种更温和的方式调整窗口,保持在网络中“飞行中”的数据包数量相对稳定,从而平滑地恢复数据流。 循序渐进讲解 步骤一:触发条件——快速重传 发送方连续发送多个数据包,例如序列号为1, 2, 3, 4, 5。 假设数据包2在网络中丢失,而数据包3, 4, 5成功到达接收方。 对于每一个到达的、序列号大于期望值(即数据包2)的数据包(如3, 4, 5),接收方都会回复一个对数据包2的确认(即ACK 2)。这种对同一个数据包的重复确认,就是“重复ACK”。 当发送方收到第3个重复的ACK(即第3个ACK 2)时,它推断数据包2很可能已经丢失,而不是仅仅乱序。此时, 快速重传 被触发:发送方 立即重传 数据包2,而不用等待重传计时器超时。 步骤二:进入快速恢复状态并调整窗口 在执行快速重传(重传数据包2)的 同时 ,TCP进入 快速恢复 状态。 关键操作是设置新的拥塞窗口(cwnd)和慢启动阈值(ssthresh): ssthresh = cwnd / 2 :将慢启动阈值设置为当前拥塞窗口的一半。这记录了网络拥塞发生时的“安全”窗口大小。 cwnd = ssthresh + 3 * MSS :为什么是这么设置? ssthresh :代表了我们对当前网络容量的新估计。 + 3 * MSS :这是因为我们收到了3个重复ACK。每个重复ACK都意味着有一个数据包已经离开了网络(被接收方成功接收),同时有一个新的空间出现在了接收方的缓冲区。因此,我们可以认为网络的负载能力在此时允许我们再“注入”3个新的数据包。这个操作相当于“欺骗性”地保持网络中数据包的数量。 步骤三:在快速恢复状态期间的数据传输 此时,拥塞窗口(cwnd)被设置为了一个新值(例如,从20个MSS变为 10 + 3 = 13 个MSS)。 在这个新的cwnd限制下,发送方 可以继续发送新的数据包 (只要序列号允许)。这与慢启动有本质区别。慢启动在重传后几乎停止发送新数据,而快速恢复允许数据流继续。 每当发送方再收到一个重复ACK(第4个,第5个……),它就将cwnd再增加1个MSS。这是因为每个额外的重复ACK同样意味着又有一个数据包成功到达接收方,网络中可以再容纳一个数据包。这有助于维持管道中的数据量。 步骤四:退出快速恢复状态——收到新的ACK 当发送方重传的数据包(数据包2)最终到达接收方时,接收方此时可能已经缓存了数据包3, 4, 5。 接收方会检查它的缓存,发现现在可以连续确认到数据包5了。于是,它会向发送方回复一个 累积确认 ,例如ACK 6(表示期望收到序列号为6的数据包)。 这个ACK 6是一个 新的、更高级别的ACK (它确认了之前未被确认的数据),而不是重复ACK。这是退出快速恢复状态的信号。 发送方收到这个新ACK后,执行以下操作: cwnd = ssthresh :将拥塞窗口设置为步骤二中计算出的慢启动阈值。 退出快速恢复状态 。 步骤五:恢复后的阶段——拥塞避免 退出快速恢复后,cwnd被设置为ssthresh。此时,TCP进入 拥塞避免 阶段。 在拥塞避免阶段,cwnd的增长不再是指数级的(慢启动),而是线性的(每经过一个RTT,cwnd增加1个MSS),即“加性增”,从而更谨慎地探测剩余带宽。 总结 快速恢复机制的精妙之处在于它区分了 超时重传 和 重复ACK触发的重传 。超时通常意味着更严重的拥塞(网络可能已中断),因此需要激进地退到慢启动。而重复ACK意味着网络仍在工作,只是有个别包丢失,因此采用更平滑的恢复策略,显著提升了TCP在轻微拥塞情况下的性能。它与快速重传、慢启动、拥塞避免共同构成了TCP的拥塞控制体系。