拥塞控制算法

首先是慢开始算法:
拥塞控制算法
这里是每一个确认都会增加,所以CWND窗口是成指数型增长:
比如一开始发1MSS,收到1MSS,CWND调整为2MSS。
发2MSS,收到1MSS,D+=1MSS,即3MSS,又收到后边的1MSS,CWND+=1MSS,即4MSS。
1、2、4。。。。。

当到达ssthresh转为拥塞避免算法:
拥塞控制算法
①第一种实现方式和慢开始的计算公式一样,不过是计算时机不同,在一个RTT内只计算一次,无论收到多少个确认,所以是线性增长。(也就是把全部CWND中的发送完,而且收到全部确认的情况下,只加1MSS,慢开始则是翻倍了)
②3-2式怎么理解呢,CWND的单位是字节,不过可以理解为一段一段的(MSS)。用具体数值就比较容易说明。
比如CWND是8个MSS字节(假设MSS是100),那就是800字节
但是一次是一个MSS一个MSS的发,SMSS/CWND=1/8,再乘以SMSS,即1/8MSS,所以当收到全部确认后(8个MSS),即1/8MSS * 8 = 1MSS,和实现方式①效果几乎一样。

拥塞控制算法
超时影响很大,会直接回到慢开始阶段。

如果只是收到重复确认,则问题不大(可能发生了丢包)
拥塞控制算法

当源端收到3个或3个以上重复的ACK时,就判定数据包丢失,同时将ssthresh设置为当前cwnd的一半,并重传丢失的包,进入快速恢复阶段。
(步骤1)ssthresh减半,CWND则变为ssthresh+3MSS:
理由是:发送方收到了3个重复的确认,表明这三个分组已经离开了网络,不再消耗网络资源(不是堆积了分组而是减少了3个分组),所以CWND可以扩大3个分组的大小。
(步骤2)在快速恢复阶段,每收到重复的ACK,则cwnd加1;
(步骤3)收到非重复ACK时,置cwnd=ssthresh,转入拥塞避免阶段;

步骤1和2应该是扩大窗口,加快完成重传,重传完成后,会收到新的确认,此时把CWND重新设为ssthresh,然后转入拥塞避免阶段。