TCP拥塞控制和流量控制

一:流量控制

什么是流量控制,流量控制的目的?
如果发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了避免分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是为了防止分组丢失,他是构成TCP可靠性的一方面。
如何实现流量控制?
由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。 主要的方式就是接收方返回的ACK中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送。
流量控制引发的死锁?怎么避免死锁的发生?
当发送者收到了一个窗口为0的应答,发送者便停止发送,等待接收者的下一个应答。在之后接收者有足够的缓存使用,会给发送方一个窗口不为0的应答,但是如果这个窗口不为0的应答在传输过程丢失,发送者会一直等待下去,而接收者以为发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。
为了避免流量控制引发的死锁,TCP使用了持续计时器。每当发送者收到一个0窗口的应答后就启动该计时器,时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回0窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。

二:拥塞控制和流量控制的区别

拥塞控制:拥塞控制是作用于网络的,同时防止过多的数据注入到网络中,避免出现网络负载过大的情况。常用的方法是:(1)慢开始、拥塞避免(2)快重传、快恢复。
流量控制:流量控制是作用于接收者的,他是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。

三:拥塞控制的算法

我们在开始假定:1、数据是单方向传递,另一个窗口只发送确认;2、接收方的缓存足够大,因此发送方的大小由网络的拥塞程度来决定。
(一)慢开始算法:
发送方维持一个叫拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口,另外考虑到接收方的接收能力,发送窗口可能小于拥塞窗口。
慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由大到小逐渐增加拥塞窗口的大小。
这里用报文段的个数作为拥塞窗口的大小举例说明慢开始算法,实际的拥塞窗口大小是以字节为单位的。如下图:
TCP拥塞控制和流量控制
由上图可以看到,一个传输轮次所经历的时间其实就是往返时间RTT,而且
每经过一个传输轮次,拥塞窗口cwnd就加倍。
为了防止cwnd增长过大引起网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法如下:

  • 当cwnd<ssthresh时,使用慢开始算法
  • 当cwnd>ssthresh时,使用拥塞避免算法
  • 当cwnd=ssthresh时,慢开始与拥塞避免算法任意

注意,这里的“慢”并不是指cwnd的增长速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,然后逐渐增大,这当然比按照大的cwnd一下子把许多报文段突然注入网络中要“慢得多”。
(二)拥塞避免算法:
拥塞避免算发让拥塞窗口cwnd缓慢增长,即每经过一个往返时间RTT就把发送方的cwnd+1,而不是加倍。这样拥塞窗口按线性规律缓慢增长。
无论是在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认,虽然没有收到确认可能是其他原因导致的分组丢失,但是因为无法判定,所以都当做拥塞来处理),就把

  • 慢开始门限ssthresh设置为当前cwnd的一半(但不能<2)

  • 然后在把拥塞窗口cwnd重新设置为1

  • 执行慢开始算法
    这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够的时间把队列中积压的分组处理完毕。
    整个拥塞控制的流程如下:
    TCP拥塞控制和流量控制
    (1)拥塞窗口初始化为1个报文段,慢开始门限初始值为16
    (2)执行慢开始算法,指数规律增长到第4轮,即cwnd=16=ssthresh,改为执行拥塞避免算法,cwnd每轮次+1,线性增长。
    (3)假定cwnd=24时,网络出现超时(拥塞),即更新ssthresh=0.5cwnd=12,cwnd=1,并执行慢开始算法。当cwnd=12=ssthresh时,再次执行拥塞避免算法。
    关于乘法减小(Multiplicative Decrease)和加法增大(Additive Increase),常合起来称为(AIMD):

  • 乘法减小:只要发送方判断网络拥塞,就把慢开始门限ssthresh设置为出现拥塞时的cwnd的一半,并执行慢开始算法;

  • 加法增大:指执行拥塞避免算法后,拥塞窗口缓慢线性增长(+1),以防止过早出现拥塞。

注意:拥塞避免并非完全能够避免拥塞,而是使网络比较不容易出现拥塞。
(三)快重传算法:
快重传要求接收方在收到一个失序的报文段后就立即发出重复确认(为的是使早知道有报文段没有到达对方,可以提高网络吞吐量约20%)而不是等到自己发送数据时捎带确认。 快重传算法规定,发送方只要一连收到三个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待这是的重传计时器到期。如下图:
TCP拥塞控制和流量控制
(三)快恢复算法:
快恢复算法配合快重传使用,有以下两个要点:

  • 当发送发连续收到3个重复确认时,就执行“乘法减小”,即更新ssthresh=0.5cwnd,然后更新cwnd=ssthresh(为了防止网络发生拥塞)。但是接下来并不执行慢开始算法,而是执行拥塞避免算法(考虑到如果网络出现拥塞的话就不会收到好几个重复的确认,所以发送方认为现在网络可能没有出现拥塞)。如下图:TCP Reno版本是目前使用最广泛的版本。
    TCP拥塞控制和流量控制
    注意:在采用快恢复算法时,慢开始只是在TCP连接建立时和网络出现超时时才使用。