为什么使用慢启动算法
当主机开始发送数据时,如果立即将大量数据注入网络,就有可能引起网络拥塞。因此,较好的方法是由小到大逐渐增大发送窗口。
初始时,cwnd=1个最大报文段大小(MSS),每收到一个确认后+1。这样,每过一个传输轮次,cwnd的值变为2,4,8,···,指数型增加。
拥塞避免
当cwnd增大到可能会导致网络拥塞时,需要进行报文重传。引入慢启动阀值ssthresh。
慢启动阀值ssthresh = 当时窗口大小的一半。
重传有两种机制:超时重发机制和高速重发机制。两种机制对应的cwnd的值不同。
cwnd = ssthresh + 3
if
高速重传机制
cwnd = 1if
超时重发机制
超时重发机制
超时重发机制cwnd=1,接着继续执行慢启动算法。当cwnd>=ssthresh时开始线性增加,即为拥塞避免。
高速重传机制
快重传
高速重传机制采用的算法为快重传算法。快重传算法没有超时,而是收到3个以上的重复的ACK即开始重传,随后进入快恢复算法。
快恢复
快恢复算法分3个步骤:
- 收到第3个重复确认的ACK时,sstresh=当前cwnd的一半,cwnd=ssthresh+3。发送重传数据。
- 没有收到新数据的ACK之前,cwnd+1
if
收到重复的ACK;发送一个报文段if
cwnd > 未确认的报文大小。- 收到新数据的ACK,cwnd=ssthresh(重传时cwnd的一半),开始拥塞避免。