TCP CUBIC 动力学

news2024/10/6 20:40:02

曾陪经理一起面试,问过一个问题:

CUBIC 的公式:
W ( x ) = C ( x − K ) 3 + W m a x W(x)=C(x−K)^3+W_{max} W(x)=C(xK)3+Wmax

其中 x 是什么意思?

本意是想候选人回答 “x 是绝对时间”,然后我会接着问 “这个 x 如何采样?”

候选人巧妙绕开了问题,说了句无关紧要的话,解释了一下传输优化的概念…

昨天与同事讨论问题,又想起这个,来解释一下。参见下图,这是 CUBIC 在一个 AIMD 周期的 cwnd/time 图:
在这里插入图片描述
横轴表示 “绝对时间”,因此 CUBIC 的特点之一是 “RTT 无关”,只要给定一个距离 AIMD 周期开始的 delta time,就能算出相对于周期开始时 Wmin 的增量。

第一个问题,x 即 “距离当前周期开始的绝对时间”。现在看第二个问题,x 如何采样。

TCP 由 ACK 时钟驱动,每收到一个 ACK,均要计算 cwnd 作为发送配额,针对第二个问题简单的回答就是 “ACK 到达时采样计算”,此样本将用来计算 “直到下一次采样点为止 cwnd 的增量”,目的是保证在下一次采样点(一般意义上即下一个 ACK 到达)之前,有充足的 cwnd 配额可供持续发送数据。

更深一步的问题就来了,delta time 的值如何取呢?这是一个预测未来的问题,即 “下一个 ACK 最短以及最长何时到达?”

为回答该问题,先看另一个问题,delta time 太长或太短分别会怎样?

ACK 到达,采样打点就是为了绘制这条曲线,采样打点越密集,曲线越光滑,反之则会变成马赛克楼梯状。结论很明确:考虑到 ACK 持续到达,delta time 越小,cwnd 增量越小,发送越平滑,delta time 越大,cwnd 增量越大,发送行为越突发。

拥塞大多与突发有关,好的拥塞控制要旨即控制突发,最佳策略就是 “delta 设置为 ACK 持续到达的间隔”,例如,如果 ACK 以 5us(or 更小) 为间隔到达,则 delta time = 5us,下一个 5us 的 cwnd 增量即这段时间的发送配额,这是个极短时间段内的极小增量,保持和 ACK 时钟 pacing 一致,本质上就是 pacing,避免了突发。

不光如此,cwnd 增量过大还可能导致乐观预测未来,预支过多带宽而丢包,最好的方法还是一步一个小脚印。无论从突发角度还是从乐观预支角度,都倾向于使用一个极小的 delta time。

但现实没有这么理想,TCP 自带两种突发:

  • 每次发送一个 mss 大小的段而不是 1 字节;
  • ACK 会 delay 至一个 RTT 而积累,ACK 也可能被聚合突发到达。

因此 delta time 不能任意小,否则当这么短的时间段过去后,下一个 ACK 尚未到达,造成 cwnd 配额用尽而进入空窗期无法再继续发送。反过来,delta time 肯定也不能太大。

Linux TCP 选择的是 minrtt,可能真有点小,但这么久的时间收不到一个 ACK 也属罕见。

如果想使用极小的 delta time 绘制极光滑的 CUBIC 曲线就要抛弃 ACK 时钟,自己设置定时器(如 Linux hrtimer)驱动曲线的绘制,比如每 1us or 5us 滴答一下,计算 cwnd 增量作为接下来的时钟周期内的发送配额。

关于文初的问题,就说到这里,按我的惯例,下面就着这个问题继续引申。

CUBIC 除了 RTT 无关外,还有第二个特征,即 cwnd 谨慎逼近 Wmax 后快速 probe。这两个特征都来自对 BIC 的反复。

CUBIC 第二个特征继承自 BIC 的二分搜索,但 BIC 与 RTT 相关,利好短 RTT,CUBIC 解决了这问题,RTT 无关也就成了 CUBIC 的特征。这就是 CUBIC 与 BIC 的渊源,至于 BIC,它本就是对 TCP Reno AIMD 行为的优化。

问题来了,CUBIC 只是实现第二个特征的一种方式,而非唯一方式,我看 CUBIC 实现时,甚纠结,Linux kernel 描绘三次曲线非常费劲,于是我想到另一个方法:双斜率直线,叫 TCP DoubleLine:
在这里插入图片描述
学 CUBIC 的样子,“找出” 一族曲线并不难,和 CUBIC 三次曲线一样,剩下的交给调参:
在这里插入图片描述
其本质含义和 CUBIC 没什么不同,RTT 无关,且 “谨慎逼近 Wmax 后加速 probe”,但显然线性计算或二次曲线比 CUBIC 计算变得更简单。

更普遍地,可以不操作斜率,直接部署两条真直线,可看作 Standard TCP 的 RTT 无关版:
在这里插入图片描述
甚至可以再去掉一个约束,连双斜率也不要,仅保留一条直线:y = alpha * x,其中 0 < x < Wmax/alpha:
https://github.com/marywangran/tcp_line

这种可能更适合 Wi-Fi 等毫无规律的场景,无规律就不能有任何假设,谨慎逼近 Wmax 后加速 probe,只能适得其反,还是纯 AIMD 最简单,无益也无害。模仿骰子猜数字,永远随机猜胜率最高。

说起 TCP 端到端拥塞控制,CUBIC 已在顶端,信息有限的约束下,没任何算法能识别随机丢包和拥塞丢包,更别提精确识别了。很多人推崇 BBR,认为 BBR 高带宽在于抵抗随机丢包,但 BBR 要付出其它代价,简单说就是赌博。

BBR 依靠的只是 “观望一会儿再看一下” 这种硬扛的方法应对丢包(BBR2 采用了更锉的方案,引入一个丢包率,大于这个比率才反应),如果真是随机丢包就赌赢了,万一是真拥塞就意味着输掉赌注,大丢包大重传。和 CUBIC 一样,BBR 也靠猜,不同的是,CUBIC 无差别响应丢包,而 BBR 靠信念赌博,对待丢包这件事上,BBR 往左,CUBIC 往右而已。

为什么 BBR 吞吐比 CUBIC 高?以上这段话可以解释。同时,正如 BBR 作者之一本人所说:

BBR is not trying to maintain a higher throughput than CUBIC in these kinds of scenarios with steady-state bulk flows. BBR is trying to be robust to the kinds of random packet loss that happen in the real world when there are flows dynamically entering/leaving a bottleneck.

在公平视角,BBR 并没有抢占更多 CUBIC 流的带宽,它只是恰好填充了由于 CUBIC 流对丢包对无差别反应而主动丢失的带宽,即便利用本来已经被 CUBIC 流 “浪费” 掉的带宽,纯想捡漏,BBR 也要以高重传率押注。
综合来看,虽然 CUBIC 吞吐不及 BBR,但相比 BBR,CUBIC 更加平衡,也就更加优秀:
在这里插入图片描述

CUBIC 作为使用最普遍的 cca 不是没有原因的,综合效能来看,CUBIC 已经到了非常高的位置,因此在很多系统中它都是缺省算法,无论从效率还是公平性来看都非常不错。但大家普遍推崇 BBR,因为在更多人眼里,所谓的 “意义” 就是吞吐高,而 BBR 恰好满足这一特征。但正如文末的图示所示,比这个更重要的是全局公平。

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

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

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

相关文章

[SWPUCTF] 2021新生赛之(NSSCTF)刷题记录 ②

[SWPUCTF] 2021 新生赛&#xff08;NSSCTF刷题记录wp&#xff09; [SWPUCTF 2021 新生赛]no_wakeup[鹤城杯 2021]easy_crypto[suctf 2019]EasySQL[ZJCTF 2019]NiZhuanSiWei[强网拟态 2021]拟态签到题[BJDCTF 2020]easy_md5[SWPUCTF 2021 新生赛]easyupload3.0[SWPUCTF 2021 新生…

Python解决微软Microsoft的登录机器人验证

前言 本文是该专栏的第8篇,结合优质项目案例,让你精通使用Pyppeteer,后面会持续分享Pyppeteer的干货知识,记得关注。 在注册微软Microsoft账号或者注册outlook邮箱账号的时候,会遇到如下机器人验证: 是的,你可能第一眼看到这个验证页面,首先会想到是定位它的页面元素N…

数据结构各结构特点(数组、链表、栈、队列、树)

目录 一、数组 二、链表 三、栈 四、队列 五、树 1.二叉树 2.二叉查找树 3.平衡二叉树&#xff08;AVL树&#xff09; 4.红黑树 六、总结&#xff1a; 1.红黑树和平衡二叉树的区别&#xff1a; 2.为什么有了数组和链表还要引入二叉树&#xff1f; 3.为什么有了二叉树…

【Linux】从机I/O线程报错

一、报错问题 I/O线程报错 查看/var/log/mysqld.d日志&#xff0c;查看报错&#xff1b; 在从机&#xff0c;telnet主机的3306端口显示拒绝连接&#xff1b; 并且从机mysql登录用户密码问题&#xff0c;密码输入正确但是报错【ERROR 1045 (28000): Access denied for user root…

软件开发中的DevOps实践

一、引言 在软件开发领域&#xff0c;为了满足用户需求、提升产品质量、缩短产品上线时间&#xff0c;DevOps已经成为一种流行的开发实践方式。本文将从什么是DevOps、DevOps的理念、DevOps的价值、DevOps的实践等方面详细介绍DevOps在软件开发中的实践。 二、什么是DevOps …

python爬虫原理及源码解析(入门)

目录 一、爬虫是什么&#xff1f;二、爬虫的基本原理三、HTTP协议与响应4、爬虫实现源码 一、爬虫是什么&#xff1f; ​ 如果将互联网比作一张大的蜘蛛网&#xff0c;数据便是存放在蜘蛛网的各个节点&#xff0c;而爬虫就是一只小蜘蛛&#xff0c;沿着网络抓取自己的猎物(数据…

用spring-boot-starter实现事务的统一配置

一、前言 微服务架构下&#xff0c;多个微服务都需要事务操作&#xff0c;如果在每个微服务下都从头配置事务&#xff0c;将非常繁锁。事务配置具有高度的一致性&#xff0c;可以抽取出来&#xff0c;制作starter&#xff0c;在需要配置事务的服务中引入starter依赖即可。 采用…

NFS(UOS)

appsrv 172.16.146.11 strogesrv 172.16.146.53 共享/data/share目录 用于存储app主机的web数据 仅允许stora访问该共享 安装nfs apt install nfs-common nfs-kernel-server -y mkdir /data/share /data/share 172.16.146.50(rw,sync,no_root_squash,insecure) 重启服…

志特转债上市价格预测

志特转债 基本信息 转债名称&#xff1a;志特转债&#xff0c;评级&#xff1a;A&#xff0c;发行规模&#xff1a;6.14033亿元。 正股名称&#xff1a;志特新材&#xff0c;今日收盘价&#xff1a;35.6元&#xff0c;转股价格&#xff1a;41.08元。 当前转股价值 转债面值 / …

微服务学习高级篇【5】之服务异步通信(rabbitmq的高级特性)

文章目录 环境准备&#xff1a;MQ部署【docker环境】消息可靠性生产者消息确认项目配置定义Return回调和ConfirmCallback 消息持久化交换机持久化队列持久化消息持久化 消费者消息确认none模式演示 消费失败重试机制本地重试失败策略 总结 死信交换机初识死信交换机死信交换机接…

【DHCP原理与配置】

目录 一、了解DHCP服务使用DHCP的好处DHCP的分配方式 二、DHCP的租约过程传输协议端口DHCP的IP地址自动获取工作原理 三、配置DHCP服务器安装dhcp查看配置文件根据配置文件提示查看相关文档 四、模拟外网和内网互通进入主机1的设置进入主机2的设置复制dhcp文件&#xff0c;修改…

Nginx 优化与防盗链

Ngnix优化主要有两种&#xff0c;一种是配置上的优化&#xff0c;一种是内核上的优化 实验准备&#xff1a;安装好一台Nginx服务器&#xff0c;IP&#xff1a;192.168.126.22&#xff0c;域名&#xff1a;www.accp.com 浏览器访问nginx服务器此时F12查看网页信息&#xff0c;可…

MySQL之表的约束

目录 一 空属性 定义 如何设置 示例 影响&#xff1a; 二 默认值 定义 示例 影响&#xff1a; 三 列描述 定义 示例 影响&#xff1a; 四 zerofill 定义&#xff1a; 示例&#xff1a; 影响&#xff1a; 五 主键 定义 主键的性质是什么&#xff1a; 为什么要…

C++——一种特殊的二叉搜索树之红黑树

目录 1 红黑树的概念2 红黑树的性质3 红黑树节点的定义4 红黑树的插入操作情况一: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红。情况二: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff08;不存在连续的红结点&#xff09;&#xff0c;u不存在/u存…

设计模式 -- 适配器模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

第五篇 Spring 集合注入、作用域

《Spring》篇章整体栏目 ————————————————————————————— 【第一章】spring 概念与体系结构 【第二章】spring IoC 的工作原理 【第三章】spring IOC与Bean环境搭建与应用 【第四章】spring bean定义 【第五章】Spring 集合注入、作用域 【第六章】…

时间序列分析卫星重力梯度观测值

阚昊宇 1 时间序列图 导入数据&#xff0c;共2880历元&#xff08;86370 s&#xff09;数据&#xff0c;取前2400历元&#xff08;72000 s&#xff09;数据作为训练集&#xff0c;后480历元作为测试集。将训练集绘制时间序列图如下图 1红色线所示&#xff0c;可见明显的自相关…

elementUI-el-table组件使用总结

一、背景 vue2项目中用到el-table这个组件&#xff0c;但基础的功能不够用&#xff0c;所以需要自定义 二、表头自定义 比如要让表头展现出下面的形式&#xff1a; 只需使用 slot"header" slot-scope"scope" 对插槽进行定义&#xff0c;并绑定变量 <…

快手视频艾特实操教学分享,什么是艾特脚本,评论区艾特引流脚本讲解!

大家好我是你们的小编一辞脚本&#xff0c;今天给大家分享新的知识&#xff0c;很开心可以在CSDN平台分享知识给大家,很多伙伴看不到代码我先录制一下视频 在给大家做代码&#xff0c;给大家分享一下快手艾特脚本的知识和视频演示 不懂的小伙伴可以认真看一下&#xff0c;我们…

Windows系统开启防火墙,Ubuntu与Windows互通

1.启用Windows系统防火墙&#xff0c;&#xff0c;单击"高级设置" 2.单击“入站2规则” 3.单击 “新建规则“ 4.选择“端口” 端口号设置hanwin NFS中包括的端口号。 5.选择 TCP 填写 hanewin中的端口号&#xff0c;然后单击“确认” 6.单击“入站规则” 7.右击 nf…