拥控算法BBR入门1
拥塞控制算法只与本地有关
一个TCP会话使用的拥塞控制算法只与本地有关。
两个TCP系统可以在TCP会话的两端使用不同的拥塞控制算法
Bottleneck Bandwidth and Round-trip time
Bottleneck 瓶颈
BBR models the network to send as fast as the available bandwidth and is 2700x faster than previous TCPs on a 10Gb,
100ms link with 1% loss.
BBR powers google.com, youtube.com and apps using Google Cloud Platform services.
旧网络拥塞:只要丢包就代表网络环境不好
tcp默认的cubic拥塞控制算法频繁上下调整滑动窗口大小,锯齿状
bbr倾向于平稳发送,在实际带宽比较平稳的场景下,吞吐量更大
tcp为什么没有解决这个问题:
tcp在linux内核里,升级太困难。
tcp的一些约束导致rtt算不准,比如ack delay、重传包的seq number不变
cubic: 基于丢包;锯齿形吞吐;事件驱动; tcp的重传包seqId不变,rtt算不准(tcp的ack delay时间影响rtt计算,默认40ms)
bbr: 基于延迟; 有平滑区间;根据rtt建立对带宽(窗口大小)的模型,再加上定时器;quic的重传包,seqId增加(编号id),rtt算得准。区分了具体的重传类型。
bbr:当rtt开始增长时,就达到了最大带宽
cubic:把缓存塞满一直到丢包;对丢包率的容忍非常低,即使只有极少的丢包,吞吐量也会急剧下降
相关命令
在Linux 下检查当前可用的拥塞算法:
sysctl net.ipv4.tcp_available_congestion_control
比如:reno cubic bbr bbr2 hybla highspeed htcp veno westwood vegas
当前使用了哪一种拥塞算法:
sysctl net.ipv4.tcp_congestion_control
sudo tc qdisc replace dev eth0 root netem latency 50ms
在两台服务器的收发每个方向增加50ms的延迟。
sudo tc qdisc del dev eth0 root
取消上述的设置
sudo sysctl -w net.ipv4.tcp_congestion_control=cubic
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr
sudo sysctl -w net.ipv4.tcp_congestion_control=bbr2
修改本机的拥控算法
sudo tc qdisc replace dev eth0 root netem loss 1.5% latency 50ms
在两台服务器的收发每个方向增加50ms的延迟 + 1.%的丢包
实验
作者在TCP上实验
作者这个图画的有点问题,应该是先确定loss,再传输特定数量包,统计不同拥塞控制算法的吞吐量和时延
Andree Toonk 在他的博客中验证了了使用不同拥塞控制算法、延迟和丢包参数所做的各种TCP吞吐量测试的全套测试,证明了在一定的丢包率(1.5%、3%)的情况下BBR的出色表现:
测试显示了丢包和延迟对TCP吞吐量的巨大影响。在一个高延迟的路径上,仅仅是少量的数据包丢失(1.5%)就会产生了巨大的影响。在这些较长的路径上使用除BBR以外的任何其他技术,当出现哪怕是少量的丢包时,都会造成很大的问题。也只有BBR在任何超过1.5%的丢包损失时都能保持一个不错的吞吐量数字。
BBR使用场景
网络在没有丢包的情况下,Cubic和BBR对于这些较长时延的链路都有很好的表现。而在中度丢包的情况下,BBR的表现就非常突出。
为什么要针对丢包情况而进行优化?
场景:在不同的地方放置有服务器,需要在系统或者服务器之间有源源不断的数据传输。例如日志文件、数据库同步、业务数据的异地备份等等。在复杂的网络环境下,会因为各种原因而出现丢包的情况。在这种场景下,BBR将会大放异彩,帮助维护更好的网络数据传输。
BBR对所谓的“长肥网络”(带宽延迟积大、丢包率高的网络)非常有效,在CDN和视频应用等场景下也被证明有很好的表现。
事实上,Youtube、Spotify和Dropbox大规模应用BBR已经有了很多的积累。这主要是因为BBR会积极地提升到最佳发送速率。
BBR缺点
wifi环境高抖动和波动导致网速变慢
(算不准实时可用带宽/RTT,就会导致流量偏大/偏小,说白了就是计划赶不上变化)
BBR算法以估测瓶颈带宽和RTT来调整发送速率,这种机制在高波动和不稳定的无线环境中可能表现不佳。
带宽估测误差:在WiFi环境中,实际的瓶颈带宽可能变化频繁,BBR的带宽估测如若不准确,会导致发送速率偏高或偏低。
RTT测量波动:高抖动和噪声引入的RTT测量误差,容易导致BBR无法准确捕捉真实网络状况,丢包和重传情况增加。
BBR依赖于精确的带宽估测和RTT测量来调整发送速率,但WiFi网络中的抖动(Jitter)和信号波动会对这些测量造成干扰
高实时抖动:WiFi信号质量因周围环境(如物理障碍、干扰设备、用户密度等)波动较大,导致RTT和带宽测量的不稳定
不可预测的丢包:WiFi网络中的随机丢包(而非拥塞引起的丢包)会导致BBR误判网络状况,影响其测量和调整
拥塞和无线信道竞争
(使用相同无线信道下的争抢,导致更糟)
WiFi网络中用户与用户之间使用相同无线信道,会出现频繁的竞争和碰撞,带来额外的传输延迟和带宽波动
共享信道:在高密度用户环境中,多用户竞争同一个无线信道资源,相互干扰,导致实际可用带宽降低。
复用性差:WiFi采用CSMA/CA(Carrier Sense Multiple Access with Collision Avoidance),高负载下其复用性差,增加拥塞和排队时延
拥塞控制与公平性
(高效利用带宽,但挤占cubic算法带宽)
BBR设计目标:高效利用带宽
在WiFi环境中未必能与其它传统拥塞控制算法(如Cubic)的流量公平发挥作用
Aggressive的探测行为:BBR在初期阶段会探测更高的发送速率,可能导致瞬时拥塞,丢包率增加,反而影响到实际传输性能
对竞争流的不友好:BBR可能在多用户共享信道条件下显得不够温和,导致竞争流公平性问题,影响整体网络性能。
BBR会导致高重传率
拥塞窗口计算方式
BBR的拥塞控制逻辑基于其对网络带宽和RTT的估计,这与传统TCP拥塞控制算法如Cubic或Reno不同
发送速率高:BBR本质上是激进的,它尝试利用尽可能多的带宽。当BBR认为有较高带宽时,它会快速增加发送速率。如果网络没有足够的带宽来支持这个速率,就会导致队列溢出和丢包。
突发流量:由于BBR在探测瓶颈带宽的过程中可能会发送短时高峰流量,容易在网络中产生突发拥塞,导致包丢失和重传。
RTT估算的敏感性
BBR依赖于RTT的精确测量来调整发送速率,但在高抖动网络中,RTT的波动性会影响BBR的准确判断。
RTT波动:在高抖动的网络中,RTT测量的不稳定性会导致BBR频繁调整发送速率。如果RTT波动大,BBR可能会误判当前网络状况,导致不适当的发送速率调整,增加了丢包和重传的概率
带宽探测机制
BBR通过探测高带宽以尽可能利用网络链路,但是这种探测策略在某些情况下会增加丢包率和重传次数。
主动探测:BBR会定期发送探测包来评估网络带宽,这种主动探测行为在网络容量不足时会导致丢包。
过度带宽利用:BBR的设计目标之一是高效利用可用带宽,但在一些环境中(如共享宽带或限带宽环境),这个行为可能会引发频繁的拥塞和重传。
适应性反馈机制
传统TCP拥塞控制算法如Reno和Cubic基于丢包或延时来调整拥塞窗口,而BBR依赖于带宽和RTT估计,这使得它在某些情况下面对高丢包率时的反应可能不够迅速和适应。
过度探测:BBR的拥塞控制主要依据带宽估测,一旦带宽估测过高而实际网络容量不足,容易持续导致大量丢包。
反馈滞后:网络负荷变化频繁时,BBR的调整可能存在滞后。然而主流TCP算法在这种情况下可能会更快地收敛到较为稳定的状态。
优化建议
在WiFi环境中优化BBR算法
调整BBR参数
优化探测和测量周期,适应更高抖动的网络环境。
使用混合控制机制
在WiFi环境中,结合BBR和其他较为保守的拥塞控制算法(如Cubic或Reno),通过混合控制策略提高网络适应性
BBRv2
BBRv2的目标就是解决第一版中存在的一些主要缺点,其改进包括了还使用聚合/运行中的参数增强了网络建模,并增加了对ECN(显式拥塞通知)的支持等
ECN(显式拥塞通知)
附录
缓冲膨胀
网络设备/系统不必要地设计了过大缓冲区
当网络链路拥塞时,就会发生缓冲膨胀,从而导致数据包在这些超大缓冲区中排队很长时间
在先进先出队列系统中,过大的缓冲区会导致更长的队列和更高的延迟,并且不会提高网络吞吐量
bbr并不会试图填满缓冲区,所以在避免缓冲区膨胀方面有更好表现
弱网环境,引入1.5%的丢包:
cubic:吞吐量下降99.7%
bbr: 吞吐量下降45%
Cubic
一种较为温和的拥塞算法,它使用三次函数作为其拥塞窗口的算法,并且使用函数拐点作为拥塞窗口的设置值。
Linux内核在2.6.19后使用该算法作为默认TCP拥塞算法。
今天所使用的绝大多数Linux 分发版本,例如Ubuntu、Amazon Linux 等均将Cubic作为缺省的 TCP拥塞算法
iperf3
iperf3 是一个用于测量网路吞吐量的工具,可以在网络性能测试中生成 TCP 和 UDP 流量负载。它被广泛用于测试网络的带宽和性能。
iperf3 -c 10.0.1.196 -p 8080
iperf3
用于启动 iperf3 客户端或服务器
-c
表示客户端模式。iperf3 可以运行在客户端模式和服务器模式中。这里的客户端模式用于发送流量到指定的服务器。
10.0.1.196
服务器的 IP 地址。在客户端模式下,这个地址指定了要连接的 iperf3 服务器的 IP 地址
-p 8080
这个选项指定要连接的服务器的端口号
使用 iperf3 工具来启动一个客户端,并连接到 IP 地址为 10.0.1.196,端口为 8080 的 iperf3 服务器。
客户端会生成流量并发送到服务器,从而对网络带宽和其他性能指标进行测试。
以下是一些常用的 iperf3 选项,可以根据具体需求和测试目标来进行配置:
-t:指定测试的持续时间(例如 -t 10 表示进行10秒的测试)
-u:使用UDP而不是默认的TCP协议进行测试
-b:指定带宽,比如UDP模式下可以使用-b 10M限制带宽为10Mbps
-R:反向测试,在客户端接收流量,而不是发送流量
-f:指定输出格式(例如 -f m 表示输出以兆比特为单位的结果)
相关文章:

拥控算法BBR入门1
拥塞控制算法只与本地有关 一个TCP会话使用的拥塞控制算法只与本地有关。 两个TCP系统可以在TCP会话的两端使用不同的拥塞控制算法 Bottleneck Bandwidth and Round-trip time Bottleneck 瓶颈 BBR models the network to send as fast as the available bandwidth and is 2…...

[Python数据可视化]Plotly Express: 地图数据可视化的魅力
在数据分析和可视化的世界中,地图数据可视化是一个强大而直观的工具,它可以帮助我们更好地理解和解释地理数据。Python 的 Plotly Express 库提供了一个简单而强大的方式来创建各种地图。本文将通过一个简单的示例,展示如何使用 Plotly Expre…...
windows C++ 并行编程-PPL 中的取消操作(四)
并行模式库 (PPL) 中取消操作的角色、如何取消并行工作以及如何确定取消并行工作的时间。 运行时使用异常处理实现取消操作。 请勿在代码中捕捉或处理这些异常。 此外,还建议你在任务的函数体中编写异常安全的代码。 例如,可以使用获取资源即初始化 (RA…...

【数据结构】字符串与JSON字符串、JSON字符串及相应数据结构(如对象与数组)之间的相互转换
前言: 下面打印日志用的是FastJSON依赖库中的 Log4j2。依赖: <!-- Alibaba Fastjson --> <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.80</version> …...

LeetcodeTop100 刷题总结(一)
LeetCode 热题 100:https://leetcode.cn/studyplan/top-100-liked/ 文章目录 一、哈希1. 两数之和49. 字母异位词分组128. 最长连续序列 二、双指针283. 移动零11. 盛水最多的容器15. 三数之和42. 接雨水(待完成) 三、滑动窗口3. 无重复字符的…...

Next-ViT: 下一代视觉Transformer,用于现实工业场景中的高效部署
摘要 由于复杂的注意力机制和模型设计,大多数现有的视觉Transformer(ViTs)在实际的工业部署场景中,如TensorRT和CoreML,无法像卷积神经网络(CNNs)那样高效运行。这提出了一个明显的挑战&#x…...
C++知识点示例代码助记
C语言设计期末知识点附示例代码。 1. 基础语法 变量和数据类型: int a 10; // 整型 float b 5.25f; // 单精度浮点型 double c 5.25; // 双精度浮点型 char d A; // 字符型 bool e true; // 布尔型 const int PI 3.14; // 常量输入输出&…...

Java 入门指南:JVM(Java虚拟机)垃圾回收机制 —— 垃圾回收算法
文章目录 垃圾回收机制垃圾判断算法引用计数法可达性分析算法虚拟机栈中的引用(方法的参数、局部变量等)本地方法栈中 JNI 的引用类静态变量运行时常量池中的常量 垃圾收集算法Mark-Sweep(标记-清除)算法Copying(标记-…...

苍穹外卖Day01-2
导入接口文档 yApi接口管理平台http://api.doc.jiyou-tech.com/ 创建项目 导入接口文件 导入结果界面 Swagger 介绍 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。 官网:ht…...

软考中级软件设计师——数据结构与算法基础学习笔记
软考中级软件设计师——数据结构与算法基本概念 什么是数据数据元素、数据项数据结构逻辑结构物理结构(存储结构) 算法什么是算法五个特性算法效率的度量时间复杂度空间复杂度 什么是数据 数据是信息的载体,是描述客观事物属性的数、字符及所…...

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天(中)
虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天-CSDN博客 上篇偏重实现步骤,中篇偏重理解校准和降低延迟,下篇加入上下文背景array和设置口音 TTS通用参数 ————————————————————————————————————…...

整流电路的有源逆变工作状态
目录 1. 逆变的概念 2. 有源逆变的条件 3. 电流电路的概念 4. 产生逆变的条件 5. 三相桥式全控整流电路的有源逆变工作状态 6. 逆变角的概念 7. 逆变失败的原因 8. 最小逆变角的限制 整流电路的有源逆变状态是指通过控制整流器,使其将直流电源的能量反向送回…...

Android 签名、空包签名 、jarsigner、apksigner
jarsigner是JDK提供的针对jar包签名的通用工具, 位于JDK/bin/jarsigner.exe apksigner是Google官方提供的针对Android apk签名及验证的专用工具, 位于Android SDK/build-tools/SDK版本/apksigner.bat jarsigner: jarsigner签名空包执行的命令: jar…...
java基础(小技巧)
文章目录 一、日志输出二、字符串拼接三、日期比较四、常用注解五、Lombok的原理 提示:以下是本篇文章正文内容,下面案例可供参考 一、日志输出 之前使用的方式。在要使用的类里面定义日志类: private static Logger logger LoggerFactory…...

Android Studio 安装配置教程(Windows最详细版)
目录 前言 Android Studio 下载 Android Studio 安装 Android Studio 使用 一、创建默认项目(Compose) 二、创建常规项目 三、使用ViewBinding 四、查看Gradle版本、SDK版本、JDK版本 ① Gradle版本 ② SDK版本 ③ JDK版本 前言 Android开发…...
Cesium绘制可编辑线
Cesium 第一章 绘制可编辑线 Screen-2024-09-17-202059的副本 文章目录 Cesium一、绘制线二、编辑线三、使用 一、绘制线 1、方法 //场景相机控制viewer.scene.screenSpaceCameraController.enableRotate false; //cesium相机控制 绘制和编辑时 禁止转动场景// 鼠标样式修改…...

【算法】差分思想:强大的算法技巧
📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…...

微软开源项目 Detours 详细介绍与使用实例分享
目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C++软件异常排查从入门到精通系列教程…...
Numba基础
1. Numba 基础 1.1 什么是 Numba? Numba 是一个 JIT 编译器,用于加速数值计算。它通过即时编译技术,将 Python 代码在运行时编译为机器代码,极大地提升执行速度,特别适合循环和矩阵操作等密集型计算。 2. Numba 基本…...

[JAVA]介绍怎样在Java中通过字节字符流实现文件读取与写入
一,初识File类及其常用方法 File类是java.io包下代表与平台无关的文件和目录,程序中操作文件和目录,都可以通过File类来完成。 通过这个File对象,可以进行一系列与文件相关的操作,比如判断文件是否存在,获…...

MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...

CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”
目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...