在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大....所以产生了拥塞控制
拥塞控制的四种算法:
慢启动,阻塞避免,快速重传,快速恢复
拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。
慢启动:记住一个规则就行:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会指数性增加。但是也不是一直增加
有一个限制叫慢启动门限 ssthresh
(slow start threshold)状态变量。
-
当
cwnd
<ssthresh
时,使用慢启动算法。 -
当
cwnd
>=ssthresh
时,就会使用「拥塞避免算法」。
阻塞避免:当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加1,一直到超时后,把ssthresh
设为超时是的一半,然后从0开始进行慢操作,到达ssthresh
值,进行阻塞避免。
快速重传:如果网络突然出现波动,接受方对最后一个收到的有序报文段进行确认,当连续收到三个相同的确认消息,说明有报文段丢失了,然后发送方进行快重传。
快速恢复:连续收到三个相同的信息,直接在当前的cwnd减半,然后直接进行阻塞避免