TCP拥塞控制
TCP为运行在两个不同主机上的进程提供了可靠的传输服务,它还有另一个重要部分的就是拥塞控制机制。在传输数据时,发送方想要尽快的将数据送出去,而接受方也想尽快的收到数据,但超出网络接受能力的传输会造成拥塞。为了处理网络拥塞,TCP上实现了一套拥塞控制机制。
TCP采用的方法是让发送方感受到网络拥塞的程度来限制发送方的发送速率。那么就出现了三个问题,一是如何控制发送方的速率,二是如何让发送方感知网络拥塞,三是采用何种算法。
如何控制发送方的速率
最终受到控制的量是发送端向网络一次连续写入的数据量,我们称为发送窗口(Send Window).我们知道TCP头部中记录了接收通告窗口(Receiver Window,RWND),它告诉对方本端的TCP接收缓冲区还能容纳多少字节的数据,这样对方就可以调节发送窗口的大小,但这显然不够。在拥塞控制机制中维持一个新的变量拥塞窗口(conrol window)。而发送窗口的大小就是CWND和RWND的最小值。
我们假设接受通告窗口足够大来专心考虑拥塞窗口的影响。
如何让发送方感知网络拥塞
1.传输超时。
2.接受到重复的确认报文段。
假设网络发生拥塞时,会造成一个数据报的丢失,接着这个数据报会引发丢包事件(超时或收到重复报文段),发送方就会认为发生了网络拥塞。
采用何种算法
拥塞控制算法由慢启动,拥塞避免,快速恢复和快速重传几组成
1.慢启动
开始时,CWND通常设置为一个较小的值。此后每接受到一个ACK,其CWND就增加min(N,SMSS)个字节。其中N为此次包含之前未确认的字节数,SMSS为发送者最大段大小,我们假设N大于SMSS就会出现如图的指数增长。由此看来,只要网络不堵塞,慢启动并不慢。CWND并不能无限制的增长,那么何时停止呢。一种方式是当发生丢包事件时,CWND会降低到初始值,并设置一个新变量慢启动阈值ssthresh=max(CWND/2,2SMSS)。第二种方式是当CWND到达ssthresh时,将会进入拥塞避免状态,在此状态CWND会更慢的增长。最后一种方式是重复接受ACK报文段时,使用快速重传进入快速恢复。
2.拥塞避免
拥塞避免状态下会线性的增加CWND。拥塞避免有很多不同的实现方式,以下是一种通用的方式,每当接受到一个ACK就增加SMSSSMSS/CWND个字节数。例如CWND=1500,SMSS=150,则接受到一个ACK时,就增加15个字节数。那么何时停止增加呢,方法与慢启动类似。当丢包事件发生时,根据两种丢包原因(超时和重复接受ACK)有两种不同的应对方法。当超时时,CWND被设置为初始值,ssthresh=max(CWND/2,2SMSS),然后重新进入慢启动阶段。当重复接受到ACK时的反应会弱一些,会启用快速重传和快速恢复算法。
3.快速恢复
1.先设置ssthresh=max(CWND/2,2SMSS),然后立即重传丢失的报文段,然后设置CWND=ssthresh+3*SMSS
2.每收到一个ACK,CWND增加一个SMSS.
3.当收到新数据的ACK时,设置CWND=ssthresh,然后恢复拥塞避免阶段。
总结
拥塞避免机制遵循以下三个原则
1.丢包事件意味着拥塞的发生。
2.未发生拥塞时会增加拥塞窗口长度。
3.带宽探测。当无拥塞时传输速率增加,当拥塞发生时速率后退并重新开始增加以此来保持最佳的SWND。