计算机网络-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时的数据都已收到,该恢复过程已经结束,可以回到恢复之前的状态了,也即再次进入拥塞避免状态;