一、何为拥塞

路由器无法处理高速到达的数据而被迫丢弃数据的现象叫做拥塞。

二、何为拥塞控制

TCP流量控制时为了平衡一个链接中接收方和发送方的速度匹配问题,当发送方发现发送速度大于接收方的接收速度时动态调整发送速度。

但是成千上万的TCP链接共享着整个网络基础设施,当网络上这些TCP都在传输数据时,网络有可能就会拥塞,TCP的拥塞控制就是在传输自己数据的同时实时掌握整个网络的负载,然后基于整个网络的负载来动态调整自己的发送速度。

三、网络拥塞的开销

拥塞时路由器丢失数据,丢失后基于可靠性传输的机制,发送方会重传数据,重传会再次加大网络负载,导致更大的开销。

在多路由器的情况下,会导致更大的资源浪费,比如数据有A传递到B经过了三个路由器,结果被第三个路由器给丢弃了。这样前两个路由器的工作全被白白浪费。如下图所示,R3拥塞,A--》B的数据到达R3之后最终被丢弃了,R1、R2的工作被白白浪费。

由此可见,拥塞控制势在必行。

四、拥塞控制的基本方法

4.1 端到端的拥塞控制

网络层不提供拥塞控制机制,主要依靠端系统对网络的观察来调整发送的速度最终完成拥塞的控制(比如端系统通过观察丢包的情况来判断)。TCP/IP就是通过端到端的方法来解决拥塞控制(让TCP来控制,IP不管)。

核心:观察,感知,调整,解决。TCP的拥塞控制方法。

4.2 网络辅助的拥塞控制

由路由器告知发送方网络是否拥塞,主要两种:

  1. 路由器直接高速发送方网络状况
  2. 当发送拥塞时,路由器在当前报文中标识拥塞,当接收方拿到这个拥塞标识后,由接收方告知发送方网络拥塞,这种方式至少要一个RTT发送方才能知道拥塞。

报文不详细展开。

五、TCP拥塞控制方法

TCP拥塞控制属于端到端的控制方法,其核心便是观察感知网络的拥塞状态,然后调整发送速度。在TCP中引入了拥塞窗口(cwnd:congestion window),流量控制中引入了接收窗口(rwnd:receive window)。最终TCP的发送窗口为min{cwnd,rwnd}。

5.1 如何感知网络?

对于TCP来说核心两点:

  1. 丢包(超时,或者三次冗余ack)就代表网络拥塞,需要减少cwnd的size。
  2. 确认代表网络畅通,可以加大cwnd的size。确认的越快cwnd增加的越快(反之亦然)。自计时(self-clocking)

下面的即将要介绍的几个方法都是基于上面的两个核心来展开的。

5.2 慢启动(Slow Start)

慢启动就是TCP启动后的发送速度慢慢的进行提速,这样才能便于感知网络的状况。

慢启动的核心算法:

  1. 刚开始cwnd=1个MSS(max segment size)
  2. 每当收到一个ack,cwnd=cwnd+1。这样每过一个RTT。cwnd便会翻倍:cwnd=cwnd*2,这是指数级增加
  3. 当cwnd=ssthresh(慢启动阈值,slow start threshold)时,停止指数级增加,进入避免拥塞流程。

5.3 拥塞避免

慢启动时cwnd时指数级增长,当增长的到ssthresh后便进入避免拥塞。避免拥塞算法比较简单:

  1. 每收到一个ack,cwnd=cwnd+1/cwnd;
  2. 由此可见,每过一个RTT。cwnd=cwnd+1

可见拥塞避免算法实际是将cwnd的增长由指数级增长变为了一个线性缓慢增长。如下图所示。

5.4 拥塞发生(感知到拥塞)

TCP认为发生拥塞由两种情况:

  • 超时
  • 收到连续三次相同的ACK(快速重传的场景)

5.4.1 超时

TCP超时后的具体动作:

  • ssthresh=cwnd/2
  • cwnd=1
  • 进入慢启动流程

5.4.2 连续三次相同的ACK

  • 进入快速恢复流程

5.5 快速恢复

收到三次连续相同的ACK,说明产生了丢包,但是能收到ACK,说明超时相对不是那么严重。所以针对这种情况,TCP的做法没有超时那么激进:

  • ssthresh=cwnd
  • cwnd=cwnd/2+3,3代表连续收到了3个ACK,累加三个窗口大小。
  • 进入拥塞避免流程

以上介绍了TCP拥塞控制的一个整体过程。本文完。

TCP拥塞控制原理的更多相关文章

  1. TCP拥塞控制算法纵横谈-Illinois和YeAH

    周五晚上.终于下了雨.所以也终于能够乱七八糟多写点松散的东西了... 方法论问题. 这个题目太大以至于内容和题目的关联看起来有失偏颇.只是也无所谓,既然被人以为"没有方法论"而歧视 ...

  2. Linux TCP拥塞控制算法原理解析

    这里只是简单梳理TCP各版本的控制原理,对于基本的变量定义,可以参考以下链接: TCP基本拥塞控制http://blog.csdn.net/sicofield/article/details/9708 ...

  3. TCP拥塞控制算法 优缺点 适用环境 性能分析

    [摘要]对多种TCP拥塞控制算法进行简要说明,指出它们的优缺点.以及它们的适用环境. [关键字]TCP拥塞控制算法 优点    缺点   适用环境公平性 公平性 公平性是在发生拥塞时各源端(或同一源端 ...

  4. 网络拥塞控制(三) TCP拥塞控制算法

    为了防止网络的拥塞现象,TCP提出了一系列的拥塞控制机制.最初由V. Jacobson在1988年的论文中提出的TCP的拥塞控制由“慢启动(Slow start)”和“拥塞避免(Congestion  ...

  5. TCP拥塞处理—Congestion Handing

      TCP拥塞处理-Congestion Handing 1 慢启动 2 拥塞避免 3 快重传/拥塞发生(拥塞发生时的快速重传) 4 快恢复

  6. 让人非常easy误解的TCP拥塞控制算法

    正文 非常多人会觉得一个好的TCP拥塞控制算法会让连接加速,这样的观点是错误的.恰恰相反,全部的拥塞控制算法都是为了TCP能够在贪婪的时候悬崖勒马,大多数时候.拥塞控制是减少了数据发送的速度. 我在本 ...

  7. 浅谈TCP拥塞控制算法

    TCP通过维护一个拥塞窗口来进行拥塞控制,拥塞控制的原则是,只要网络中没有出现拥塞,拥塞窗口的值就可以再增大一些,以便把更多的数据包发送出去,但只要网络出现拥塞,拥塞窗口的值就应该减小一些,以减少注入 ...

  8. TCP拥塞算法瓶颈及TCP加速器解决方案

    TCP拥塞算法详解    ps:详解TCP拥塞算法就是为了说明瓶颈所在.   先解释一下概念: 拥塞:对网络中某一资源的需求超出了该资源所能提供的可用部分 拥塞窗口:以字节为单位,表示能通过的数据报的 ...

  9. TCP拥塞避免

    目录 TCP拥塞避免 超时重传机制 拥塞控制 慢启动 拥塞避免 快重传 快恢复 与流量控制区别 参考 TCP拥塞避免 拥塞控制就是防止过多的数据注入网络中,这样可以使网络中的路由器或链路不致过载.拥塞 ...

随机推荐

  1. android的adb命令整理

    adb.exe的路径在Android\Sdk\platform-tools 把这个路径加入到系统的path环境下. 先用usb连接设备,比如一台android手机 adb tcpip 5555 adb ...

  2. IDEA项目路径初探

    IDEA项目路径 普通Java项目 普通Java项目,标准目录结构src下的路径就是classpath类路径,每次编译都会将src目录下新增的类和资源文件打包进类路径. 如下图,类文件和配置文件都会被 ...

  3. 调试与优化:一次数据中心看板 T+1 改 T+0 优化过程

    背景 团队目前在做一个用户数据看板(下面简称看板),基本覆盖用户的所有行为数据,并生成分析数据,用户行为数据来源于多个数据源(餐饮.生活日用.充值消费.交通出行.通讯物流.交通出行.医疗保健.住房物业 ...

  4. 解决python的requests库在使用过代理后出现拒绝连接的问题

    在使用过代理后,调用python的requests库出现拒绝连接的异常 问题 在windows10环境下,在使用代理(VPN)后.如果在python中调用requests库来地址访问时,有时会出现这样 ...

  5. BOOST库 消息队列

    直接贴实验代码: /******* boost 消息队列 **********/ #if 1 #include <boost/thread/thread.hpp> #include < ...

  6. python保存图片

    #coding=utf-8 import requests url ="https://images.pexels.com/photos/1181767/pexels-photo-11817 ...

  7. 不死的小强 .net core 微服务 快速开发框架 Viper 限流

    1.Viper是什么? Viper 是.NET平台下的Anno微服务框架的一个示例项目.入门简单.安全.稳定.高可用.全平台可监控.底层通讯可以随意切换thrift grpc. 自带服务发现.调用链追 ...

  8. Helium文档14-WebUI自动化-hover鼠标悬浮

    前言 hover 实现功能是将鼠标光标悬停在给定的元素或点上 入参介绍 element def hover(element): """ :param element: T ...

  9. Linux命令之{ }花括号

    括号扩展:{ } {} 可以实现打印重复字符串的简化形式 [10:04:14 root@C8[ 2020-06-16DIR]#echo file{1,3,5} file1 file3 file5 [1 ...

  10. poj2187 Beauty Contest (凸包 + 旋转卡壳)

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 38349   Accepted: 11851 ...