传输层拥塞控制

梦想不抛弃苦心追求的人,只要不停止追求,你们会沐浴在梦想的光辉之中。再美好的梦想与目标,再完美的计划和方案,如果不能尽快在行动中落实,最终只能是纸上谈兵,空想一番。只要瞄准了大方向,坚持不懈地做下去,才能够扫除挡在梦想前面的障碍,实现美好的人生蓝图。传输层拥塞控制,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、拥塞控制原理

拥塞控制方法

  • 端到端拥塞控制

    • 没有来自网络的显示反馈
    • 端系统系统延迟和丢失时间推断是否有拥塞
    • TCP采用这种方法
  • 网络辅助的拥塞控制

    • 路由器提供给端系统以反馈信息
      • 单个bit位置,显示有拥塞(SNA,DECbit TCP/IP ECN,ATM)
      • 显示提供发送端可以采用的速率

二、TCP拥塞控制

发送方的TCP拥塞机制跟踪一个额外的变量,即拥塞窗口(congestion window),表示为cwnd,它对TCP发送方能够向网络中发送流量的速率进行控制。

TCP拥塞窗口的长度与流量控制接收窗口长度相结合(滑动窗口):

在一个发送方中,未被确认的数据量不能超过cwnd和rwnd(recive window)的最小值

LastByteSend – LastByteAck <= min{cwnd,rwnd}

拥塞判断

TCP采用端到端的拥塞控制,通过发送方的“丢包事件”来定义:确认超时或收到来自接收方的3个冗余ACK。

TCP发送方通过如下原则确定发送速率使得网络既不会阻塞,又能充分利用可用带宽:

  • 一个丢失的报文段意味着拥塞,因此当丢失报文段时应当降低TCP发送方的速率

    丢失可能是由于网络节点的缓存队列满了导致的丢失,也可能是由于请求头bit错位,服务端没法解析导致的丢失。

    对于后者,概率本来就很小,加之TCP网络减速后还有相应的策略探测进行加速

  • 一个确认报文段段指示网络正在向接收方交付发送方的报文,因此,当对先前发送的未确认报文段确认到达时,能够增加发送方的速率。

    确认的到达是一切顺利的隐含指示,表示该网络不拥塞,可以适当增加拥塞窗口长度

  • 带宽探测。给定ACK指示源到目标路径无拥塞,丢包或者冗余ACK指示路径拥塞,TCP调节其传输速率的策略是增加其速率以响应到达的ACK,除非出现拥塞事件才减小传输速率。

TCP拥塞控制算法

该算法主要包含3部分:慢启动、拥塞避免、快速恢复。其中慢启动和拥塞避免是TCP的强制部分,两者的区别在于收到ACK时,增加cwnd长度的方式

  • 慢启动

    当TCP连接建立后,第一次发送数据时,cwnd的值通常设置为一个MSS的较小值,收到一个ACK确认后,拥塞窗口长度就增加一个MSS,发送两个MSS长度的报文段,这两个报文段再收到两个ACK后,每个确认报文都会使发送方拥塞窗口再增加一个MSS,变成4个MSS,并这样依次下去。慢启动过程,拥塞窗口长度的增长是指数形式。

    当出现拥塞时(超时/冗余ACK),TCP策略:

    • 超时

      慢启动出现了超时的情况后,cwnd将被置1,重复慢启动的过程,但在这次慢启动的过程中有一个慢启动阈值ssthresh=原cwnd/2,该值表示如果发送速率达到该值后,发送速率不能再以指数形式增长了,而要采用保守的策略,结束慢启动并且TCP转移到拥塞避免模式

    • 冗余ACK

      如果慢启动出现了3次冗余ACK,则说明当前通道即将阻塞,则将cwnd置为原来的1/2,然后结束慢启动,TCP执行快速重传,进入快速恢复状态

  • 拥塞避免

    一旦进入拥塞避免模式,cwnd的值大约为上次拥塞时cwnd值的一半,即距离拥塞用不遥远了!。这时不能再采用每过一个RTT就将cwnd翻倍的策略,而是要采用一种保守的策略,每过一个RTT,就将cwnd的长度值增加一个MSS。

    具体实现(通用方式):假设MSS是1460字节,cwnd是14600字节,则在要给RTT内发送10个报文段,每个到达的ACK增加1/10MSS的拥塞窗口长度,对所有的10个报文确认后,则增加一个MSS长度的拥塞窗口

    当拥塞避免出现超时,则重新计算拥塞阈值,然后进入慢启动过程

    当拥塞避免出现了丢包(收到三个冗余ACK)的情况,cwnd的值会加上三个MSS,然后将ssthresh的值记录为cwnd的一半,然后进入快速恢复模式

  • 快速恢复

    对于引起TCP进入快速恢复状态的冗余ACK,对于收到的每个冗余的ACK,cwnd的值都增加一个MSS。当收到三个冗余的ACK后,进入快速恢复状态,将ssthresh设置为cwnd的一半,重复类似拥塞避免的操作。如果在快速恢复出现了超时,则执行如同在慢启动和拥塞避免中相同的动作后,迁移到慢启动状态:cwnd的值被设置成1,并将ssthresh设置为cwnd的一半。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/153689.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!