我是靠谱客的博主 优秀小白菜,最近开发中收集的这篇文章主要介绍TCP——拥塞控制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

注意,注意,注意:
1、这是我2018找实习、找工作的总结,是在网上结合很多别人总结文章自己再东拼西凑的,如有错误请大家指出,我再去找资料补充。
2、很多内容来自别人博主,十分感谢,当时摘抄实在太匆忙,有的忘了出处,如有冒犯,侵删。
3、祝各位很闲也有钱。

一般原理

    发生拥塞控制的原因:资源(带宽、交换节点的缓存、处理机)的需求>可用资源。

    作用:拥塞控制就是为了防止过多的数据注入到网络中,这样可以使网络中的路由器或者链路不至于过载。拥塞控制要做的都有一个前提:就是网络能够承受现有的网络负荷。
对比流量控制:拥塞控制是一个全局的过程,涉及到所有的主机、路由器、以及降低网络相关的所有因素。流量控制往往指点对点通信量的控制。是端对端的问题。

    拥塞窗口:发送方为一个动态变化的窗口叫做拥塞窗口,拥塞窗口的大小取决于网络的拥塞程度。发送方让自己的发送窗口=拥塞窗口,但是发送窗口不是一直等于拥塞窗口的,在网络情况好的时候,拥塞窗口不断的增加,发送方的窗口自然也随着增加,但是接受方的接受能力有限,在发送方的窗口达到某个大小时就不在发生变化了。发送方维持一个叫做拥塞窗口CWND(congestion window)的状态变量。发送方的拥塞窗口等于自己发送窗口。

    拥塞控制算法:

  • 慢启动+拥塞避免
  • 慢启动+快重传+快恢复

一、慢启动+拥塞避免

    慢启动算法的思路:主机开发发送数据报时,如果立即将大量的数据注入到网络中,可能会出现网络的拥塞。慢启动算法就是在主机刚开始发送数据报的时候先探测一下网络的状况,如果网络状况良好,发送方每发送一次文段都能正确的接受确认报文段。那么就从小到大的增加拥塞窗口的大小,即增加发送窗口的大小。

实例:开始发送方先设置cwnd(拥塞窗口)=1,发送第一个报文段M1,接收方接收到M1后,发送方接收到接收方的确认后,把cwnd增加到2,接着发送方发送M2、M3,发送方接收到接收方发送的确认后cwnd增加到4,慢启动算法每经过一个传输轮次(认为发送方都成功接收接收方的确认),拥塞窗口cwnd就加倍。

    拥塞避免:为了防止cwnd增加过快而导致网络拥塞,所以需要设置一个慢开始门限ssthresh状态变量(我也不知道这个到底是什么,就认为他是一个拥塞控制的标识),它的用法:
     - 当cwnd < ssthresh,使用慢启动算法,
     - 当cwnd > ssthresh,使用拥塞控制算法,停用慢启动算法。
     - 当cwnd = ssthresh,这两个算法都可以。

    拥塞避免的思路:是让cwnd缓慢的增加而不是加倍的增长,每经历过一次往返时间就使cwnd增加1,而不是加倍,这样使cwnd缓慢的增长,比慢启动要慢的多。

    无论是慢启动算法还是拥塞避免算法,只要判断网络出现拥塞,就要把慢启动开始门限(ssthresh)设置为设置为发送窗口的一半(>=2),cwnd(拥塞窗口)设置为1,然后在使用慢启动算法,这样做的目的能迅速的减少主机向网络中传输数据,使发生拥塞的路由器能够把队列中堆积的分组处理完毕。拥塞窗口是按照线性的规律增长,比慢启动算法拥塞窗口增长块的多。

实例:
1.TCP连接进行初始化的时候,cwnd=1,ssthresh=16。
2.在慢启动算法开始时,cwnd的初始值是1,每次发送方收到一个ACK拥塞窗口就增加1,当ssthresh =cwnd时,就启动拥塞控制算法,拥塞窗口按照规律增长,
3.当cwnd=24时,网络出现超时,发送方收不到确认ACK,此时设置ssthresh=12,(二分之一cwnd),设置cwnd=1,然后开始慢启动算法,当cwnd=ssthresh=12,慢启动算法变为拥塞控制算法,cwnd按照线性的速度进行增长。
在这里插入图片描述

如何检测拥塞?
    首先来看TCP是如何确定网络进入了拥塞状态的,TCP认为网络拥塞的主要依据是它重传了一个报文段。上面提到过,TCP对每一个报文段都有一个定时器,称为重传定时器(RTO),当RTO超时且还没有得到数据确认,那么TCP就会对该报文段进行重传,当发生超时时,那么出现拥塞的可能性就很大,某个报文段可能在网络中某处丢失,并且后续的报文段也没有了消息,在这种情况下,TCP反应比较“强烈”:
    1.把ssthresh降低为cwnd值的一半
    2.把cwnd重新设置为1
    3.重新进入慢启动过程。
    从整体上来讲,TCP拥塞控制窗口变化的原则是AIMD原则,即加法增大、乘法减小。可以看出TCP的该原则可以较好地保证流之间的公平性,因为一旦出现丢包,那么立即减半退避,可以给其他新建的流留有足够的空间,从而保证整个的公平性。

AIMD(加法增大乘法减小)
    1. 乘法减小:无论在慢启动阶段还是在拥塞控制阶段,只要网络出现超时,就是将cwnd置为1,ssthresh置为cwnd的一半,然后开始执行慢启动算法(cwnd<ssthresh)。
    2. 加法增大:当网络频发出现超时情况时,ssthresh就下降的很快,为了减少注入到网络中的分组数,而加法增大是指执行拥塞避免算法后,是拥塞窗口缓慢的增大,以防止网络过早出现拥塞。
    这两个结合起来就是AIMD算法,是使用最广泛的算法。拥塞避免算法不能够完全的避免网络拥塞,通过控制拥塞窗口的大小只能使网络不易出现拥塞。

二、慢启动+快重传+快恢复

快重传(Fast Retransmit)
    1、要求接收方每收到一个失序的报文段后就立即发出重复确认而不是等待自己发送数据时才捎带确认
    2、发送方只要一连收到三个重复确认就立即重传对方尚未收到的报文段,而不必等待设置的重传计时器到期
在这里插入图片描述

    有的快重传实现把开始时的拥塞窗口cwnd设置为ssthresh+3*MSS的字节数值,原因是认为收到三个重复确认后,表明网络中已经有三个分组离开了,证明现在网络中并没有堆积分组,因此适当增大拥塞窗口

快恢复(Fast Recovery)

    当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把慢开始门限ssthresh减半,为了预防网络拥塞
    将拥塞窗口cwnd值设置为慢开始门限ssthresh减半后的数值,然后开始执行拥塞避免算法
在这里插入图片描述
TCP Tahoe版本与TCP Reno版本的区别:Reno版本在快重传之后采用快恢复算法而不是采用慢开始算法

总结

    1、采用快恢复算法时,慢开始算法只是在TCP建立连接和网络出现超时时才使用
    2、接收方根据自己的接收能力设定了接收窗口rwnd,将此窗口值写入TCP首部传送给对方。结合拥塞控制,发送方的发送窗口一定不能大于接收方给出的接收窗口且一定不能大于自己的拥塞窗口
    3、发送方的发送窗口的上限值 = Min[rwnd, cwnd]

补充:随机早期检测RED

    以上的拥塞避免算法并没有和网络层联系起来,实际上网络层的策略对拥塞避免算法影响最大的就是路由器的丢弃策略。在简单的情况下路由器通常按照先进先出的策略处理到来的分组。当路由器的缓存装不下分组的时候就丢弃到来的分组,这叫做尾部丢弃策略。这样就会导致分组丢失,发送方认为网络产生拥塞。更为严重的是网络中存在很多的TCP连接,这些连接中的报文段通常是复用路由路径。若发生路由器的尾部丢弃,可能影响到很多条TCP连接,结果就是这许多的TCP连接在同一时间进入慢开始状态。这在术语中称为全局同步。全局同步会使得网络的通信量突然下降很多,而在网络恢复正常之后,其通信量又突然增大很多。
    为避免发生网路中的全局同步现象,路由器采用随机早期检测(RED:randomearly detection)。该算法要点如下:
    使路由器的队列维持两个参数,即队列长队最小门限min和最大门限max,每当一个分组到达的时候,RED就计算平均队列长度。然后分情况对待到来的分组:
  ①平均队列长度小于最小门限——把新到达的分组放入队列排队。
  ②平均队列长度在最小门限与最大门限之间——则按照某一概率将分组丢弃。
  ③平均队列长度大于最大门限——丢弃新到达的分组。
    RED不是等到已经发生拥塞后才把所有队列尾部的分组全部丢弃,而是在检测到网络拥塞的早期征兆时(即路由器的平均队列长度超过一定门限值时),以概率p随机丢弃分组,让拥塞控制只在个别的TCP连接上执行,因而避免全局性的拥塞控制。
    RED的关键就是选择三个参数最小门限、最大门限、丢弃概率和计算平均队列长度。最小门线必须足够大,以保证路由器的输出链路有较高的利用率。而最大门限和最小门限只差也应该足够大,是的在一个TCP往返时间RTT中队列的正常增长仍在最大门限之内。经验证明:使最大门限等于最小门限的二倍是合适的。
在这里插入图片描述
    平均队列长度采用加权平均的方法计算平均队列长度,这和往返时间(RTT)的计算策略是一样的。
在这里插入图片描述

最后

以上就是优秀小白菜为你收集整理的TCP——拥塞控制的全部内容,希望文章能够帮你解决TCP——拥塞控制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(64)

评论列表共有 0 条评论

立即
投稿
返回
顶部