一、何为拥塞

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

二、何为拥塞控制

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. 使用appium后安卓手机无法调出键盘解决方法

    问题:用appium进行真机调试后,使用手机的app进行输入时无法调出键盘. 原因:appium调试时,将手机输入法设置成了Unicode IME 解决方法: 方法一,手机设置里修改输入法: 不同的手 ...

  2. C 和 C++ 打起来了!曾今最亲密的伙伴到现今的不爽?

    70年代初,贝尔实验室创建了C语言,它是开发UNIX的副产品.很快C就成为了最受欢迎的编程语言之一.但是对于Bjarne Stroustrup来说,C的表达能力还不够.于是,他在1983年的博士论文中 ...

  3. vbox挂载共享文件夹

      版权 挂载共享文件夹很简单,有2种方法,1是自动挂载,2是手动挂载. 一.自动挂载步骤: 1,把想共享的文件夹设置为共享. 2,在virtualbox界面对虚拟机设置共享文件夹,如下图.

  4. centos7安装redis6

    wget http://download.redis.io/releases/redis-6.0.6.tar.gz?_ga=2.104030464.1049731693.1595900008-1330 ...

  5. centos8平台上php7.4的生产环境配置

    一,php错误与日志的配置 1,创建php的日志保存目录: [root@yjweb ~]# mkdir -p /data/logs/phplogs [root@yjweb ~]# chmod 777 ...

  6. Python入门教程完整版(懂中文就能学会)

    前几天给大家分享<从零学会Photoshop经典教程300集>的教程受到了广泛的关注,有人不知道怎么领取,居然称小编为"骗子". 不过小编的内心是强大的,网友虐我千百遍 ...

  7. stm32与红外遥控器(NEC协议)

    1.器件简介 本次测试采用R903V1红外接收头与NEC协议的红外遥控器,接收头原理图如下: 器件的供电电压VCC在2.7V~5.5V之间,输出电压VOUT正常在0.2v ~(VCC-0.3±0.2) ...

  8. 逻辑运算 - js笔记

    && 与 || undefined null NaN "" 0 => false 在 && 中,当第一个值为false停止运行,返回该值,即遇 ...

  9. CyclicBarrier(循环栅栏)

    CyclicBarrier public class CyclicBarrierDemo { public static void main(String[] args) { CyclicBarrie ...

  10. Callable接口

    Callable与Runnable的不同区别在于: 1.Callable有返回值 Runnable没有返回值 2.Callable需要实现的方法是call方法       Runnable需要实现的方 ...