TCP的拥塞控制

一、拥塞控制原理

 1、概念

      在计算机网络中的链路容量(即带宽)、交换节点中的缓存和处理机等,都是网络的资源。在某段时间,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会要变坏。这种情况叫做拥塞。

2、原理

     拥塞控制和流量控制密切相关,所谓拥塞控制就是防止过多的数据注入到网络中,这样可以使网络中的路由器或链路不致过载。拥塞控制所要做的都有一个前提,就是网络能够承受现有的网络负荷。拥塞控制是一个全局性的过程。相反,流量控制往往是指点对点通信量的控制,是个端对端的问题。流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收。

     我们来看看下面这幅图,横坐标代表提供的负载,表示单位时间内输入给网络的分组数目。因此提供的负载也称为输入负载或网络负载。纵坐标是吞吐量,代表单位时间内从网络输出的分组数目。

            观察上图我们可以发现,随着提供的负载增大,网络吞吐量的增长速率越来越小。也就是说在还没有达到饱和的时候,就已经有一部分的输入分组已经丢弃了。当网络的吞吐量明显小于理想的吞吐量时,网络就进入了轻度拥塞的状态。更值得注意的是,当提供的负载达到某一个数值时,网络的吞吐量反而随提供的负载的增大而下降,这时网络就进入了拥塞状态。当提供的负载继续增大到某一个数值时,网络的吞吐量就下降到0,网络已无法工作,这就是所谓的死锁。

3、解决思路

1)开环控制

     这个是在设计网络时,就实现将有关发生拥塞的因素考虑到,力求网络工作时不产生拥塞。但一旦整个系统运行起来,就不再中途进行修改了。

2)闭环控制

     a)监测网络系统以便检查到拥塞在何时、何处发生。

     b) 把拥塞发生的信息传送到可采取行动的地方。

     c) 调整整个网络系统的运行以解决出现的问题。

二、拥塞控制方法

1、慢开始


发送方维持一个叫做拥塞窗口的状态变量。拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化。发送方让自己的发送窗口等于拥塞窗口。以后我们就知道,如果再考虑到接收方的接受能力,那么发送窗口还可能小于拥塞窗口。

慢开始算法思路,当主机开始发送数据的时候,如果立即把大量数据字节注入到网络,那么就有可能引起网络拥塞,因为现在并不清楚网络的符合情况。所以我们的慢开始算法采取有小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口的数值。通常我们最开始的时候将cwnd设置为一个最大报文段MMS的生猪。而在收到每一个报文段确认之后,把拥塞窗口增加之多一个MSS。这样采取逐步增大的方法增大发送方的拥塞窗口cwnd,可以让分组注入到网络的速率更加合理。注意,这里为了方便起见,我们用报文段的个数作为窗口大小的单位。

每经过一个传输轮次,我们的cwnd就加倍。什么是传输轮次呢,就是我们将cwnd所允许发送的报文段都发出去,所经过的往返时间,也就是RTT。例如我们最开允许发送一个报文段M1,收到M1确认后,我们cwnd+1,变成2了,我们这次发两个,可以收到两个对报文段的确认,所以cwnd+=2,变成4了!慢开始的慢,指的是从仅仅发送一个报文段开始,然后收到确认加1,并不马上把所有报文段都一次性全部注入网络,避免引起网络拥塞。

2、拥塞避免

为了防止拥塞窗口增长过大,我们需要设置一个慢开始门限,也就是到这个门限之后慢开始,结束,我们选择使用拥塞避免算法。拥塞避免的思想是降低我们拥塞窗口cwnd的增长速度。本来按照慢开始算法,每经过一个传输轮次,我们cwnd本来是加倍,但是我们现在每个传输轮次,我们将cwnd仅仅+1,这样就限制了增长速度。

我们门限值的作用如下:

cwnd<ssthresh时,使用上述的慢开始算法。

cwnd>ssthresh时,停止使用慢开始算法,而改用拥塞避免算法。

Cwnd=ssthresh时,即可使用慢开始算法,也可使用拥塞避免算法。

因此在拥塞避免阶段就有加法增大的特点。

我们可以看一下图,更好的理解

 

ssthresh=16时,就开始拥塞避免算法。然后我们在ssthresh=24,网络出现了超时,发送方判断为网络拥塞,于是调整门限值ssthresh=cwnd/2=12,同时设置拥塞窗口cwnd=1,进入慢开始阶段。当拥塞窗口cwnd=ssthresh=12时,改为执行拥塞避免算法,拥塞窗口按线性规律增大。

3、快重传和开恢复

这个是当网络拥塞可能已经发生的时候我们采取的解决方法。

我们可以看到当我们出现超时重传的时候立马把门限值降为原来的一半,又执行慢开始算法,其实这不太合理。也许我们网络并没有拥塞,只是有一个报文出现了丢失,但是这样立马把cwnd=1,然后执行慢开始,其实降低了网络的利用率。所以我们采取的方式是快重传和快恢复的方式。

快重传算法原理是可以让发送方尽早知道发生了个别报文段的丢失,快重传算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到失序报文也要立即发出对已收到报文段的重复确认,以便发送方知道接收方没有手打M3

  

我们可以看到我们M3的数据丢失,我们的接收方收到失序的数据后,还是会发送M2的确认,这样我们就收到了4M2的确认,3个重复了,快重传规定,只要收到了连续三个的重复确认,就立即进行重传,这样就不会出现超时,发送方也不会认为是网络拥塞了。

我们现在在看一个图   

 

我们看到在第13个传输轮次的时候,执行了快重传算法,我们饿知道可能只是个别报文丢失了,所以并不执行慢开始算法,而是将我们的快恢复算法。发送方调整门限值ssthresh=cwnd/2=8,同时设置拥塞窗口cwnd=ssthresh=8,并开始执行拥塞避免算法。

请注意,也有的快恢复算法实现时把快恢复开始的拥塞窗口cwnd值再增大一点,即等于新的ssthresh+3*MSS。这样做的理由是:既然发送方收到3个重复的确认,就表明有3个分组已经离开了网络。这3个分组不再消耗网络资源,而是听力在接收方的缓存中。可将现在网络中并不是堆积了分组而是减少了3个分组。因此可以适当把拥塞窗口扩大些。

我们再来看一个图

 

从接受方对发送方的流量控制的角度考虑,发送方的发送窗口一定不能超过对方给出的接收方窗口值rwnd

发送方窗口的上限值=Min[rwnd,cwnd]

rwnd<cwnd,是接收方的接受能力显示发送方窗口的最大值。

反之,当cwnd<rwnd时,则网络的拥塞程度限制发送方窗口的最小值。也就是说,rwndcwnd中数值较小的一个,控制了发送方发送数据的速率。

猜你喜欢

转载自blog.csdn.net/betty2017/article/details/78705187