一、引言
起初,TCP只有基于窗口的流控制,也就是滑动窗口协议。这是一种局部考虑的控制方式,只有发送方和接收方作为参与者,只考虑接收端的接收能力,而忽视了网络传输能力。
而后,拥塞控制机制被引入,这是一种侧重于整体的控制机制,考虑整个网络的传输能力,是一种全局控制机制。
拥塞控制机制的核心有四:慢启动、拥塞避免、快速重传和快速恢复。
二、慢启动和拥塞避免
发送方维护两个窗口,一个发送窗口和一个拥塞窗口cwnd(congestion window) ,最终允许发送的字节数是他们二者中的最小值。
注意:下文所说的cwnd的大小是指报文段的个数,其实际大小应该是字节数。
(1)当建立新的TCP连接时,cwnd初始化为1,源端按照cwnd的大小发送数据,每接收到一个ACK,cwnd就增加一个发送量,这样cwnd就随着回路响应时间RTT呈指数增长。
(2)为了防止cwnd增长过大引起网络拥塞,设置一个慢启动门限ssthresh状态变量。ssthresh的用法如下:
当cwnd<ssthresh,使用慢启动算法
当cwnd>ssthresh,使用拥塞避免算法
当cwnd=ssthresh,慢开始与拥塞避免算法任意
拥塞避免算法让cwnd呈线性增长,即每收到一个ACK,cwnd加1。
(3)无论是在慢启动阶段还是拥塞避免阶段,只要判定为网络拥塞(根据是发生超时,在规定时间内没有收到ACK,虽然有可能是其他原因造成丢失,但是一律当做网络拥塞处理),则把慢启动门限ssthresh减半,cwnd设为1,然后执行慢启动算法。
三、快速重传和快速恢复
ACK应该是在进行重传后的一个往返时间内对步骤 1中重传的确认。另外,这个ACK也应该是对丢失的分组和收到的第1个重复的ACK之间的所有中间报文段的确认。这一步采用的是拥塞避免,因为当分组丢失时我们将当前的速率减半。