拥塞(sè)控制是网络传输中的一种机制,旨在防止网络资源过载和性能下降。它通过控制发送方的数据传输速率,来避免网络中的节点(如路由器、交换机等)过载,确保网络高效、可靠地传输数据。
网络拥塞发生在网络中有过多的数据包在同一时间涌入,超过了网络节点(例如路由器)的处理能力。拥塞会导致数据包丢失、传输延迟增加,甚至网络完全瘫痪。拥塞控制的目的是在不造成严重丢包和拥塞的情况下,调整发送方的发送速率,使数据流量适应当前网络状况。
TCP通过四种主要机制来实现网络拥塞控制,分别是慢启动、拥塞避免、快重传和快恢复。
慢启动:在TCP刚连接好,开始发送TCP报文段时。或网络发生拥塞后,TCP会从比较小的发送速率开始。慢启动机制逐步增加拥塞窗口(Congestion Window,简称cwnd
),即发送方每次可以发送的最大数据量,以避免瞬时向网络注入过多数据。
cwnd
通常设为1个MSS(最大报文段大小)。cwnd
增加1个MSS。拥塞避免:当cwnd
达到慢启动阈值(ssthresh)后,TCP进入拥塞避免阶段。此时,数据发送速率的增长变为线性,以更小的步伐增加,避免引发拥塞。
cwnd
只增加1个MSS,而不是每个ACK都增加。快重传和快恢复算法是对慢开始和拥塞避免算法的改进。TCP不依赖超时来检测数据包是否丢失,而是通过冗余ACK(即多个重复的ACK)来判断数据包是否丢失。当发送方收到三个连续的相同ACK时,它会立即重传该丢失的数据包,而不必等待超时。这就是快重传
为啥可以用重复ACK来识别出数据包丢失呢?
举个例子你就明白了。
1, 2, 3, 4, 5
。2
丢失了,而包3, 4, 5
成功到达接收方。1
,因此它会对每一个后续数据包(3, 4, 5
)都发送对包1
的ACK(即重复ACK)。(下图是我从网上找到的一张图,描述了上述过程)
所以,当发送方收到三个相同的ACK时,它就可以合理地推断出包**2**
已经丢失,而不需要等待超时。通过这种方式,TCP能更快速地检测和恢复丢包,减少数据重传的延迟。
在快重传机制下,TCP检测到丢包时,不进入慢启动阶段,而是直接进入快恢复机制。
ssthresh
设置为cwnd
的一半,同时将cwnd
设为ssthresh
加上三个MSS(对应三次重复ACK)。