拥塞控制

概念

拥塞控制是TCP避免网络拥塞的算法,是互联网上主要的一个拥塞控制措施。主要的目标是提高网络利用率降低丢包率保证网络资源对每条数据流的公平性*。它使用一套基于线增积减模式的多样化网络拥塞控制方法(包括慢启动和拥塞窗口等模式)来控制拥塞。在互联网上应用中有相当多的具体实现算法。

拥塞算法

TCP Tahoe/Reno

最初的实现,包括慢启动、拥塞避免两个部分。基于重传超时(retransmission timeout/RTO)和重复确认为条件判断是否发生了丢包。
两者的区别在于:
Tahoe算法下如果收到三次重复确认,就进入快重传立即重发丢失的数据包,同时将慢启动阈值设置为当前拥塞窗口的一半,将拥塞窗口设置为1MSS,进入慢启动状态;
Reno算法如果收到三次重复确认,就进入快重传,但不进入慢启动状态,而是直接将拥塞窗口减半,进入拥塞控制阶段,这称为“快恢复”。
而Tahoe和Reno算法在出现RTO时的措施一致,都是将拥塞窗口降为1个MSS,然后进入慢启动阶段。

TCP Vegas

TCP Vegas算法由 Lawrence Brakmo 和 Larry L. Peterson 在1994年提出,它和其他拥塞控制算法的不同之处在于Vegas算法并不急于丢包来判断是否发生了拥塞,而是通过数据包延迟来判断。Vegas通过RTT(roundtrip time)来决定增加或者减小拥塞窗口,它能够拥塞将要发生时就避免拥塞,而不是等到拥塞已经发生之后再减小发送速度,因此能够减小重传和超时的几率。Vegas算法与其他算法(比如Reno)共存时,会由于比其他算法更先降低发送速率而出现公平性问题。

TCP New Reno

TCP New Reno是对TCP Reno中快速恢复阶段的重传进行改善的一种改进算法,其定义于RFC 6582,覆盖了原有在RFC 3782和RFC 2582的旧定义。
在Reno的快恢复中,一旦出现3次重复确认,TCP发送方会重发数据包并设置定时器等待该重发数据包被确认。当重发的数据包被确认后,就立即退出快速恢复阶段,进入拥塞控制阶段。但如果一次拥塞中出现多个丢包,Reno会误以为发生了多次拥塞而重复减小拥塞窗口导致发送速率下降。
而在New Reno的快速恢复中,一旦出现3次重复确认,会记下出现重复确认时未确认的数据包的最大序列号,然后重发重复确认的数据包。如果有多个数据包丢失,则继续重发丢失的数据包,知道最大序列号的数据包被确认才推出快恢复阶段。
New Reno在低错误率时运行效率和“选择确认”(Selective ACKnowledgement,SACK)相当,在高错误率仍优于Reno。

TCP BIC 和 CUBIC

TCP BIC(Binary Increase Congestion control)旨在优化高速高延迟网络(即根据RFC 1072所定义的“长肥网络”(long fat network,LFN))的拥塞控制,其拥塞窗口算法使用二分搜索算法尝试找到能长时间保持拥塞窗口最大值的值。Linux内核在2.6.8至2.6.18使用该算法作为默认TCP拥塞算法。
CUBIC则是比BIC更温和和系统化的分支版本,其使用三次函数代替二分算法作为其拥塞窗口算法,并且使用函数拐点作为拥塞窗口的设置值。Linux内核在2.6.19后使用该算法作为默认TCP拥塞算法。

详细可参考:TCP拥塞控制

Reno算法介绍

主要包含四个部分

  • 慢热启动算法 – Slow Start
  • 拥塞避免算法 – Congestion Avoidance
  • 快速重传 - Fast Retransimit
  • 快速恢复算法 – Fast Recovery

概念术语

  • CWND Congestion Window,拥塞窗口(发送端定义调节发送端的量。跟接收窗口比,那个小取那个)
  • MSS maximum segment size, 指的是TCP传输层的最大传输单元(就是一个包的最大值)
  • RTT, round-trip time, 指的是从发送到接收这一个来回的行程所用的总体时间
慢热启动算法 – Slow Start
  1. 连接建好的开始先初始化cwnd(拥塞窗口)大小为N,表明可以传N个MSS大小的数据。
  2. 每当收到一个ACK,cwnd大小加一,呈线性上升。
  3. 每当过了一个往返延迟时间RTT(Round-Trip Time),cwnd大小直接翻倍,乘以2,呈指数增长。
  4. 还有一个慢启动门限ssthresh(slow start threshold),是一个上限,当cwnd >= ssthresh时,就会进入"拥塞避免算法 - Congestion Avoidance"
    在这里插入图片描述
拥塞避免算法 – Congestion Avoidance
  1. 每收到一个ACK,调整cwnd 为 (cwnd + 1/cwnd) * MSS个字节每当收到一个ACK,cwnd大小加一,呈线性上升。
  2. 每经过一个RTT的时长,cwnd增加1个MSS大小。
    在这里插入图片描述
拥塞状态时的超时重传

TCP是看不到网络的整体状况的,那么TCP认为网络拥塞的主要依据是它重传了报文段出现RTO超时,重传数据包。TCP就认为出现拥塞的可能性就很大,于是它反应非常“强烈”

  1. 由于发生丢包,将慢启动阈值ssthresh设置为当前cwnd的一半,即ssthresh = cwnd / 2.
  2. cwnd重置为1
  3. 进入慢启动过程
    在这里插入图片描述
拥塞状态时的快速重传

在快速重传的时候,一般网络只是轻微拥堵,在进入拥塞避免后,cwnd恢复的比较慢。针对这个,“快速恢复”算法被添加进来,当收到3个冗余ACK时,TCP最后的步骤进入的不是拥塞避免阶段,而是快速恢复阶段。

  1. 调整门限ssthresh的值为当前cwnd值的1/2。
  2. 将cwnd值设置为新的ssthresh的值
  3. 重新进入拥塞避免阶段
    在这里插入图片描述
快速恢复算法 – Fast Recovery

快速恢复的思想是“数据包守恒”原则,即带宽不变的情况下,在网络同一时刻能容纳数据包数量是恒定的。当“老”数据包离开了网络后,就能向网络中发送一个“新”的数据包。既然已经收到了3个冗余ACK,说明有三个数据分段已经到达了接收端,既然三个分段已经离开了网络,那么就是说可以在发送3个分段了。于是只要发送方收到一个冗余的ACK,于是cwnd加1个MSS。快速恢复步骤如下(在进入快速恢复前,cwnd 和 sshthresh已被更新为:sshthresh = cwnd /2,cwnd = sshthresh)

  1. cwnd设置为ssthresh的值加3,重传Duplicated ACKs指定的数据包
  2. 如果再收到 duplicated Acks,那么cwnd = cwnd +1
  3. 如果收到新的ACK,而非duplicated Ack,那么将cwnd重新设置为的sshthresh的值。然后进入拥塞避免状态。
    在这里插入图片描述

细心的同学可能会发现快速恢复有个比较明显的缺陷就是:它依赖于3个冗余ACK,并假定很多情况下,3个冗余的ACK只代表丢失一个包。但是3个冗余ACK也很有可能是丢失了很多个包,快速恢复只是重传了一个包,然后其他丢失的包就只能等待到RTO超时了。超时会导致ssthresh减半,并且退出了Fast Recovery阶段,多个超时会导致TCP传输速率呈级数下降。出现这个问题的主要原因是过早退出了Fast Recovery阶段。为解决这个问题,提出了New Reno算法,该算法是在没有SACK的支持下改进Fast Recovery算法(SACK改变TCP的确认机制,把乱序等信息会全部告诉对方,SACK本身携带的信息就可以使得发送方有足够的信息来知道需要重传哪些包,而不需要重传哪些包),具体改进如下:

  1. 发送端收到3个冗余ACK后,重传冗余ACK指示可能丢失的那个包segment1,如果segment1的ACK通告接收端已经收到发送端的全部已经发出的数据的话,那么就是只丢失一个包,如果没有,那么就是有多个包丢失了。
  2. 发送端根据segment1的ACK判断出有多个包丢失,那么发送端继续重传窗口内未被ACK的第一个包,直到sliding window内发出去的包全被ACK了,才真正退出Fast Recovery阶段。

参考文档:《图解TCP/IP》
参考文档:https://www.zhoulujun.cn/html/theory/ComputerScienceTechnology/network/2015_0708_65.html
参考文档:https://blog.youkuaiyun.com/wdscq1234/article/details/52529994

随着计算机和通信技术的发展,人们对 Internet 的需求已经越来越超乎想象,因此更 多、更合理的控制机制对现有网络的顺畅运作起着非常重要的作用,其中最基本、最关键 的就是拥塞控制,即如何有效防止或消除网络出现的拥塞,使网络基本运行在轻度拥塞的 最佳状态。 网络中的拥塞来源于网络资源和网络流量分布的不均衡性,它不会随着网络处理能力 的提高而消除。到目前为止,拥塞问题始终没有一个完美的解决方案。面对各种复杂的网 络环境,拥塞控制算法不但在设计方面存在一定的困难,在算法的性能评价方面也都缺乏 统一的标准。根据拥塞控制算法的实现位置,主要分为源端算法和链路算法两种:源端算 法在主机和网络边缘设备中执行,作用是根据反馈信息调整发送速率;链路算法在网络设 备(如路由器和交换机)中执行,作用是检测网络拥塞的发生,产生拥塞反馈信息。拥塞 控制算法设计的关键问题是如何生成反馈信息和如何对反馈信息进行响应。 TCP 协议是使用最广泛的源端算法,也是目前在 Internet 中使用最广泛的传输协议。 它包括慢启动、拥塞避免、快速重传和快速恢复四个阶段,其核心的拥塞避免算法采用一 种 AIMD(加性增加乘性减少)的窗口调节机制。TCP 协议从提出到现在虽然经历了几个 版本的不断改进,但在高带宽时延乘积网络不断扩大的今天,它的局限性也愈加明显,尤 其是 TCP 的拥塞控制算法对大的拥塞窗口响应很慢,发生拥塞时又降低窗口过快的问题。 近几年,在 TCP 协议的基础上提出了一些新的改进协议,如:HSTCP、STCP、H-TCP、 Fast-TCP、BIC 和 CUBIC 等,这些协议公布了它们各自的实现机制和算法,并对可扩展 性、带宽利用率、TCP 友好性、稳定性、RTT 公平性等性能进行衡量和评价,使网络的 性能以及解决拥塞问题的灵敏度等方面得到很大程度地改进和提高。虽然这些新的拥塞控 制协议的算法和实现机制各有千秋,但依然还不能说它们中有哪个能很好地解决现在网络 环境中面临的所有问题,真正实现一个简单又鲁棒性更好的拥塞控制协议,因此,端系统 的拥塞控制协议方面的改进依然在不断深入研究和探索的阶段,尤其在协议参数的修改方 面依然是研究的热点,如何在各个性能之间权衡取舍,以使网络能够运行在最佳状态,仍然值得我们去探讨。 本文从 STCP 和 CUBIC 出发,通过大量不同网络环境下的模拟实验,对它们以及 TCP 协议的性能进 行参照对比,得出各协议的拥塞窗口变化、吞吐量、稳定性、TCP 友好性、RTT 公平性等方面的比较 和分析结果,并从中找到契合点,对总体表现更好些的 CUBIC 协议实施改进。在众多实验结果中我 们发现:基于 CUBIC 协议的运行机制,在 TCP 友好性、RTT 公平性方面都明显优于 STCP,在可扩 展性和稳定性方面也表现出很好的性能,但 CUBIC 的拥塞窗口增长过于保守,且波动幅度与 STCP 相比也相对较大,即 CUBIC 在稳定性方面尚有较大的改进空间。STCP 是以稳定性著称的一种机制简 单的拥塞控制协议,基于其在检测到拥塞后的窗口减小机制与 CUBIC 基本一致,我们想到在保留 CUBIC 原有基本机制的情况下,结合 STCP 的窗口增长机制,将 CUBIC 的窗口增量和 STCP 的窗口 增量糅合,并保持 CUBIC 原有的最大、最小增量的限制机制不变,这样就使 CUBIC 窗口增量在原有 的增量限制范围内做合理且适当的提高,试验证明,这个新改进的算法具有比 CUBIC 更好的稳定性, 并在传承了其在可扩展性、TCP 友好性和 RTT 公平性等优点的同时,也能有所提升,这个改进算法就 叫做——SCUBIC。 主要工作有: 1、阅读参考文献,了解拥塞控制基本理论、发展现状,重点对最近提出的基于端算法的新协议进行理 论分析和总结。 2、利用模拟工具 NS-2 重点对 STCP、CUBIC 协议及 TCP 协议进行模拟实验,并结合理论从其可扩展 性、稳定性、TCP 友好性、RTT 公平性方面进行比较分析。 3、针对 STCP 稳定性和可扩展性比 CUBIC 更加优越的特点,提出一种新的改进算法 SCUBIC。通过 实验验证 SCUBIC 增强了拥塞窗口的稳定和带宽使用的平稳度,较大程度地提高了协议的稳定性,同 时在可扩展性、TCP 友好性和 RTT 公平性方面也有所提升。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值