TCP流量控制、拥塞控制

一:流量控制

什么是流量控制?流量控制的目的?算法

若是发送者发送数据过快,接收者来不及接收,那么就会有分组丢失。为了不分组丢失,控制发送者的发送速度,使得接收者来得及接收,这就是流量控制。流量控制根本目的是防止分组丢失,它是构成TCP可靠性的一方面。缓存

如何实现流量控制?markdown

由滑动窗口协议(连续ARQ协议)实现。滑动窗口协议既保证了分组无差错、有序接收,也实现了流量控制。主要的方式就是接收方返回的 ACK 中会包含本身的接收窗口的大小,而且利用大小来控制发送方的数据发送。网络

流量控制引起的死锁?怎么避免死锁的发生?spa

当发送者收到了一个窗口为0的应答,发送者便中止发送,等待接收者的下一个应答。可是若是这个窗口不为0的应答在传输过程丢失,发送者一直等待下去,而接收者觉得发送者已经收到该应答,等待接收新数据,这样双方就相互等待,从而产生死锁。
为了不流量控制引起的死锁,TCP使用了持续计时器。每当发送者收到一个零窗口的应答后就启动该计时器。时间一到便主动发送报文询问接收者的窗口大小。若接收者仍然返回零窗口,则重置该计时器继续等待;若窗口不为0,则表示应答报文丢失了,此时重置发送窗口后开始发送,这样就避免了死锁的产生。code

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

拥塞控制:拥塞控制是做用于网络的,它是防止过多的数据注入到网络中,避免出现网络负载过大的状况;经常使用的方法就是:( 1 )慢开始、拥塞避免( 2 )快重传、快恢复。orm

流量控制:流量控制是做用于接收者的,它是控制发送者的发送速度从而使接收者来得及接收,防止分组丢失的。队列

三:拥塞控制的算法

咱们在开始假定:一、数据是单方向传递,另外一个窗口只发送确认;二、接收方的缓存足够大,所以发送方的大小的大小由网络的拥塞程度来决定。ip

(一)慢开始算法:路由

发送方维持一个叫作拥塞窗口cwnd(congestion window)的状态变量。拥塞窗口的大小取决于网络的拥塞程度,而且动态地在变化。发送方让本身的发送窗口等于拥塞窗口,另外考虑到接受方的接收能力,发送窗口可能小于拥塞窗口。

慢开始算法的思路就是,不要一开始就发送大量的数据,先探测一下网络的拥塞程度,也就是说由小到大逐渐增长拥塞窗口的大小。

这里用报文段的个数做为拥塞窗口的大小举例说明慢开始算法,实际的拥塞窗口大小是以字节为单位的。以下图:


从上图能够看到,一个传输轮次所经历的时间其实就是往返时间RTT,并且没通过一个传输轮次(transmission round),拥塞窗口cwnd就加倍。

为了防止cwnd增加过大引发网络拥塞,还需设置一个慢开始门限ssthresh状态变量。ssthresh的用法以下:当cwnd<ssthresh时,使用慢开始算法。
当cwnd>ssthresh时,改用拥塞避免算法。
当cwnd=ssthresh时,慢开始与拥塞避免算法任意

注意,这里的“慢”并非指cwnd的增加速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,而后逐渐增大,这固然比按照大的cwnd一会儿把许多报文段忽然注入到网络中要“慢得多”。

(二)拥塞避免算法:

拥塞避免算法让拥塞窗口缓慢增加,即每通过一个往返时间RTT就把发送方的拥塞窗口cwnd加1,而不是加倍。这样拥塞窗口按线性规律缓慢增加。

不管是在慢开始阶段仍是在拥塞避免阶段,只要发送方判断网络出现拥塞(其根据就是没有按时收到确认,虽然没有收到确承认能是其余缘由的分组丢失,可是由于没法断定,因此都当作拥塞来处理),就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半(但不能小于2)。而后把拥塞窗口cwnd从新设置为1,执行慢开始算法。这样作的目的就是要迅速减小主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

整个拥塞控制的流程以下图:


(1)拥塞窗口cwnd初始化为1个报文段,慢开始门限初始值为16
(2)执行慢开始算法,指数规律增加到第4轮,即cwnd=16=ssthresh,改成执行拥塞避免算法,拥塞窗口按线性规律增加
(3)假定cwnd=24时,网络出现超时(拥塞),则更新后的ssthresh=12,cwnd从新设置为1,并执行慢开始算法。当cwnd=12=ssthresh时,改成执行拥塞避免算法

关于 乘法减少(Multiplicative Decrease)和加法增大(Additive Increase):

“乘法减少”指的是不管是在慢开始阶段仍是在拥塞避免阶段,只要发送方判断网络出现拥塞,就把慢开始门限ssthresh设置为出现拥塞时的发送窗口大小的一半,并执行慢开始算法,因此当网络频繁出现拥塞时,ssthresh降低的很快,以大大减小注入到网络中的分组数。“加法增大”是指执行拥塞避免算法后,使拥塞窗口缓慢增大,以防止过早出现拥塞。常合起来成为AIMD算法。

注意:“拥塞避免”并不是彻底可以避免了阻塞,而是使网络比较不容易出现拥塞。

(三)快重传算法:

快重传要求接收方在收到一个失序的报文段后就当即发出重复确认(为的是使发送方及早知道有报文段没有到达对方,可提升网络吞吐量约20%)而不要等到本身发送数据时捎带确认。快重传算法规定,发送方只要一连收到三个重复确认就应当当即重传对方还没有收到的报文段,而没必要继续等待设置的重传计时器时间到期。以下图:


(四)快恢复算法:

快重传配合使用的还有快恢复算法,有如下两个要点:

当发送方连续收到三个重复确认时,就执行“乘法减少”算法,把ssthresh门限减半(为了预防网络发生拥塞)。可是接下去并不执行慢开始算法
考虑到若是网络出现拥塞的话就不会收到好几个重复的确认,因此发送方如今认为网络可能没有出现拥塞。因此此时不执行慢开始算法,而是将cwnd设置为ssthresh减半后的值,而后执行拥塞避免算法,使cwnd缓慢增大。以下图:TCP Reno版本是目前使用最普遍的版本。


注意:在采用快恢复算法时,慢开始算法只是在TCP链接创建时和网络出现超时时才使用

相关文章
相关标签/搜索