BBR 带宽估计的延后累加

news2024/11/24 1:05:31

一个关于时延统计分布的小测试,用 netem delay jitter distribution pareto 模拟,得到下面的结果:
在这里插入图片描述

netem 的 jitter 并不是真 jitter,只是通过延时阻滞部分报文模拟 jitter,对保序流而言,就表现为乱序,如下图所示,通过 ack 号和时间戳均能看出:
在这里插入图片描述

netem 的局限有目共睹,这里不纠结。问题是,如果现实中真的发生 ack 乱序会怎样。

Linux kernel TCP 单独处理了 old_ack:

if (before(ack, prior_snd_una)) {
        goto old_ack;
}
...
old_ack:
        /* If data was SACKed, tag it and see if we should send more data.
         * If data was DSACKed, see if we can undo a cwnd reduction.
         */
        if (TCP_SKB_CB(skb)->sacked) {
                flag |= tcp_sacktag_write_queue(sk, skb, prior_snd_una,
                                                &sack_state);
                tcp_fastretrans_alert(sk, prior_snd_una, num_dupack, &flag,
                                      &rexmit);
                tcp_newly_delivered(sk, delivered, flag);
                tcp_xmit_recovery(sk, rexmit);
        }

        return 0;

注意 tcp_sacktag_write_queue 调用,它会将 sack_block in old_ack 累加到当前 tp->delivered 字段,累加过去的 sack_block 会过估当前 delivery rate。

这是一个明确的 ack 乱序导致的 tp->delivered 延后累加,先再次解释 delivery rate 的计算方法:

  • 找到当前 ack 中被 ack/sack 的最晚发送的报文 p;
  • 确认 p 被发送的时间 t_p 及当时成功 delivered 的数据量 n_p;
  • 计算速率 r = (n_curr - n_p) / (t_curr - t_p)

整件事可用下面的 tcptrace 时空图解释:
在这里插入图片描述

当 old_ack 到达时发送的报文被 ack 后,迟到累加的 tp->delivered 对带宽的过估影响才能消除。否则在 sack_block in old_ack 的实际核算区域,计算 delivery rate 时均要减去本 sack_block 覆盖的数据量,由于 old_ack 迟到造成的此前带宽低估就随它去吧。

这个修改背后的思想是合理的,任何时间序列(而不是空间)中,历史的误判不应让未来买单,要及时止损,否则可能面临双倍惩罚。如果前面一个 rtt 低估了带宽,低估就低估吧,不要以下一个 rtt 高估带宽来弥补。

像 bbr 类 rate-based 算法,低估带宽不可怕,它自己的状态机(比如 probe up)能搞定,但高估带宽甚至直接打乱状态机的正常运行,比如 buffer 以非预期方式被占用,竟然因为高估带宽而不是 probe up,则 0.75x drain 就没用了,就像飞机失速很难改出一样。

简单的例子,bbr 流故意高估带宽,带来更大的 delivery rate 被记住,几乎没有任何机制排空 buffer,这是个相当不稳定的状态。如果抖动真由 buffer 带入,很容易由于瞬时 minrtt 造成带宽高估(这也是 netem 靠乱序模拟抖动时吞吐更高的原因,但凡有几个极小的 rtt 就赢了),将状态机引入难以控制的未知。

本文内容实在想不通就考虑 old_ack 丢了,但丝毫不影响传输的场景,丢就丢了呗,为什么要为过去的事揪心呢,迟到了就是晚了,就当它丢了得了。为过去的事,搅乱当前的安排(schedule),不值当,那就干脆点,全部干掉好了,广义地说,maybe undo 和 maybe retrans 也不要才好,那就把 old_ack 这个 label 去掉吧。

皮鞋没有蹬上,露着白袜子。

浙江温州皮鞋湿,下雨进水不会胖。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/994204.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

搭建自己的OCR服务,第一步:选择合适的开源OCR项目

一、OCR是什么? 光学字符识别(Optical Character Recognition, OCR)是指对文本资料的图像文件进行分析识别处理,获取文字及版面信息的过程。 亦即将图像中的文字进行识别,并以文本的形式返回。 二、OCR的基本流程 1…

Science子刊 | 将CAR-T细胞疗法与造血干细胞移植相结合 或许 能治疗所有血液癌症...

来源:BRUNO DELESSARD/CHALLENGES-REA/REDUX 新的CAR-T细胞疗法有望能治疗几乎所有血液癌症。目前,该疗法已被批准用于五种亚型的血液癌症。宾夕法尼亚大学帕尔曼医学院的科学家们在预临床试验中展示了这种方法的潜在效能。 2023年8月31日,发…

动态路由的主流算法

路由器就是一台网络设备,它有多张网卡。当一个入口的网络包送到路由器时,它会根据一个本地的转发信息库,来决定如何正确地转发流量。这个转发信息库通常被称为路由表。 一张路由表中会有多条路由规则。每一条规则至少包含这三项信息。 目的…

vscode 调试 ROS2

1、在下列目录同层级找到.vscode文件夹 . ├── build ├── install ├── log └── src 2、 安装ros插件 3、创建tasks.json文件,添加下列内容 //代替命令行进行编译 {"version": "2.0.0","tasks": [{"label": &…

一窥未来:PyQt5引领下一代Python GUI开发

PyQt5 是一个用于创建图形用户界面(GUI)的强大工具包,它基于 Qt 库,为 Python 提供了丰富的 GUI 开发能力。无论是初学者还是有经验的开发者,都可以通过本文深入了解如何使用 PyQt5 来构建各种各样的界面应用程序。本文…

CUDA说明和安装[window]

文章目录 1、查看版本信息查看GPU查看cuda版本其他方法 2区分 了解cudaCUDA ToolkitNVCCcuDNN 3/ 安装过程4/版本的问题CUDA Toolkit和 显卡驱动 的版本对应CUDA / CUDA Toolkit和cuDNN的版本对应 5/关于CUDA和Cudnn**5.1 CUDA的命名规则****5.2 如何查看自己所安装的CUDA的版本…

力扣接雨水(解析)

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] …

lv4 嵌入式开发-2 Linux文件IO

1 文件的打开 1.1 标准I/O - 打开文件 下列函数可用于打开一个标准I/O流&#xff1a; FILE *fopen (const char *path, const char *mode);成功时返回流指针&#xff1b;出错时返回NULL标准I/O – fopen – mode参数 示例 #include <stdio.h> int main(int argc, ch…

微信支付-Native支付(网页二维码扫码微信支付)简单示例

目录 概述 界面展示 & 前端代码&#xff08;Vue&#xff09; 后端实现&#xff08;SpringBoot&#xff09; Maven依赖 下单接口&#xff08;主要功能代码&#xff09; 支付成功回调接口 测试&#xff08;后端线上环境&#xff09; 概述 本篇博文主要演示和说明网页扫…

SpringSecurity学习

1.认证 密码校验用户 密码加密存储 Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter {Beanpublic PasswordEncoder passwordEncoder(){return new BCryptPasswordEncoder();}} 我们没有这个配置&#xff0c;默认明文存储, {id}password;实现…

html 学习 之 文本标签

下面是一些常见的HTML文本标签&#xff08;&#xff0c;&#xff0c;&#xff0c;&#xff0c;和&#xff09;以及它们的作用&#xff1a; 标签 (Emphasis - 强调): 作用&#xff1a;用于在文本中表示强调或重要性。 示例&#xff1a; <p>这是一段文本&#xff0c;&l…

python将dataframe按需绘制折线图、柱状图、双坐标图

目录 绘制TI折线图绘制 import matplotlib.pyplot as plt# 设置中文显示 plt.rcParams[font.sans-serif] [SimHei] # 指定默认字体 plt.rcParams[axes.unicode_minus] False # 解决负号显示问题绘制TI折线图 def draw_TI(df_TI_night, output_TI_png, sector_id, terrain, …

代码随想录算法训练营第五十九天| 503.下一个更大元素II,42. 接雨水

代码随想录算法训练营第五十九天| 503.下一个更大元素II&#xff0c;42. 接雨水 503.下一个更大元素II42. 接雨水暴力解法双指针优化单调栈解法 503.下一个更大元素II 题目链接 视频讲解 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &a…

腾讯云优惠券:定义、领取方法及使用教程

腾讯云作为国内知名的云计算服务提供商&#xff0c;经常为用户提供各种优惠活动&#xff0c;本文将详细介绍腾讯云优惠券的定义、领取方法及使用教程&#xff0c;助力大家轻松上云&#xff01; 一、腾讯云优惠券定义介绍 腾讯云优惠券是什么&#xff1f;腾讯云优惠券是腾讯云推…

谈一谈对string容器的赋值重载的更深一步理解

先来看一看我写的string容器&#xff08;包含了基本的构造&#xff0c;析构&#xff0c;赋值&#xff0c;拷贝&#xff09;。 class String { public://构造/*explicit*/ String(const char* arr "") {assert(arr);//判别不会传入空指针cout << "String…

markdown pdf报错问题

vscode的md文件转pdf的插件 右键可以直接转换 但是很久没用&#xff0c;现在重新使用出现了报错 ERROR: Failed to download Chromium! If you are behind a proxy, set the http.proxy option to settings.json and restart Visual Studio Code. 解决办法 首…

万字C语言之分支语句和循环语句

前言&#xff1a; &#x1f4d5;作者简介&#xff1a;热爱编程的小七&#xff0c;致力于C、Java、Python等多编程语言&#xff0c;热爱编程和长板的运动少年&#xff01; &#x1f4d8;相关专栏Java基础语法&#xff0c;JavaEE初阶&#xff0c;数据库&#xff0c;数据结构和算法…

OpenCV DNN深度学习简介

&#x1f482; 个人主页:风间琉璃&#x1f91f; 版权: 本文由【风间琉璃】原创、在CSDN首发、需要转载请联系博主&#x1f4ac; 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 前言 本文基本上来自以下官方手册&#xff1a;https://learnopencv.com/deep-l…

9月8日扒面经

慢sql日志的排查和调优 开启慢查询日志&#xff1a;首先需要确保数据库的慢查询日志功能已经开启。在MySQL中&#xff0c;可以通过设置slow_query_log参数为1来开启慢查询日志&#xff0c;并设置long_query_time参数来定义慢查询的阈值。定位慢查询语句&#xff1a;根据慢查询…

.kann勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复

引言&#xff1a; 在数字化时代&#xff0c;勒索病毒已经成为了网络安全的严重威胁&#xff0c;其中 .kann 勒索病毒是最新的一种。这种恶意软件通过加密您的数据文件&#xff0c;然后勒索您支付赎金以获取解密密钥。本文将深入探讨 .kann 勒索病毒、如何恢复被它加密的数据文件…