拥塞控制是什么
拥塞控制是一个全局性的过程,用来防止过多的数据注入网络,保证网络不过载。
常见的拥塞控制算法
- 慢开始
- 拥塞避免
- 快重传
- 快恢复
两个窗口
- 接收窗口 rwnd:接收方目前接收缓存的大小,通过 TCP 报文的首部字段通知发送方
- 拥塞窗口 cwnd:发送方估算网络拥塞程度设置的窗口值。未拥塞,窗口值逐渐增大,拥塞逐渐减小
- 发送窗口 = min{rwnd,cwnd}
特别的,当接收方有足够大的缓存时,发送窗口由拥塞窗口决定
慢开始与拥塞避免
慢开始算法
- 初始拥塞窗口为 1
- 每接收一个报文确认后,cwnd 翻倍
- cwnd 呈指数型增长,到达慢开始门限(ssthresh)后,改用拥塞避免算法
拥塞避免算法
- cwnd 每经过一个报文确认(往返时间)就增加 1,线性增长
- 当出现依次超时,令 ssthresh 为 cwnd 的一半,cwnd 重新置为 1
cwnd 不同时执行的算法
- cwnd < ssthresh :慢开始
- cwnd > ssthresh :拥塞控制
PS:不论是拥塞避免还是慢开始都不能避免拥塞的出现,但是能使网络比较不容易出现拥塞。
实例分析
- 初始时,cwnd 被设置为 1,并且开始慢开始算法(成倍增加)
- 当 cwnd 增长到慢开始门限 ssthresh (cwnd = 16)时,改用拥塞避免算法
- 由图可知,当 cwnd 到达 24 时,发生网络拥塞,ssthresh 变为 cwnd 的一半,也就是 ssthresh = 12,然后 cwnd 置为 1
PS:若在慢开始算法时,翻倍后的 cwnd > ssthresh ,cwnd 只能等于 ssthresh 而不能超过它
快重传算法
快重传和快恢复是对慢开始和拥塞控制的改进
快重传的工作原理
当发送方发送连续收到 3 个 ACK 报文后,不必等待,直接重传对方尚未收到的报文段
快恢复算法
- 当发送方收到了 3 个 ACK 报文,ssthresh 设置为 cwnd 的一半,然后 cwnd 置为当前 ssthresh 的值(而不是在拥塞控制算法中的 cwnd 置为 1)
- 接着采用拥塞避免的加法线性增大