TCP 拥塞控制算法

2023-11-18

转自:https://mp.weixin.qq.com/s/NIFandX8w-Cynnbl-f2Lwg


  1. 拥塞:路由器因无法处理高速到达的流量而被迫丢弃数据信息的现象称为拥塞。

  2. 为什么有了流量控制,还需要拥塞控制?
    流控只简单地表明了接收方的处理能力,并不能代表中间网络的处理能力。如果一开始把流控窗口内的数据全部发送出去,中间路由器可能一时处理不了如此多的突发流量。

  3. 拥塞窗口(cwnd)和通告窗口(awnd)
    实际的发送窗口:W=min(cwnd,awnd),两者之间较小的:
    a. 如果接收方慢:W=awnd
    b. 如果网络慢:W=cwnd


TCP拥塞控制算法

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

拥塞控制算法的核心是选择一个有效的策略来控制拥塞窗口的变化。

TCP 拥塞控制算法发展的过程中出现了如下几种不同的思路:

  • 基于丢包的拥塞控制:将丢包视为出现拥塞,采取缓慢探测的方式,逐渐增大拥塞窗口,当出现丢包时,将拥塞窗口减小,如 Reno、Cubic 等。

  • 基于时延的拥塞控制:将时延增加视为出现拥塞,延时增加时增大拥塞窗口,延时减小时减小拥塞窗口,如 Vegas、FastTCP 等。

  • 基于链路容量的拥塞控制:实时测量网络带宽和时延,认为网络上报文总量大于带宽时延乘积时出现了拥塞,如 BBR。

  • 基于学习的拥塞控制:没有特定的拥塞信号,而是借助评价函数,基于训练数据,使用机器学习的方法形成一个控制策略,如 Remy。

1.Vegas

Vegas 将时延 RTT 的增加作为网络出现拥塞的信号,RTT 增加,拥塞窗口减小,RTT 减小,拥塞窗口增加

具体来说,Vegas 通过比较实际吞吐量和期望吞吐量来调节拥塞窗口的大小
期望吞吐量:Expected = cwnd / BaseRTT
实际吞吐量:Actual = cwnd / RTT
diff = (Expected-Actual) * BaseRTT

BaseRTT 是所有观测来回响应时间的最小值,一般是建立连接后所发的第一个数据包的 RTT,cwnd 是目前的拥塞窗口的大小。Vegas 定义了两个阈值 a,b,当 diff > b 时,拥塞窗口减小,当 a <= diff <=b 时,拥塞窗口不变,当 diff < a 时,拥塞窗口增加。

Vegas 算法采用 RTT 的改变来判断网络的可用带宽,能精确地测量网络的可用带宽,效率比较好。但是,网络中 Vegas 与其它算法共存的情况下,基于丢包的拥塞控制算法会尝试填满网络中的缓冲区,导致 Vegas 计算的 RTT 增大,进而降低拥塞窗口,使得传输速度越来越慢,因此 Vegas 未能在 Internet 上普遍采用

适用场景:适用于网络中只存在 Vegas 一种拥塞控制算法,竞争公平的情况。


2.Reno

Reno将拥塞控制的过程分为四个阶段:慢启动、拥塞避免、快重传和快恢复,是现有的众多拥塞控制算法的基础。下面详细说明这几个阶段:

慢启动阶段在没有出现丢包时每收到一个 ACK 就将拥塞窗口大小加一(单位是 MSS,最大单个报文段长度),每轮次发送窗口增加一倍,呈指数增长,若出现丢包,则将拥塞窗口减半一次,进入拥塞避免阶段当窗口达到慢启动阈值或出现丢包时,进入拥塞避免阶段,窗口每轮次加一,呈线性增长当收到对一个报文的三个重复的 ACK 时,认为这个报文的下一个报文丢失了,进入快重传阶段立即重传丢失的报文,而不是等待超时重传;快重传完成后进入快恢复阶段将慢启动阈值修改为当前拥塞窗口值的一半,同时拥塞窗口值等于慢启动阈值,然后进入拥塞避免阶段,重复上诉过程

Reno 拥塞控制过程如下图所示:
在这里插入图片描述

Reno 算法将收到 ACK 这一信号作为拥塞窗口增长的依据,在早期低带宽、低时延的网络中能够很好的发挥作用,但是随着网络带宽和延时的增加,Reno 的缺点就渐渐体现出来了,发送端从发送报文到收到 ACK 经历一个 RTT,在高带宽延时(High Bandwidth-Delay Product,BDP)网络中,RTT 很大,导致拥塞窗口增长很慢,传输速度需要经过很长时间才能达到最大带宽,导致带宽利用率将低

适用场景:适用于低延时、低带宽的网络。


3.Cubic

Cubic是 Linux 内核 2.6 之后的默认 TCP 拥塞控制算法,使用一个立方函数(cubic function):
hhh
作为拥塞窗口的增长函数,其中,C 是调节因子,t 是从上一次缩小拥塞窗口经过的时间,Wmax 是上一次发生拥塞时的窗口大小
在这里插入图片描述
β是乘法减小因子。从函数中可以看出拥塞窗口的增长不再与 RTT 有关,而仅仅取决上次发生拥塞时的最大窗口和距离上次发生拥塞的时间间隔值

Cubic 拥塞窗口增长曲线如下,凸曲线部分为稳定增长阶段,凹曲线部分为最大带宽探测阶段。如下图 所示,

  • 在刚开始时,拥塞窗口增长很快,在接近 Wmax 口时,增长速度变的平缓,避免流量突增而导致丢包;
  • 在 Wmax 附近,拥塞窗口不再增加;
  • 之后开始缓慢地探测网络最大吞吐量,保证稳定性(在 Wmax 附近容易出现拥塞);
  • 在远离 Wmax 后,增大窗口增长的速度,保证了带宽的利用率。

在这里插入图片描述
当出现丢包时,将拥塞窗口进行乘法减小,再继续开始上述增长过程。此方式可以使得拥塞窗口一直维持在 Wmax 附近,从而保证了带宽的利用率。Cubic 的拥塞控制过程如下图所示:
在这里插入图片描述
Cubic 算法的优点在于只要没有出现丢包,就不会主动降低自己的发送速度,可以最大程度的利用网络剩余带宽,提高吞吐量,在高带宽、低丢包率的网络中可以发挥较好的性能。

但是,Cubic 同之前的拥塞控制算法一样,无法区分拥塞丢包和传输错误丢包,只要发现丢包,就会减小拥塞窗口,降低发送速率,而事实上传输错误丢包时网络不一定发生了拥塞,但是传输错误丢包的概率很低,所以对 Cubic 算法的性能影响不是很大。

Cubic 算法的另一个不足之处是过于激进,在没有出现丢包时会不停地增加拥塞窗口的大小,向网络注入流量,将网络设备的缓冲区填满,出现 Bufferbloat(缓冲区膨胀)。由于缓冲区长期趋于饱和状态,新进入网络的的数据包会在缓冲区里排队,增加无谓的排队时延,缓冲区越大,时延就越高。另外 Cubic 算法在高带宽利用率的同时依然在增加拥塞窗口,间接增加了丢包率,造成网络抖动加剧。

适用场景:适用于高带宽、低丢包率网络,能够有效利用带宽。


4.BBR

BBR是谷歌在 2016 年提出的一种新的拥塞控制算法,已经在 Youtube 服务器和谷歌跨数据中心广域网上部署,据 Youtube 官方数据称,部署 BBR 后,在全球范围内访问 Youtube 的延迟降低了 53%,在时延较高的发展中国家,延迟降低了 80%。目前 BBR 已经集成到 Linux 4.9 以上版本的内核中。

BBR 算法不将出现丢包或时延增加作为拥塞的信号,而是认为当网络上的数据包总量大于瓶颈链路带宽和时延的乘积时才出现了拥塞,所以 BBR 也称为基于拥塞的拥塞控制算法(Congestion-Based Congestion Control)。BBR 算法周期性地探测网络的容量,交替测量一段时间内的带宽极大值和时延极小值,将其乘积作为作为拥塞窗口大小(交替测量的原因是极大带宽和极小时延不可能同时得到,带宽极大时网络被填满造成排队,时延必然极大,时延极小时需要数据包不被排队直接转发,带宽必然极小),使得拥塞窗口始的值始终与网络的容量保持一致

由于 BBR 的拥塞窗口是精确测量出来的,不会无限的增加拥塞窗口,也就不会将网络设备的缓冲区填满,避免了出现 Bufferbloat 问题,使得时延大大降低。如下图所示,网络缓冲区被填满时时延为 250ms,Cubic 算法会继续增加拥塞窗口,使得时延持续增加到 500ms 并出现丢包,整个过程 Cubic 一直处于高时延状态,而 BBR 由于不会填满网络缓冲区,时延一直处于较低状态。
在这里插入图片描述
由于 BBR 算法不将丢包作为拥塞信号,所以在丢包率较高的网络中,BBR 依然有极高的吞吐量,如下图所示,在 1% 丢包率的网络环境下,Cubic 的吞吐量已经降低 90% 以上,而 BBR 的吞吐量几乎没有受到影响,当丢包率大于 15% 时,BBR 的吞吐量才大幅下降。
在这里插入图片描述
BBR 算法是反馈驱动的,有自主调节机制,不受 TCP 拥塞控制状态机的控制,通过测量网络容量来调整拥塞窗口,发送速率由自己掌控,而传统的拥塞控制算法只负责计算拥塞窗口,而不管发送速率(pacing rate),怎么发由 TCP 自己决定,这样会在瓶颈带宽附近因发送速率的激增导致数据包排队或出现丢包。

经过测试,在高延时、高丢包率的环境下,BBR 相对于 Cubic 算法在传输速度上有较大的提升,具体的测试结果表 1 所示:
在这里插入图片描述
BBR 算法的不足之处在于设备队列缓存较大时,BBR 可能会竞争不过 Cubic 等比较激进算法,原因是 BBR 不主动去占据队列缓存,如果 Cubic 的流量长期占据队列缓存,会使得 BBR 在多个周期内测量的极小 RTT 增大,进而使 BBR 的带宽减小

适用场景:适用于高带宽、高时延、有一定丢包率的长肥网络,可以有效降低传输时延,并保证较高的吞吐量。


5.Remy

Remy也称为计算机生成的拥塞控制算法(computer-generated congestion-control algorithm),采用机器学习的方式生成拥塞控制算法模型。通过输入各种参数模型(如瓶颈链路速率、时延、瓶颈链路上的发送者数量等),使用一个目标函数定量判断算法的优劣程度,在生成算法的过程中,针对不同的网络状态采用不同的方式调整拥塞窗口,反复修改调节方式,直到目标函数最优,最终会生成一个网络状态到调节方式的映射表,在真实的网络中,根据特定的网络环境从映射表直接选取拥塞窗口的调节方式

Remy 试图屏蔽底层网络环境的差异,采用一个通用的拥塞控制算法模型来处理不同的网络环境。这种方式比较依赖输入的训练集(历史网络模型),如果训练集能够全面覆盖所有可能出现的网络环境及拥塞调节算法,Remy 算法在应用到真实的网络环境中时能够表现的很好,但是如果真实网络与训练网络差异较大,Remy 算法的性能会比较差。

适用场景:网络环境为复杂的异构网络,希望计算机能够针对不同网络场景自动选择合适的拥塞控制方式,要求现有的网络模型能够覆盖所有可能出现情况。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP 拥塞控制算法 的相关文章

  • 向量大小和归一化(vector magnitude & normalization)、向量范数(vector norm)、标量/向量/矩阵/张量

    一 向量大小 首先一个向量的长度或者大小一般记为 上图中的平面向量的大小计算如下 空间向量的大小计算如下 维复向量的大小计算如下 二 向量归一化 向量归一化即将向量的方向保持不变 大小归一化到1 向量的归一化向量为 三 向量范数 范数是一种
  • 什么是正则表达式?

    什么是正则表达式 1 什么是正则表达式 2 基本匹配 3 元字符 1 什么是正则表达式 正则表达式是 组由字 和符号组成的特殊 本 它可以 来从 本中找出满 你想要的格式的句 个正则表达式是 种从左到右匹配主体字符串的模式 Regular
  • [网络安全自学篇] 八十四.《Windows黑客编程技术详解》之VS环境配置、基础知识及DLL延迟加载详解(1)

    从这篇文章开始 作者将带着大家来学习 Windows黑客编程技术详解 其作者是甘迪文老师 推荐大家购买来学习 作者将采用实际编程和图文结合的方式进行分享 并且会进一步补充知识点 希望对您有所帮助 第一篇文章主要包括两部分内容 开发环境 VS
  • 祖传Python代码,初学者必用,含泪发出

    今天分享几段工作生活中常用的代码 都是最为基础的功能和操作 而且大多还都是出现频率比较高的 很多都是可以拿来直接 使用或者简单修改就可以放到自己的项目当中 日期生成 很多时候我们需要批量生成日期 方法有很多 这里分享两段代码 Python学
  • [Office] 公务员WPS Excel常用的一些技巧方法

    这篇文章主要是我最近工作使用WPS Excel的一些常用技巧和方法 仅仅是一篇在线笔记 当然实际操作中 你遇到问题百度经验或相关网站会提供对应的解决方法 而且它们写得更好 这篇文章更多的是结合自己使用学到的技巧 作为程序员 写了这么多年的代
  • 真的!千万不要忽略这些python常见报错信息

    在使用Python时 作为萌新的我总是会粗心的掉这掉那 运行时就会出现各式各样的错误 因此写这么一篇博客 来总结下编写代码的一些常见错误以及解决办法 有什么python相关报错解答自己不会的 或者源码资料 模块安装 女装大佬精通技巧 都可以
  • 【FPGA基础篇】底层结构组成

    文章目录 前言 CPU和DSP FPGA ASIC对比 FPGA和CPLD比较 FPGA基础 IOB 输入输出单元 CLB 可编程逻辑模块 LUT 查找表 MUX 选择器 复用器 Carry Chain 进位链 Flip Flop 触发器
  • 数据结构之链表及LinkedList源码分析

    链表 1 概念 链表 Linked list 是一种物理存储单元上非连续 非顺序的存储结构 数据元素的逻辑顺序是通过链表中的指针链接次序实现的 链表由一系列结点 链表中每一 个元素称为结点 组成 结点可以在运行时动态生成 每个结点包括两个部
  • Linux修改文件句柄数及vm.max_map_count、stack size

    一 修改文件句柄数 1 1 查看当前大小 ulimit a 1 2 临时修改 ulimit n 4096 1 3 永久修改 vim etc security limits conf soft nofile 65536 hard nofile
  • java使用URLconnection下载文件 getContentLength()为-1 的解决办法

    一 起因 APP想要从远程服务器下载一个文件 不想使用网络请求框架 想了解一下原生的实现 于是简单了解了一下URLconnection类的使用 加上参考了网络上的实现 简单实现了文件下载操作 代码如下 long downloadLength
  • Python人员信息管理系统(简直期末人福音)

    1 涉及模块 datetime os random sys PyQt5 2 运行效果 支持功能 添加信息 修改信息 删除信息 查询信息 文件存储数据 每次运行都会加载显示之前的信息 3 部分源码 创建字体对象 用来对要显示的文字进行设定fo
  • 正则表达式(一)——基础之匹配字符,数量,边界

    1 概念 1 1 正则表达式概念 正则表达式 又称正规表达式 规则表达式 正规表示法等 英语 Regular Expression 在代码中常简写为regex regexp或RE 计算机科学的一个概念 正则表达式使用单个字符串来描述 匹配一
  • Linux网络编程基础

    Linux网络编程基础 1 协议的概念 什么是协议 典型协议 网络程序设计模式 分层模型 TCP IP四层模型 实际开发中常用模型 通信过程 协议的概念 从应用的角度出发 协议可理解为 规则 是数据传输和数据的解释的规则 假设 A B双方欲
  • 2020-08-27

    java 1 编译java程序的命令是javac 该命令的文件是javac exe 2 jsp表达式的写法 3 3 Math round 11 5 为 11 四舍五入是向数值大的方向入 4 float与int做除法运算时 会将int转化为f
  • 多线程java.util.concurrent.RejectedExecutionException

    项目运行一段时间后现场突然报了一个异常 多线程读取本地文件时失败导致文件大量积压 查看日志发现以下异常 java util concurrent RejectedExecutionException Task java util concu
  • js基础之Promise(全面+手写实现)

    1 是什么 Promise是一种异步编程的解决方案 用于处理异步操作并返回结果 主要作用是解决回调函数嵌套 回调地狱 的问题 使异步操作更加清晰 易于理解和维护 2 怎么用 Promise有三种状态 pending 进行中 fulfille
  • js基础之闭包

    作为前端开发 闭包是时时刻刻都在使用的 理解闭包是十分重要的 下面从闭包的定义 使用场景 及优缺点进行总结 帮助大家更好的理解闭包 什么是闭包 引用自 MDN关于闭包的描述 闭包 closure 是一个函数以及其捆绑的周边环境状态 lexi
  • js基础之构造函数和类

    JS的构造函数和ES6的类是JS中很重要的概念 也是面向对象编程的核心 在本文中 我们将探讨JS的构造函数和ES6的类的基础知识 包括它们的定义 使用方法以及它们之间的区别 JS的构造函数 JS中的构造函数是一种特殊的函数 用于创建对象 它
  • git 建立分支仓库

    Git 命令版本 查看本地分支及追踪 找一个文件夹目录 clone 仓库 Git branch vv 查看所有分支 Git branch a 查看本地分支 git branch 查看远程分支 git branch r 创建本地分支dev g
  • 测试基础知识

    常见测试分类 按测试阶段划分 单元测试 针对程序源码进行测试 国内是开发自测 集成测试 又称接口测试 针对模块间的访问地址进行测试 系统测试 对整个系统进行测试 包括功能 兼容性 文档等 验收测试 分为内测和公测 按代码可见度划分 黑盒测试

随机推荐

  • 【精】彻底吃透HDFS写流程(5)-- DataStreamer线程类run方法分析以及如何构建pipeline?

    有关HDFS写流程的系列文章 精 彻底吃透HDFS写流程 1 BlockConstructionStage 精 彻底吃透HDFS写流程 2 Namenode侧create文件 精 彻底吃透HDFS写流程 3 DataStreamer线程和输
  • Android Studio及JDK完整详细安装

    本博文源于安卓基础旨在讨论如何搭建Android开发环境 下面进入步骤 了解安卓开发需要的工具 安装步骤 安装文件的下载 JDK的安装 Android Studio的安装与Android SDK的下载 基本开发的环境配置 安装文件的准备 首
  • 还是 “月饼” 后续,玩转炫彩 “月饼” 之 问题说明

    画一个 月饼 陪我过中秋 开发板后续问题跟进说明 目录 前言 一 出现问题 二 寻求办法 三 若有所思 四 问题测试 结语 悬赏送开发板 前言 本文有纯理论玩家是永远不会经历的实际问题 嵌入式工程师不动手永远出不了作品 本文最后有送开发板的
  • sqoop初步使用

    一 概述 Sqoop是一款开源的数据导入导出工具 可以将传统的关系型数据库导出至HDFS 也可以将HDFS中的数据导出至关系型数据库 官网 http sqoop apache org 原理 在Hadoop生态体系中 计算基本依赖于MR 那么
  • PHP如何使用Ds\Queue Capacity()函数?代码实例

    Ds Queue capacity PHP中的函数用于检查Queue实例的当前容量 语法 int public Ds PriorityQueue capacity void 参数 此功能不接受任何参数 返回值 此函数返回Queue实例的当前
  • stata学习笔记

    离散被解释变量 二值选择型 二值选择模型 多值选择型 多项选择模型 条件选择 混合 排序数据 排序模型 非负整数计数型 泊松 负二项 二值选择型 采用logit和probit模型 probit即把logit换一下就好 logit y x1
  • Dubbo源码分析-服务导出源码解析(三)

    在这个版本中dubbo会通过注解 PostConstruct把ServiceBean实例放到ConfigManager中 public abstract class AbstractConfig implements Serializabl
  • C++11 删除 字符串中的空格

    include
  • android 反射机制和反射调用方法

    对于android 中很多类没有开放出来 考虑到这些API不稳定 后续有可能会更改 所有没有在SDK中暴露出来给用户使用 但是我们在开放的过程中还是需要使用到一些android 系统中未开放出来的class 这时候我们就可以通过反射机制来调
  • 商品期货手续费一般是万分之十以内(商品期货手续费一般是万分之十以内吗)

    商品期货手续费一般 商品期货手续费普遍是极端之十以内 普遍是极端之10以内 简直看期货公司收取规范 普遍每个期货公司规范纷歧 海内四家期货买卖所颁布贬低一切期货买卖种类的手续费规范 各种类降费比率从12 5 到50 不等 期货买卖所手续费水
  • websocket的属性readyState

    websocket的属性readyState webSocket的readyState属性用来定义连接状态 该属性的值有下面几种 0 对应常量CONNECTING numeric value 0 正在建立连接连接 还没有完成 The con
  • MultipartFile上传文件报文件不存在的几种情况

    首先先了解一下从上传到保存整个流程是怎样的 然后在举几个文件不存在的例子 前端传进来一个文件 spring把文件保存到临时目录里 也就是 tmp tomcat 文件夹里 这个目录是在程序启动时创建的 目录也可以自定义 临时文件是 tmp结尾
  • matlab2019a中LSTM网络使用方法及源码示例(Deep Learning Toolbox系列篇6)

    此示例说明如何使用长短期记忆 LSTM 网络对序列数据进行分类 要训练深度神经网络以对序列数据进行分类 可以使用 LSTM 网络 LSTM 网络允许您将序列数据输入网络 并根据序列数据的各个时间步进行预测 此示例使用 1 和 2 中所述的日
  • 滑动指示器导航源码html+css

  • 深入理解react native布局(一)居中

    刚刚做完了一个项目 基本上把react native各种布局方式都用上了 发现了很多坑 也学会和很多 这里给大家分享一下哈 首先我们要有个概念 react native里面是兼容大部分我们在css里面用到的布局方式 此外接触过css里面fl
  • unity透明shader

    Shader Custom AlphaSelfIllum Properties Color Main Color Color 1 1 1 0 SpecColor Spec Color Color 1 1 1 1 Emission Emmis
  • Tab键== 4个空格并在Vim中的花括号后自动缩进

    我如何制作vi Vim从不使用制表符 将空格转换为制表符 不好 制作Tab键 4个空格 并在像Emacs这样的大括号块之后自动缩进代码 另外 如何保存这些设置 以便我再也不必输入它们 我已经看到了与此相关的其他问题 但它似乎总是与我想要的有
  • TypeScript学习笔记一:数据类型

    在TypeScript中所包含的数据类型有以下几种 number string boolean void Null 和 Undefined any array数组 Tuple元组 never enum object bight与symbol
  • os.mkdir()与os.makedirs()的异同及出现FileNotFoundError: [WinError 3] 系统找不到指定的路径。

    目录 一 问题分析 二 makedirs 和 mkdir 的不同 FileNotFoundError WinError 3 系统找不到指定的路径 一 问题分析 1 在使用 os mkdir 时 有时候报错系统会找不到指定路径 例如 我的工作
  • TCP 拥塞控制算法

    转自 https mp weixin qq com s NIFandX8w Cynnbl f2Lwg 拥塞 路由器因无法处理高速到达的流量而被迫丢弃数据信息的现象称为拥塞 为什么有了流量控制 还需要拥塞控制 流控只简单地表明了接收方的处理能