Reno、Cubic都是基于丢包的拥塞控制算法,Cubic适用场景是高带宽的,但现在丢包不一定是发生拥塞了,比如Bufferbloat(缓冲区膨胀),路由器的缓冲区满了的丢包。

一 基于模型的拥塞控制,分别测BltBw--瓶颈带宽、RTprop--即RTT。

图是google论文里的。

分为:应用受限--测RTT--管道没满、

带宽受限--测BltBw--管道满了,缓存没满,

缓存受限--管道满了,缓存满了。

(tcp_bbr.c的英文注释挺有帮助的。)

On each ACK, update our model of the network path:
bottleneck_bandwidth = windowed_max(delivered / elapsed, 10 round trips)
min_rtt = windowed_min(rtt, 10 seconds)
pacing_rate = pacing_gain * bottleneck_bandwidth
cwnd = max(cwnd_gain * bottleneck_bandwidth * min_rtt, 4)
//最后作用于发送拥塞窗口。/*A BBR flow starts in STARTUP, and ramps up its sending rate quickly.* When it estimates the pipe is full, it enters DRAIN to drain the queue.* In steady state a BBR flow only uses PROBE_BW and PROBE_RTT.* A long-lived BBR flow spends the vast majority of its time remaining* (repeatedly) in PROBE_BW, fully probing and utilizing the pipe's bandwidth* in a fair manner, with a small, bounded queue. *If* a flow has been* continuously sending for the entire min_rtt window, and hasn't seen an RTT* sample that matches or decreases its min_rtt estimate for 10 seconds, then* it briefly enters PROBE_RTT to cut inflight to a minimum value to re-probe* the path's two-way propagation delay (min_rtt). When exiting PROBE_RTT, if* we estimated that we reached the full bw of the pipe then we enter PROBE_BW;* otherwise we enter STARTUP to try to fill the pipe.
*/

二 四种状态机:

1 Startup:快速增速,使管道充满数据。3次增速不超过25%,进入Drain。

static const u32 bbr_full_bw_thresh = BBR_UNIT * 5 / 4;

2 Drain:清空Startup阶段多余的队列数据。inflight<=BDP,进入Probe_BW。

BDP=瓶颈带宽*RTT。

3 Probe_BW:大部分处于这个稳定状态,10s,min_rtt不变,进入Probe_RTT。

4 Probe_RTT:探测带宽是最大值,回到Probe_BW。持续200ms,snd_cwnd=4。

static const u32 bbr_cwnd_min_target = 4;

static const u32 bbr_probe_rtt_mode_ms = 200;

static const u32 bbr_min_rtt_win_sec = 10;

三 调整参数

pacing_gain=2.89,这个值变化过,优化后取2,因为接收方不是一收到数据就给一个确认。

Startup:pacing_gain= cwnd_gain=2.89。

Drain:pacing_gain =0.35,cwnd_gain=2.89。

Probe_bw:pacing_gain =[1.25,0.75,1,1,1,1,1,1],cwnd_gain=2。

Probe_rtt:pacing_gain= cwnd_gain=1,cwnd固定为4。

Probe_bw如何探测?

一组8个节拍

pacing_gain=1.25,RTT没变大,BltBW更新为更大的速率。RTT变大,BltBW不变。

pacing_gain=0.75,0.75倍BDP,放空管道的buffer。

bbr_is_next_cycle_phase(struct sock *sk,
                    const struct rate_sample *rs)

满足条件,cycle_idx+1,bbr_check_full_bw_reached、bbr_check_drain、bbr_update_min_rtt、

bbr_update_gains。

如何pacing?

/* NOTE: BBR might be used with the fq qdisc ("man tc-fq") with pacing enabled,
 * otherwise TCP stack falls back to an internal pacing using one high
 * resolution timer per TCP socket and may use more resources.
 */

1 tcp主动pacing,设置为SK_PACING_NEEDED。耗cpu,默认方式。

cmpxchg(&sk->sk_pacing_status, SK_PACING_NONE, SK_PACING_NEEDED);

2 依赖tc-fq的pacing。

tc qdisc add dev xxx root fq //enable fq

四 其它

RTT状态下不参与BW最大值计算。

当监测到使用令牌桶算法时,直接使用长期采样,避免频繁采样。

函数是bbr_lt_bw_sampling。

疑问:windows端到linux服务器,这部分怎么优化?

还是网络延时主要是服务器之间传输的优化?

五 BBR2优化点

1 bbr v1和reno一起,抢占带宽太厉害了,从90%到50%。

Drain排空一次到位。

退出Startup条件:1 丢包大于1%且丢包8个,进入drain。

2 路由器标记ECN的比例超过50%。

2 cwnd=4太影响体验了,改为:inflight = 0.75 bdp,在Probe_RTT状态。

进入Probe_RTT改为:2.5秒没有探测到更小的min_rtt,原来是10s。

3 Probe_BW细分up、down、cruise—巡航、refill。

BBR学习笔记--什么是BBR、可调整的参数相关推荐

  1. [python教程入门学习]python学习笔记(CMD执行文件并传入参数)

    本文章向大家介绍python学习笔记(CMD执行文件并传入参数),主要包括python学习笔记(CMD执行文件并传入参数)使用实例.应用技巧.基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋 ...

  2. ROS学习笔记六:理解ROS服务和参数

    ROS学习笔记六:理解ROS服务和参数 主要介绍ROS服务和参数,同时使用命令行工具rosservice和rosparam. ROS service service是节点之间互相通信的另一种方式,se ...

  3. PyTorch学习笔记(六)——Sequential类、参数管理与GPU

    系列文章\text{\bf 系列文章}系列文章 PyTorch学习笔记(一)--Tensor的基础语法 PyTorch学习笔记(二)--自动微分 PyTorch学习笔记(三)--Dataset和Dat ...

  4. Dynamic CRM 2013学习笔记(一)插件输入实体参数解析

    1. 问题描述 最近新建了一个post事件的插件,传入的参数处理如下: 1: if (context.InputParameters.Contains("Target") & ...

  5. ESP8266学习笔记7:保存和读取自定义参数

    我整理了从2015年至今关于ESP8266的学习笔记,梳理出来了开发环境.基础功能.进阶学习三大部分,方便自己和他人.可点此查看,欢迎交流. 前言 这几天正在使用ESP8266接入机智云,需要保存一些 ...

  6. OpenCvSharp 学习笔记6 --图像亮度和对比度调整

    一 理论: 图像变换有两种操作: 1:点操作 – 像素变换 2:区域操作 --邻域像素操作,图像周围的像素操作 调整图像亮度和对比度属于像素变换的点操作. g(x,y)=αf(x,y)+βg(x,y) ...

  7. PS学习笔记——通过三种方式调整人像照片亮度

    第一种方案: 在图像--调整菜单,有一个亮度/对比度选项.打开这个菜单可以通过简单的拖移滑杆来对图像亮度进行调整. 第二种方案: 依然在图像--调整菜单,使用色阶菜单.与第一种方案有何区别呢?第一种方 ...

  8. FFmpeg学习笔记--FFplay播放控制、FFplay基本命令参数、FFplay高级命令参数

    目录 1--FFplay播放控制 2--FFplay命令参数 1 强制显示宽高,用于调整窗口大小 2 设置帧尺寸,仅适用于没有包含帧大小的视频 3 设置像素格式 4 以全屏模式启动 5 禁用音频.视频 ...

  9. JVM学习笔记(三):JVM基本参数

    1 来源 来源:<Java虚拟机 JVM故障诊断与性能优化>--葛一鸣 章节:第三章 本文是第三章的一些笔记整理. 2 GC日志:-Xlog:gc 要打印GC日志的话,可以加上-Xlog: ...

最新文章

  1. php 操作分表代码
  2. MATLAB语法基础
  3. Spring MVC整合Velocity
  4. UVa11038 - How Many O's?(统计0的个数)
  5. IT-标准化-系列-0.课程-V1.0
  6. 全球及中国生物医药产业供给需求前景与运营风险分析报告2022版
  7. sicily vector有序插入
  8. Java操作数据库Sqlite样例代码
  9. python函数作为参数例题_笨办法学Python 习题 19: 函数和变量
  10. 我的程序人生以及一些杂项
  11. 闲谈:我为什么热爱开源
  12. java 第三方序列化,11.既然有第三方的序列化方式,说明java官方提供的序列化方式应该有一些很明显或者很致命的缺点……...
  13. c语言设计二级考试程序修改题,全国计算机二级考试C语言复习题与答案解析
  14. 5G时代到来,那我们现在用的4G手机怎么办?
  15. 自加++(Java版本)
  16. ClassNotFoundException和NoClassDefError之间的区别
  17. c语言 链接器 原理,新手向的链接器知识普及/////就是这样的说
  18. 画五角星中间没有填充_冷军画两个白色五角星,卖出230万,专家大呼:这不是画...
  19. 基于改进的残差网络的指纹识别算法
  20. linux 强制结束任务管理器,结束拒绝访问的进程 cmd下结束进程 强行结束进程

热门文章

  1. ROC曲线绘制(详细)以及模型选择
  2. 富可视m310 android 4.4,富可视 M310 4.2.1 ROM刷机包 版本发布公告
  3. nokia x7 android 9.0,诺基亚X7升级Android 9.0系统 HDR拍照画质大幅提升
  4. JavaScript函数(看这个就可以了)
  5. mysql语法大全和jdbc知识汇总
  6. 用pycharm写python_在PyCharm中使用VPython
  7. xadmin报cannot import name ‘DEFAULT_FORMATS‘ from ‘import_export.admin‘/cannot import name ‘SKIP_ADMI
  8. centos 7.2执行yum -y install报错Metadata file does not match checksum
  9. 计算机软件相关参考文献,计算机软件论文参考文献范文.doc
  10. linux中find命令详解,Linux下的find指令详解