TCP 的拥塞控制方法

  • TCP 采用基于窗口的方法进行拥塞控制。该方法属于闭环控制方法。
  • TCP发送方维持一个拥塞窗口 CWND (Congestion Window)
    • 拥塞窗口的大小取决于网络的拥塞程度,并且动态地在变化
    • 发送端利用拥塞窗口根据网络的拥塞情况调整发送的数据量。
    • 所以,发送窗口大小不仅取决于接收方公告的接收窗口,还取决于网络的拥塞状况,所以真正的发送窗口值为:
      真正的发送窗口值 = Min(公告窗口值,拥塞窗口值)

控制拥塞窗口的原则

  • 只要网络没有出现拥塞拥塞窗口就可以再增大一些,以便把更多的分组发送出去,这样就可以提高网络的利用率。
  • 但只要网络出现拥塞或有可能出现拥塞,就必须把拥塞窗口减小一些,以减少注入到网络中的分组数,以便缓解网络出现的拥塞。

拥塞的判断

  1. 重传定时器超时
  • 现在通信线路的传输质量一般都很好,因传输出差错而丢弃分组的概率是很小的(远小于 1 %)。只要出现了超时,就可以猜想网络可能出现了拥塞。
  1. 收到三个相同(重复)的 ACK
  • 个别报文段会在网络中丢失,预示可能会出现拥塞(实际未发生拥塞),因此可以尽快采取控制措施,避免拥塞。

TCP拥塞控制算法

四种
1 慢开始 (slow-start)
2 拥塞避免 (congestion avoidance)
3 快重传 (fast retransmit)
4 快恢复 (fast recovery)

慢开始 (Slow start)

  • 用来确定网络的负载能力。
  • 算法的思路:由小到大逐渐增大拥塞窗口数值。
  • 初始拥塞窗口 cwnd 设置:
    • 旧的规定:在刚刚开始发送报文段时,先把初始拥塞窗口cwnd 设置为 1 至 2 个发送方的最大报文段 SMSS (Sender Maximum Segment Size) 的数值。
    • 新的 RFC 5681 把初始拥塞窗口 cwnd 设置为不超过2至4个 SMSS 的数值。
  • 慢开始门限 ssthresh(状态变量):防止拥塞窗口cwnd 增长过大引起网络拥塞。
  • 拥塞窗口 cwnd 控制方法:在每收到一个对新的报文段的确认后,可以把拥塞窗口增加最多一个 SMSS 的数值。
    拥塞窗口cwnd每次的增加量 = min (N, SMSS)
  • 其中 N 是原先未被确认的、但现在被刚收到的确认报文段所确认的字节数。
  • 不难看出,当 N < SMSS 时,拥塞窗口每次的增加量要小于 SMSS。
  • 用这样的方法逐步增大发送方的拥塞窗口 cwnd,可以使分组注入到网络的速率更加合理。

传输轮次

  • 使用慢开始算法后,每经过一个传输轮次(transmission round),拥塞窗口 cwnd 就加倍
  • 一个传输轮次所经历的时间其实就是往返时间 RTT。 “传输轮次”更加强调:把拥塞窗口 cwnd所允许发送的报文段都连续发送出去,并收到了对已发送的最后一个字节的确认。
  • 例如,拥塞窗口 cwnd = 4,这时的往返时间 RTT就是发送方连续发送 4 个报文段,并收到这 4 个报文段的确认,总共经历的时间。

设置慢开始门限状态变量 ssthresh(Slow start threshold )

慢开始门限 ssthresh 的用法如下:

  1. 当 cwnd < ssthresh 时,使用慢开始算法。
  2. 当 cwnd > ssthresh 时,停止使用慢开始算法而改
    拥塞避免算法
  3. 当 cwnd = ssthresh 时,既可使用慢开始算法,也
    可使用拥塞避免算法。

拥塞避免算法

  • 思路:让拥塞窗口 cwnd 缓慢地增大,即每经过一个往返时间 RTT 就把发送方的拥塞窗口cwnd 加 1,而不是加倍,使拥塞窗口 cwnd 按线性规律缓慢增长。
  • 因此在拥塞避免阶段就有“加法增大” (Additive Increase) 的特点。这表明在拥塞避免阶段,拥塞窗口 cwnd 按线性规律缓慢增长,比慢开始算法的拥塞窗口增长速率缓慢得多。

当网络出现拥塞时

无论在慢开始阶段还是在拥塞避免阶段,只要发送方判断网络出现拥塞(重传定时器超时):

  • ssthresh = max(cwnd/2,2)
  • cwnd = 1
  • 执行慢开始算法

这样做的目的就是要迅速减少主机发送到网络中的分组数,使得发生拥塞的路由器有足够时间把队列中积压的分组处理完毕。

慢开始和拥塞避免算法的实现举例


发送端的发送窗口不能超过拥塞窗口 cwnd 和接收端窗口 rwnd 中的最小值。我们假定接收端窗口足够大,因此现在发送窗口的数值等于拥塞窗口的数值

发送方每收到一个对新报文段的确认 ACK,就把拥塞窗口值加 1,然后开始下一轮的传输(请注意,横坐标是传输轮次,不是时间)。因此拥塞窗口 cwnd 随着传输轮次按指数规律增长。

必须强调指出
“拥塞避免”并非指完全能够避免了拥塞。利用以上的措施要完全避免网络拥塞还是不可能的。
“拥塞避免”是说在拥塞避免阶段把拥塞窗口控制为按线性规律增长,使网络比较不容易出现拥塞。



快重传算法

  • 采用快重传FR (Fast Retransmission) 算法可以让发送方尽早知道发生了个别报文段的丢失。
  • 快重传 算法首先要求接收方不要等待自己发送数据时才进行捎带确认,而是要立即发送确认,即使收到了失序的报文段也要立即发出对已收到的报文段的重复确认。
  • 发送方只要一连收到三个重复确认,就知道接收方确实没有收到报文段,因而应当立即进行重传(即“快重传”),这样就不会出现超时,发送方也不就会误认为出现了网络拥塞。
  • 使用快重传可以使整个网络的吞吐量提高约20%。
  • 不难看出,快重传并非取消重传计时器,而是在某些情况下可更早地重传丢失的报文段。

快恢复算法

当发送端收到连续三个重复的确认时,由于发送方现在认为网络很可能没有发生拥塞,因此现在不执行慢开始算法,而是执行快恢复算法 FR (Fast Recove•) 算法:
(1) 慢开始门限 ssthresh = 当前拥塞窗口 cwnd / 2 ;
(2) 新拥塞窗口 cwnd = 慢开始门限 ssthresh ;
(3) 开始执行拥塞避免算法,使拥塞窗口缓慢地线性增大。

AIMD:加法增大,乘法减小

  • 可以看出,在拥塞避免阶段,拥塞窗口是按照线性规律增大的。这常称为“加法增大” AI (Additive Increase)。
  • 当出现超时或3个重复的确认时,就要把门限值设置为当前拥塞窗口值的一半,并大大减小拥塞窗口的数值。这常称为“乘法减小”MD (Multiplicative Decrease)。
  • 二者合在一起就是所谓的 AIMD 算法。

TCP拥塞控制流程图

例题5-38

TCP 的拥塞控制方法 ----AIMD相关推荐

  1. 【计算机网络】-TCP的拥塞控制及拥塞控制方法

    TCP的拥塞控制及拥塞控制方法 TCP的拥塞控制 TCP的拥塞判断 TCP拥塞控制的方法 基于窗口的拥塞控制 拥塞窗口 慢开始 拥塞避免 快重传 快恢复 TCP拥塞控制总体流程图 TCP拥塞控制综合例 ...

  2. TCP的拥塞避免、超时重传、快速重传、快速恢复

    转自:http://blog.csdn.net/itmacar/article/details/12278769 感谢博主的辛勤成果! 为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制.最初由 ...

  3. tcp协议栈优化1-增加TCP初始拥塞窗口

    看linux3.0 network代码,发现TCP initcwd(初始拥塞窗口)默认已经调为10,同时,TCP rcvwnd初始接收窗口也已调为10.      tcp initcwd初始化函数-- ...

  4. TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood)

    TCP协议拥塞控制算法(Reno.HSTCP.BIC.Vegas.Westwood) 一.TCP拥塞控制的研究框架 二.现有TCP拥塞控制的算法(Reno.HSTCP.Vegas.Westwood) ...

  5. 「深度好文」TCP BBR拥塞控制算法深度解析

    linux服务器开发相关视频解析: tcpip,accept,11个状态,细枝末节的秘密,还有哪些你不知道 徒手实现网络协议栈,请准备好环境,一起来写代码 c/c++ linux服务器开发学习地址:c ...

  6. 来自Google的TCP BBR拥塞控制算法解析

    写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算法的文章,我想抢个沙发.本文写于2016/10/15!         本文的写作方式可能稍有不同,之前很多关于 ...

  7. Google的TCP BBR拥塞控制算法深度解析

    原作者:dog250,授权发布 重新整理:极客重生 hi ,大家好,今天推荐一篇我认为在TCP BBR技术里面分析非常透彻的文章,希望大家可以学习到一些真正的知识,理解其背后的设计原理,才能应对各种面 ...

  8. TCP协议拥塞控制算法(Reno、HSTCP、BIC、Vegas、Westwood

    一.TCP拥塞控制的研究框架 二.现有TCP拥塞控制的算法(Reno.HSTCP.Vegas.Westwood) 三.参考文献 一.TCP拥塞控制的研究框架   注: l 基于丢包反馈:通过ACK所带 ...

  9. 个人感悟—来自Google的TCP BBR拥塞控制算法解析

    地址:TCR BBR拥塞控制算法另类解析 写本文的初衷一部分来自于工作,更多的来自于发现国内几乎还没有中文版的关于TCP bbr算法的文章,我想抢个沙发.本文写于2016/10/15! 本文的写作方式 ...

  10. QVegas-一个升级版的TCP Vegas拥塞算法

    拥塞避免带来了很多疑惑,本文解开这个疑惑并给出一个实实在在但却很简陋的算法.         其实在基于丢包的拥塞算法中,拥塞避免的过程总是伴随着AI和MD的,不能光说AI而忽略MD.         ...

最新文章

  1. 百度ERNIE 2.0发布!16项中英文任务表现超越BERT和XLNet
  2. 前端project师养成记:开发环境搭建(Sublime Text必备插件推荐)
  3. 分享网页加载速度优化的一些技巧?
  4. [USACO19JAN,Platinum] Redistricting
  5. 【数据结构与算法】【算法思想】【MySQL数据库索引】B+树
  6. 面试官:为什么 Spring 中的 bean 默认为单例?
  7. 多播委托(multicast delegate)
  8. 【今日CS 视觉论文速览】Part2, 18 Jan 2019
  9. 神舟电脑冲击创业板失败 首发未获证监会通过
  10. 网站访客系统php,PHP实现网站访客来访显示访客IP浏览器操作系统
  11. 如何招到烂程序员(续)
  12. 转载AWS 基础知识
  13. 局域网计算机维护工具,局域网共享工具,教您局域网共享工具
  14. Windows开启网络对时方法
  15. 网络空间安全——总结
  16. 吃货在东京 -- 记那段吃不饱的日子 之一 牛头自助烤肉店
  17. pyqt5做了一个二维码生成器,已打包成exe可执行程序...
  18. 有没有便宜一点的网站服务器,有便宜一点的云服务器卖吗
  19. 杨幂穿搭有三宝:露腿,收腰,配饰亮点,赶快马起来
  20. 二进制、八进制、十进制、十六进制的英文及简写

热门文章

  1. 卡方检验四格表怎么做_等级变量的假设检验怎么做?
  2. 全局最小割集Stoer-Wagner算法
  3. xheditor ajax上传,xheditor
  4. shell 脚本实例--持续更新
  5. 从「广义斯托克斯公式」结合「外微分公式」导出「牛顿-莱布尼茨公式」、「格林公式」、「高斯公式」、「斯托克斯公式」
  6. setw()使用方法
  7. Unity 复制内容到剪贴板
  8. java 导出Excel表头
  9. 大数据毕设/课设 - 基于大数据的全国疫情实时监控大屏系统设计与实现
  10. STL(标准模板库)