• TCP拥塞控制 (1)


    Basic:

         TCP,传输控制协定,它是目前最广泛使用的网络传输协议。SMTP、SSH、FTP、HTTP等因特网底层协议均是TCP。

         TCP面向连接,提供端到端的数据可靠传输。连接时三次握手。断开是四次挥手。详细表现为:

    1、       TCP对传输的数据做了序号标记,当中序号标记安装字节数增长。

    TCP对端在接收到数据后发出一个ACK给对端(ACK中就包括序列号)。TCP使用确认和超时重传机制保障了数据的可靠性传输。

    2、       因为发送和接收端的数据处理能力不同,为了避免数据发送过快而超过了对端的接收能力。TCP採用了流量控制机制,即在数据包的包头通告自身的接收窗体(可以最多接收的数据包)。

    转折

    TCP看上去已经非常完美。并且TCP開始应用与互联网,直到:

    1986年10月,一件事情的发生使得TCP开启了一个新领域,从美国LBL到UC Berkeley的数据吞吐量从32Kbps下降到40bps,详细能够參见V. Jacobson的论文“Congestion Avoidance and Control

    WHY为啥数据吞吐量下降得如此离谱?

         原来TCP的控制机制仅仅考虑了接收端的接收能力。并未意识到网络本身的传输能力也有痛点。从而导致整个网络的崩溃。

    拥塞

         网络中的有限资源被多个用户使用,并且网络本身并无约束能力。

    并且互联网的爆棚发展,不弄点东西协调受限的资源,结果就是大家都没法用。

    做个啥呢

         当然是能避则避,若是躲不了就勇敢面对。即,拥塞控制算法包含拥塞避免拥塞控制

    打预防针。避免网络进入拥塞状态,尽量使得网络保持在高吞吐量和低延迟的状态;一旦生病。能够打吊瓶。使网络从拥塞状态中恢复出来。又一次进入高吞吐量和低延迟的状态。

    拥塞控制算法

    Jacobson 在1988年的论文中提出的TCP的拥塞控制由慢启动算法和拥塞避免组成,后 来增加了高速重传和高速恢复算法。而后还有大大小小的改进(略)。

    TCP的拥塞控制主要依赖于拥塞窗体(cwnd)。窗体值的大小就代表可以发送出去的但还没有收到ACK的最大数据报文段。显然窗体越大那么数据发送的速度也就越快,可是也有越可能使得网络出现拥塞。假设窗体值为1,每发送一个数据,传输数据效率低下。

    TCP的拥塞控制算法就是要选取权衡点,选取合适的拥塞窗体值。从而在不产生拥塞的情况下使得网络吞吐量最大化

    慢启动算法

         新建立的连接并不会一開始就发送大量的数据包。而是依据网络状况逐步递增每次发送的数量。

    cwnd每次的增量为一个MSS,cwnd的值就随着网络往返时间(Round Trip Time,RTT)呈指数级增长。当cwnd的值大于慢启动门限(ssthresh。一般为65535)后,慢启动过程结束,进入拥塞避免阶段。

    其实,慢启动的速度一点也不慢,仅仅是起点低。

    拥塞避免:

    拥塞避免的主要思想是加法增大,也就是cwnd的值不再指数级往上升。開始加法添加,这样就能够避免增长过快导致网络拥塞,慢慢的添加调整到网络的最佳值。

    实际中,既要考虑拥塞控制。又要兼顾流量控制。因此。TCP真正的发送窗体是拥塞窗体和接收窗体的最小值

    那有个问题就是TCP怎样确定网络进入了拥塞状态呢

         当TCP数据包的定时器超时,且无ACK信号确认,TCP就会进行重传,此时出现拥塞的可能性就非常大。TCP的反应:

    A、      把门限值ssthresh减少为窗体值cwnd的一半。

    B、      把窗体又一次置为一个MSS

    C、      整个状态又回到了起点---慢启动过程

    准则:AIMD原则。和式添加,积式降低。由于一旦出现丢包,那么马上减半退避。能够给其它新建的流留有足够的空间,从而保证整个的公平性

    高速重传

    TCP在收到乱序到达包时就会马上发送ACK,TCP利用3个同样的ACK来判定数据包的丢失,此时进行高速重传。高速重传做的事情有:

    A、      把门限值ssthresh减少为窗体值cwnd的一半。

    B、       把cwnd再设置为ssthresh的值(详细实现有些为ssthresh+3)

    C、       又一次进入拥塞避免阶段

    高速恢复

         高速恢复算法是建立在高速重传的前提下。当收到3个反复ACK时,TCP最后进入的不是拥塞避免阶段。而是高速恢复阶段

    高速恢复的思想是“数据包守恒”原则,即同一个时刻在网络中的数据包数量是恒定的,仅仅有当“老”数据包离开了网络后。才干向网络中发送一个“新”的数据包。(假设发送方收到一个反复的ACK。那么依据TCP的ACK机制就表明有一个数据包离开了网络,于是cwnd递增)。

    高速恢复的主要步骤:

    1.当收到3个反复ACK时,把ssthresh设置为cwnd的一半,把cwnd设置为ssthresh+3,然后重传丢失的报文段。 

    2.再收到反复的ACK时。拥塞窗体添加1。

    3.当收到新的数据包的ACK时,把cwnd设置为第一步中的ssthresh的值。

    原因是由于该ACK确认了新的数据,说明从反复ACK时的数据都已收到,该恢复过程已经结束,再次进入拥塞避免状态。

    TCP的缺陷:

    Internet得到迅猛发展。从100Mbps到1Gbps到10Gbps,TCP的传统的拥塞控制算法根本无法适应。不仅窗体太小。并且将包的丢失解释为网络发生了拥塞。这在快速网络根本无法成立。

    So 。怎么破?接着下一篇。

    參考:http://www.cnblogs.com/fll/archive/2008/06/10/1217013.html

    版权声明:本文博主原创文章。博客,未经同意不得转载。

  • 相关阅读:
    Django--templates(模板层)
    基于 Hive 的文件格式:RCFile 简介及其应用
    Gobblin采集kafka数据
    Scala 中下划线的用途
    Gobblin编译支持CDH5.4.0
    Kafka到Hdfs的数据Pipeline整理
    Hadoop NameNode的ZKFC机制
    Windows下Eclipse提交MR程序到HadoopCluster
    Kettle实现MapReduce之WordCount
    hadoop中MapReduce多种join实现实例分析
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4834145.html
Copyright © 2020-2023  润新知