✅介绍下TCP是如何实现拥塞控制的?

典型回答

拥塞(sè)控制是网络传输中的一种机制,旨在防止网络资源过载和性能下降。它通过控制发送方的数据传输速率,来避免网络中的节点(如路由器、交换机等)过载,确保网络高效、可靠地传输数据。

网络拥塞发生在网络中有过多的数据包在同一时间涌入,超过了网络节点(例如路由器)的处理能力。拥塞会导致数据包丢失、传输延迟增加,甚至网络完全瘫痪。拥塞控制的目的是在不造成严重丢包和拥塞的情况下,调整发送方的发送速率,使数据流量适应当前网络状况。

TCP通过四种主要机制来实现网络拥塞控制,分别是慢启动、拥塞避免、快重传和快恢复

慢启动和拥塞避免

慢启动:在TCP刚连接好,开始发送TCP报文段时。或网络发生拥塞后,TCP会从比较小的发送速率开始。慢启动机制逐步增加拥塞窗口(Congestion Window,简称cwnd),即发送方每次可以发送的最大数据量,以避免瞬时向网络注入过多数据。

  • 初始时,cwnd通常设为1个MSS(最大报文段大小)。
  • 每收到一个ACK,cwnd增加1个MSS。
  • 通过指数级增长,慢启动会迅速增加发送速率,直到达到阈值(ssthresh)或发生丢包。

拥塞避免:当cwnd达到慢启动阈值(ssthresh)后,TCP进入拥塞避免阶段。此时,数据发送速率的增长变为线性,以更小的步伐增加,避免引发拥塞。

  • 每个往返时间(RTT)中,cwnd只增加1个MSS,而不是每个ACK都增加。

1726727500449-cc2e015c-22c7-418c-87c8-dc9e19357b0e.png

快重传和快恢复

快重传和快恢复算法是对慢开始和拥塞避免算法的改进。TCP不依赖超时来检测数据包是否丢失,而是通过冗余ACK(即多个重复的ACK)来判断数据包是否丢失。当发送方收到三个连续的相同ACK时,它会立即重传该丢失的数据包,而不必等待超时。这就是快重传

重复ACK?

为啥可以用重复ACK来识别出数据包丢失呢?

举个例子你就明白了。

  • 假设发送方发送了包1, 2, 3, 4, 5
  • 2丢失了,而包3, 4, 5成功到达接收方。
  • 接收方只能确认收到包1,因此它会对每一个后续数据包(3, 4, 5)都发送对包1的ACK(即重复ACK)。

(下图是我从网上找到的一张图,描述了上述过程)

1726728026465-f3a9eb66-0580-4167-9bd4-29a02c435a0d.webp

所以,当发送方收到三个相同的ACK时,它就可以合理地推断出包**2**已经丢失,而不需要等待超时。通过这种方式,TCP能更快速地检测和恢复丢包,减少数据重传的延迟。

在快重传机制下,TCP检测到丢包时,不进入慢启动阶段,而是直接进入快恢复机制。

  • 快恢复的过程是,将ssthresh设置为cwnd的一半,同时将cwnd设为ssthresh加上三个MSS(对应三次重复ACK)。
  • 之后,TCP继续以线性增长的方式调整发送窗口,直到恢复正常的传输速率。

1726729060629-245d40a7-f1ac-48b3-b472-da6f5d149b3d.png

原文: https://www.yuque.com/hollis666/xkm7k3/hycerreua968mwip