拥塞控制(计算机网络)
拥塞控制
拥塞控制通过拥塞窗口来防止过多的数据注入网络,使得网络中的路由器或者链路过载。
-
拥塞窗口 cwnd 是发送方维护的一个状态变量,根据网络拥塞程度而变化。 发送窗口的值是 Swnd = min ( Cwnd , rwnd ),也就是拥塞窗口和接收窗口中的最小值。 网络中没有出现拥塞, cwnd 增大,出现拥塞, Cwnd 减小。
其实只要发送方没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了拥塞。
拥塞控制的算法
- 慢启动
- 拥塞避免
- 拥塞发生
- 快速恢复
1.慢启动
慢启动的算法记住一个规则就行:当发送方每收到一个 ACK ,拥塞窗口 cwnd 的大小就会加1。慢启动算法,发包的个数是指数性的増长。1->2->4->8->2的次方。 有一个慢启动门限 ssthresh 状态变量:
- 当 cwnd < ssthresh 时,使用慢启动算法。
- 当 Cwnd >= ssthresh 时,就会使用拥塞避免算法。
2.拥塞避免算法
那么进入拥塞避免算法后,它的规则是:发包个数按线性增长(一个一个向上加)。 拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。 随着发包量的逐渐加大,网络就会慢慢进入了拥塞的状况了,于是就会出现丟包现象(即拥塞发生),这时就需要对丟失的数据包进行重传。当触发了重传机制,也就进入了拥塞发生算法。
3.拥塞发生
发生拥塞,进行数据重传2种方式:
- 超时重传
- 快速重传
(1)发生超时重传的发生算法: 这个时候, ssthresh 和 cwnd 的值会发生变化 1. ssthresh 设为 Cwnd /2。 2. cwnd 重置为1。
突然回到慢启动导致网络卡顿。
(2)快速重传拥塞算法: TCP 认为这种情况不严重,因为大部分没丢,只丢了一小部分,则 ssthresh 和 Cwnd 变化如下: 1. cwnd = Cwnd /2,也就是设置为原来的一半2. ssthresh = Cwnd 3.进入快速恢复算法
4.快速恢复
快速重传和快速恢复算法一般同时使用,快速恢复算法是认为,还能收到3个重复 ACK 说明网络也不那么糟糕,所以没有必要像 RTO 超时那么强烈。 进入快速恢复:
- 拥塞窗口 cwnd = Ssthresh +3(3的意思是确认有3个数据包被收到了);2.重传丢失的数据包;
- 如果再收到重复的 ACK ,那么 Cwnd 增加1;
- 如果收到新数据的 ACK 后,把 Cwnd 设置为第一步中的 ssthresh 的值,原因是该 ACK 确认了新的数据,说明从 duplicated ACK 时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;
而是还在比较高的值,后续呈线性増长。
上一篇:
Java架构师技术进阶路线图
下一篇:
什么是TCP的三次握手?