计算机网络-TCP拥塞控制Reno算法
TIP
1. 概览

- 所谓的拥塞控制,本质上就是避免发送方的数量填满整个滑动窗口。
- 慢启动(防止拥塞)
- 拥塞避免
- 拥塞发生(快重传)
- 快速恢复
2. 慢启动
- 简单说,就是在开始发送的阶段,从最低值开始,一点点慢慢增大窗口数量。
- 当发送方每收到一个
ACK,拥塞窗口cwnd的大小就会扩大一次 。 - 慢启动的开始阶段并不慢,一开始是指数级别上升,到达
ssthresh慢启动门限的时候,速度才开始放缓,从指数上升到慢速上升。

- 慢启动门限
ssthresh(slow start threshold)状态变量。 - 当
cwnd<ssthresh时,使用慢启动算法。 - 当
cwnd>=ssthresh时,就会使用「拥塞避免算法」。
3. 拥塞避免算法
- 一般来说
ssthresh的大小是65535字节。 - 当拥塞窗口
cwnd超过慢启动门限ssthresh就会进入拥塞避免算法。 - 每当收到一个
ACK时,cwnd增加1/cwnd。 使得cwnd变成慢速增长。 - 归根结底,就是想办法把滑动窗口增长变慢。

4. 拥塞发生
4.1 如果发生超时重传

ssthresh设为cwnd/2,cwnd重置为1(是恢复为cwnd初始化值,这里假定 cwnd 初始化值 1)
实际上
Linux对于cwnd窗口大小的设置默认为10, 通过ss -nli命令可以看出
4.2 如果发生快速重传
- 触发快速重传,说明网络环境还行,没有那么糟糕,可以不采取极限的办法。
cwnd=cwnd/2,也就是设置为原来的一半;ssthresh=cwnd;- 进入快速恢复算法
5. 快速恢复
- 快速重传和快速恢复往往一起使用,大概的意思就是说,你还能收到三个重复的
ACK,说明情况不是太差,可以尝试快速恢复cwnd大小。 - 进入快速恢复之前,
cwnd和ssthresh已被更新了: cwnd=cwnd/2,也就是设置为原来的一半;ssthresh=cwnd;

- 然后,进入快速恢复算法如下:
- 拥塞窗口
cwnd=ssthresh+3(3的意思是确认有3个数据包被收到了); - 重传丢失的数据包;
- 如果再收到重复的
ACK,那么cwnd增加1; - 如果收到新数据的
ACK后,把cwnd设置为第一步中的ssthresh的值,原因是该ACK确认了新的数据,说明从duplicated ACK时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;