拥控算法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对象,可以进行一系列与文件相关的操作,比如判断文件是否存在,获…...
Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
