拥塞控制通过拥塞窗口来防止过多的数据注入网络,使得网络中的路由器或者链路过载。
其实只要发送方没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。
拥塞控制的算法
慢启动的算法记住一个规则就行:当发送方每收到一个 ACK ,拥塞窗口 cwnd 的大小就会加1。慢启动算法,发包的个数是指数性的増长。1->2->4->8->2的次方。
有一个慢启动门限 ssthresh 状态变量:
那么进入拥塞避免算法后,它的规则是:发包个数按线性增长(一个一个向上加)。
拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。
随着发包量的逐渐加大,网络就会慢慢进入了拥塞的状况了,于是就会出现丟包现象(即拥塞发生),这时就需要对丟失的数据包进行重传。当触发了重传机制,也就进入了拥塞发生算法。
发生拥塞,进行数据重传2种方式:
(1)发生超时重传的发生算法:
这个时候, ssthresh 和 cwnd 的值会发生变化
1. ssthresh 设为 Cwnd /2。
2. cwnd 重置为1。

突然回到慢启动导致网络卡顿。
(2)快速重传拥塞算法:
TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 Cwnd 变化如下:
1. cwnd = Cwnd /2,也就是设置为原来的一半2. ssthresh = Cwnd
3.进入快速恢复算法

快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,还能收到3个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。
进入快速恢复:
而是还在比较高的值,后续呈线性増长。