TCP/IP详解--拥塞控制 & 慢启动 快恢复 拥塞避免

TCP的拥塞控制算法

1.  拥塞:即对资源的需求超过了可用的资源。若网络中许多资源同时供应不足,网络的性能就要明显变坏,整个网络的吞吐量随之负荷的增大而降低。缓存

    拥塞控制:防止过多的数据注入到网络中,这样可使网络中的路由器或链路不致过载。拥塞控制所要作的都有一个前提:网络可以承受现有的网络负荷。拥塞控制是一个全局性的过程,涉及到全部的主机、路由器,以及与下降网络传输性能有关的全部因素。网络

    流量控制:指点对点通讯量的控制,是端到端正的问题。流量控制所要作的就是抑制发送端发送数据的速率,以便使接收端来得及接收。性能

    拥塞控制代价:须要得到网络内部流量分布的信息。在实施拥塞控制以前,还须要在结点之间交换信息和各类命令,以便选择控制的策略和实施控制。这样就产生了额外的开销。拥塞控制还须要将一些资源分配给各个用户单独使用,使得网络资源不能更好地实现共享。spa

2. 几种拥塞控制方法.net

    慢开始( slow-start )、拥塞避免( congestion avoidance )、快重传( fast retransmit )和快恢复( fast recovery )。blog

2.1 慢开始和拥塞避免队列

    发送方维持一个拥塞窗口 cwnd ( congestion window )的状态变量。拥塞窗口的大小取决于网络的拥塞程度,而且动态地在变化。发送方让本身的发送窗口等于拥塞。资源

    发送方控制拥塞窗口的原则是:只要网络没有出现拥塞,拥塞窗口就再增大一些,以便把更多的分组发送出去。但只要网络出现拥塞,拥塞窗口就减少一些,以减小注入到网络中的分组数。路由

    慢开始算法:当主机开始发送数据时,若是当即所大量数据字节注入到网络,那么就有可能引发网络拥塞,由于如今并不清楚网络的负荷状况。所以,较好的方法是 先探测一下,即由小到大逐渐增大发送窗口,也就是说,由小到大逐渐增大拥塞窗口数值。一般在刚刚开始发送报文段时,先把拥塞窗口 cwnd 设置为一个最大报文段MSS的数值。而在每收到一个对新的报文段的确认后,把拥塞窗口增长至多一个MSS的数值。用这样的方法逐步增大发送方的拥塞窗口 cwnd ,可使分组注入到网络的速率更加合理。

 

每通过一个传输轮次,拥塞窗口 cwnd 就加倍。一个传输轮次所经历的时间其实就是往返时间RTT。不过“传输轮次”更增强调:把拥塞窗口cwnd所容许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。

另,慢开始的“慢”并非指cwnd的增加速率慢,而是指在TCP开始发送报文段时先设置cwnd=1,使得发送方在开始时只发送一个报文段(目的是试探一下网络的拥塞状况),而后再逐渐增大cwnd。

    为了防止拥塞窗口cwnd增加过大引发网络拥塞,还须要设置一个慢开始门限ssthresh状态变量(如何设置ssthresh)。慢开始门限ssthresh的用法以下:

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

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

    当 cwnd = ssthresh 时,既可以使用慢开始算法,也可以使用拥塞控制避免算法。

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

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

    以下图,用具体数值说明了上述拥塞控制的过程。如今发送窗口的大小和拥塞窗口同样大。

<1>. 当TCP链接进行初始化时,把拥塞窗口cwnd置为1。前面已说过,为了便于理解,图中的窗口单位不使用字节而使用报文段的个数。慢开始门限的初始值设置为16个报文段,即 cwnd = 16 。

<2>. 在执行慢开始算法时,拥塞窗口 cwnd 的初始值为1。之后发送方每收到一个对新报文段的确认ACK,就把拥塞窗口值另1,而后开始下一轮的传输(图中横坐标为传输轮次)。所以拥塞窗口cwnd 随着传输轮次按指数规律增加。当拥塞窗口cwnd增加到慢开始门限值ssthresh时(即当cwnd=16时),就改成执行拥塞控制算法,拥塞窗口按线 性规律增加。

<3>. 假定拥塞窗口的数值增加到24时,网络出现超时(这极可能就是网络发生拥塞了)。更新后的ssthresh值变为12(即变为出现超时时的拥塞窗口数值 24的一半),拥塞窗口再从新设置为1,并执行慢开始算法。当cwnd=ssthresh=12时改成执行拥塞避免算法,拥塞窗口按线性规律增加,每通过 一个往返时间增长一个MSS的大小。

强调:“拥塞避免”并不是指彻底可以避免了拥塞。利用以上的措施要彻底避免网络拥塞仍是不可能的。“拥塞避免”是说在拥塞避免阶段将拥塞窗口控制为按线性规律增加,使网络比较不容易出现拥塞。

 

2.2 快重传和快恢复

 

2.2 快重传和快恢复

    若是发送方设置的超时计时器时限已到但尚未收到确认,那么极可能是网络出现了拥塞,导致报文段在网络中的某处被丢弃。这时,TCP立刻把拥塞窗口 cwnd 减少到1,并执行慢开始算法,同时把慢开始门限值ssthresh减半。这是不使用快重传的状况。

    快重传算法首先要求接收方每收到一个失序的报文段后就当即发出重复确认(为的是使发送方及早知道有报文段没有到达对方)而不要等到本身发送数据时才进行捎带确认。

接收方收到了M1和M2后都分别发出了确认。如今假定接收方没有收到M3但接着收到了M4。显然,接收方不能确认M4,由于M4是收到的失序报文段。根据 可靠传输原理,接收方能够什么都不作,也能够在适当时机发送一次对M2的确认。但按照快重传算法的规定,接收方应及时发送对M2的重复确认,这样作可让 发送方及早知道报文段M3没有到达接收方。发送方接着发送了M5和M6。接收方收到这两个报文后,也还要再次发出对M2的重复确认。这样,发送方共收到了 接收方的四个对M2的确认,其中后三个都是重复确认。快重传算法还规定,发送方只要一连收到三个重复确认就应当当即重传对方还没有收到的报文段M3,而没必要 继续等待M3设置的重传计时器到期。因为发送方尽早重传未被确认的报文段,所以采用快重传后可使整个网络吞吐量提升约20%。

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

    <1>. 当发送方连续收到三个重复确认,就执行“乘法减少”算法,把慢开始门限ssthresh减半。这是为了预防网络发生拥塞。请注意:接下去不执行慢开始算法。

    <2>. 因为发送方如今认为网络极可能没有发生拥塞,所以与慢开始不一样之处是如今不执行慢开始算法(即拥塞窗口cwnd如今不设置为1),而是把cwnd值设置为 慢开始门限ssthresh减半后的数值,而后开始执行拥塞避免算法(“加法增大”),使拥塞窗口缓慢地线性增大。

    下图给出了快重传和快恢复的示意图,并标明了“TCP Reno版本”。

    区别:新的 TCP Reno 版本在快重传以后采用快恢复算法而不是采用慢开始算法。

 

 也有的快重传实现是把开始时的拥塞窗口cwnd值再增大一点,即等于 ssthresh + 3 X MSS 。这样作的理由是:既然发送方收到三个重复的确认,就代表有三个分组已经离开了网络。这三个分组再也不消耗网络 的资源而是停留在接收方的缓存中。可见如今网络中并非堆积了分组而是减小了三个分组。所以能够适当把拥塞窗口扩大了些。

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

    采用这样的拥塞控制方法使得TCP的性能有明显的改进。

    接收方根据本身的接收能力设定了接收窗口rwnd,并把这个窗口值写入TCP首部中的窗口字段,传送给发送方。所以,接收窗口又称为通知窗口。所以,从接收方对发送方的流量控制的角度考虑,发送方的发送窗口必定不能超过对方给出的接收窗口rwnd 。

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

    当rwnd < cwnd 时,是接收方的接收能力限制发送方窗口的最大值。

    当cwnd < rwnd 时,则是网络的拥塞限制发送方窗口的最大值。


来源:http://blog.csdn.net/yusiguyuan/article/details/22847787