• TCP-拥塞控制机制


    1、拥塞:计算机网络中的带宽,交换节点中的缓存和处理机制,都是网络资源。在某段时间内,若对网络中某一资源的需求超过了该资源所能提供的可用部分,网络的性能就会变坏。这种情况就叫做拥塞。拥塞发生的主要原因是网络能够提供的资源不足以满足用户的需求,着写资源包括缓存空间,链路带宽容量和中间节点的处理能力。由于互联网的设计机制(任何人任何时间都能共享网络资源)导致其缺乏“接纳控制”能力,因此在网络资源不足时不能限制用户数量,只能靠降低服务质量来继续为用户服务,也就是“尽力而为”服务。但是也不是说增加网路资源,就可以避免网络拥塞。拥塞虽然是由于网络资源的缺乏引起的,但是单纯增加资源并不能避免拥塞的发生。有时增加缓存空间到一定程度时,只会加重拥塞,而不是减轻拥塞,这是因为当数据包经过长期时间排队完成转发时,他们可能早已经超时,从而引起源端超时重发,,而这些数据包还会继续传输到下一个路由器,从而浪费网络资源,加重网络拥塞。事实上,缓存空间不足导致的丢包更多的是拥塞的“症状”而非原因。另外,增加链路宽带及提高处理能力也不能解决拥塞问题。

      例如:我们有四台ABCD主机和一个路由,所有的链路带宽都是1Gbps,如果A和B同时以1Gbps的速率发送数据,则路由的输入速率为2Gbps,从而产生拥塞。避免拥塞的方法是控制AB的发送速率,例如AB都是0.5Gbps,但是如果D此时也是1Gbps速率发送,那么拥塞还是无法避免的,况且用户主机不可能只有四个。所以说用色只是一个动态问题,我们没有办法用一个静态方案去解决,从这个意义上来说,拥塞是不可避免的!

      拥塞是一个全局控制的过程,他不像点对点的流程控制,是一个局部的控制!

    2、TCP的拥塞控制:

    TCP的拥塞控制有4个核心算法组成,慢启动,拥塞避免,快速重传,快速回复

    拥塞控制:在发送方维持着一个拥塞窗口的状态量。拥塞窗口的大小取决于网络的用色成都,并且动态的变化。发送方然自己的发送窗口等于拥塞窗口,另外考虑到接受对方的接受能力,发送窗口可能小于拥塞窗口。

    (1)慢启动:

    早期的开发TCP应用在启动一个链接时候会像网络中发送大量的数据包,这样很容易导致路由器缓存空间耗尽,网络发生拥塞,使得TCP链接的吞吐量急剧下降。由于TCP远端一开始并不知道网络资源当前的利用状况,因此新建立的tcp链接不能一开始就发送大量的数据,而只能逐步增加每次发送的数据量,以避免上述现象的发生。具体来说,当新建立一个连接时,CWND初始化为1个最大报文段(MSS)大小,发送端开始按照拥塞窗口大小发送数据,每当有一个报文被确认,cwnd就增加1个MSS大小。这样cwnd的值就随着网络往返时间(Round trip time,RTT)呈指数级增长,事实上,慢启动的速度一点也不慢,只是他的起点比较低一点儿而已,指数级的增长率是十分快的。

      该算法的思想主要是一种探测一下网路的拥塞程度,就是不要一开始就发送大量的数据,也就是说有小到大逐渐增加(指数)拥塞窗口的大小。

    我们可以简单计算:
    开始    cwnd=1
    经过1个RTT后, cwnd=2*1=2
    经过2个RTT后, cwnd=2*2=4
    经过3个RTT后, cwnd=2*4=8
    如果宽带为W,那么经过RTT*log2W时间就可以占满带宽;

    (2)拥塞避免:

      如果按照上述的慢启动思想不加以控制的话,毫无疑问就会产生网络拥塞,当cwnd很快增长上来的时候,也很快利用了网络的资源,但是cwnd不能一直这样增长,一定要有某一个限制。TCP使用了一个慢启动门限的变量,当cwnd超过该值之后,慢启动结束,进入拥塞避免阶段。对于大多数TCP是吸纳来说,门限的值是65535。拥塞避免的思想就是赚指数增大变为加法线性增大。这样可以避免增长过快导致网络拥塞慢慢的增加调整网络的最佳值。

    慢慢的增加调整到网络的最佳值。
    期具体ssthresh(门限)的用法如下:
    当cwnd<ssthresh时,使用慢开始算法。
    当cwnd>ssthresh时,改用拥塞避免算法。
    当cwnd=ssthresh时,慢开始与拥塞避免算法任意。

     注意:如果当前的cwnd达到慢启动的阀值,则试探性的发送一个segment,如果服务器没有相应,TCP可以认为网络嗯你下降,必须降低慢启动阀值,同时为了避免形式继续恶化,有可能将窗口降低为1。

    (3)快速重传:

    正常情况下,按照上一节讲的消息重传是等到定时器超时(RTO)后在重传,但有时候不需要等那么久也可以重传。比如客户端向服务器发送了5个段数据包。第三个丢失,其他正常,那么客户端会收到3个包2的ACK,而4、5正常到达后会被服务器缓存起来但是不会发送相应包的ACK,因为TCP是基于积累确认机制,以确保丢失的包能被重发,数据接收准确,ACK必须是连续的。这个时候就不必在等待RTO的超时时间了,服务器判断已经丢失了就可以马上快速重传,提高效率。

      快速重传规定,发送发只要一连接受三个重复确认就应当立即重传对方尚未接收到的报文段,而不必继续等待设置重传计时器时间到期。

    (4)快速回复:

      快速回复并不是单独存在的,她是快速重传的后续处理。通常认为客户端接收到3个ACK后,就会开始快速重传,但是如果还有更多的重复ACK呢,这个时候就是快速恢复要做的。

    a、当发送方连续收到三个重复确认时候,就执行乘法减小算法,把门限减半cwnd = ssthresh/2;

    但是接下去斌不执行慢开始算法;

    b、考虑到此时能连续收到3个ACK,说明网络没有用色,执行加法原则,有几个ACK就加几个段的字节数,或者可以将cwnd = ssthresh,直接进入拥塞避免算法。

    问题1:如何检测拥塞?

    首先确定TCP是如何确定网络进入拥塞的,TCP认为网络拥塞的主要依据就是他重传了一个报文段。上面提到TCP对每一个报文段都有一个定时器,成为重传定时器(RTO),当rto超时且还没有得到数据确认,那么TCP就会对该报文段进行重传,当发生超时后,那么出现拥塞的可能性就会很大,当某个报文段可能在网络中某处丢失,并且后续的报文段也没有了消息,在这种情况下,TCP反应就会比较强烈。

    (1)把门限降低为cwnd值得一半;

    (2)把cwnd重新设置为1;

    (3)重新进入慢启动过程;

      可以看出,从整体上来讲,tcp拥塞控制窗口变化的原则就是:aimd。tcp模型中,属于运输层,就是加性增,乘性减。很好的保证了流之间的公平性,因为一旦出现丢包,那么立即减半退避,可以给其他新建的流留有租后的空间,从而保证整个的公平性。

    问题2:为什么客户端每接收到一个ACK,会把cwnd增加一个segment?

      这个是基于管道模型的数据包守恒原则,就是同一时刻在网络上传输的数据包数量是恒定的,只有当旧数据包离开网络之后,才能发送信的数据包,如果发送方接受到一个ACK,呢么认为有一个数据已经离开了网络,于是将拥塞窗口+1,如果网路能够严格遵守该数据包守恒原则,则拥塞的发生会大大减少。

    TCP用色的解决就像是我们生活中的交通堵车?

      其中有俩个原则:1、拥塞不可避免,单纯增加资源并不能避免拥塞的发生;2、数据包守恒原则。如果政府只是花资金修路,拓展公路,并不能避免堵车,因为车的数量是不定的,鹿游记可能有很多,也许一时间段没有车,这时候只能从源头控制。对车流量进行控制;例如限制车辆进入主公路,根据实际的情况,如果某一时间段车辆少,则可以慢慢增加车辆进入该公路段,但是当达到一个阀值,就要放缓车辆进入的速度,并适时的探测整条路的状况,如果情况紧急,则立刻将车流量减少一半,将车流量降到最低,然后再重新回到慢启动状态。

      

  • 相关阅读:
    pinpoint改造支持查询
    pinpoint本地开发——agent
    pinpoint本地开发——collector
    pinpoint本地开发-web模块
    第一个Vert.x程序
    ls bash: cannot create temp file for here-document: No space left on device
    hadoop磁盘空间不均衡的解决办法
    dubbo监控活跃线程数
    mac安装软件运行提示「xxx.app已损坏,打不开.你应该将它移到废纸篓」的解决办法
    python拆分excel脚本
  • 原文地址:https://www.cnblogs.com/yjds/p/8729097.html
Copyright © 2020-2023  润新知