dctcp 可扩展、低时延图解

news2025/5/24 8:22:08

理想 reno 和理想 dctcp 的单流 cwnd-time 演化图如下:
在这里插入图片描述

很直观地展现出 dctcp 锯齿小很多,锯齿小意味着高效。

dctcp 利用交换机反馈而来的 ecn 可精确计算导致排队超过 k 的报文比例,减去这一比例的 inflight 就是合适的。但 dctcp 在 reno aimd 的动态过程之上,实际的多流情况很难在图像上标识,还要结合算术上分析:
在这里插入图片描述

阴影小三角形和梯形 abcd 的面积之比就是 alpha: 1 2 ( ( w + 1 ) + ( w + 1 ) ( 1 − α / 2 ) ) ∗ ( w + 1 ) ∗ α / 2 2 = α \dfrac{\frac{1}{2}}{\frac{((w+1)+(w+1)(1-\alpha/2))*(w+1)*\alpha/2}{2}}=\alpha 2((w+1)+(w+1)(1α/2))(w+1)α/221=α ,现代网络的 cwnd 不会太小,可忽略 w 低阶项,解得 α = 2 w \alpha=\sqrt{\dfrac{2}{w}} α=w2 ,那么 (w + 1) - (w + 1)*(1 - alpha / 2) 就是锯齿的大小,将 alpha 代入,得到: ( w + 1 ) − ( w + 1 ) ∗ ( 1 − α / 2 ) = 2 ( w 2 + 2 w + 1 ) w / 2 ≈ 2 w 2 (w+1)-(w+1)*(1-\alpha/2)=\sqrt{\dfrac{2(w^2+2w+1)}{w}}/2\approx\dfrac{\sqrt{2w}}{2} (w+1)(w+1)(1α/2)=w2(w2+2w+1) /222w 而对于标准 reno aimd,对应的上述值是 w + 1 2 \dfrac{w+1}{2} 2w+1 。简单比较一下二者:
在这里插入图片描述

简单的同步流场景,reno tcp 的最大 cwnd = (C * RTT + buffer) / N,而 dctcp 最大 cwnd = (C * RTT + K) / N。虽然只有一字之差,但 dctcp 并非只是 buffer = K 的替代,这正体现在上图的绿线中,这个根号 2w 的关系就来自于 dctcp 交换机反馈的精确信息,而如果没有这个信息,如黑线所示,reno 只能盲目以 0.5 为 md 系数猛降 cwnd 而造成大锯齿,cubic 虽改观,但本质不变。

从上述分解,可得 dctcp 拥塞周期为: T d c t c p = 2 ( C ∗ R T T + K ) / N 2 T_{dctcp}=\dfrac{\sqrt{2(C*RTT+K)/N}}{2} Tdctcp=22(CRTT+K)/N ,对应于 reno tcp,拥塞周期为: T r e n o = C ∗ R T T + B S i z e 2 N T_{reno}=\dfrac{C*RTT+BSize}{2N} Treno=2NCRTT+BSize ,C * RTT 为定值,姑且就让 BSize = K,变化 N,看看 dctcp 和 reno 拥塞周期的区别:
在这里插入图片描述

dctcp 的拥塞周期不随 N 变化,也不随 buffer 变化,这是 dctcp 可扩展的一面,另一面,观察队列变化可见排队时延的变化,对于 dctcp,queue 为: N ∗ ( ( w + 1 ) − ( w + 1 ) ∗ ( 1 − α / 2 ) ) ≈ N ∗ 2 w 2 = 2 N ( C ∗ R T T + K ) 2 N*((w+1)-(w+1)*(1-\alpha/2))\approx\dfrac{N*\sqrt{2w}}{2}=\dfrac{\sqrt{2N(C*RTT+K)}}{2} N((w+1)(w+1)(1α/2))2N2w =22N(CRTT+K) ,N 为流数量,开个根号就啥也没了,时延相对流的数量变化相当平缓,而对于 reno tcp,queue 完全受 buffer 限制,在 buffer 允许情况下,流数量越多,queue 越长,时延随流数量增加而明显增加。这就是 dctcp 的可扩展性的全部。

从以上分析可自然而然得到 dctcp 低时延结论,再次看 dctcp 和 reno tcp 的 queue 长度变化, Q L d c t c p = 2 N ( C ∗ R T T + K ) 2 QL_{dctcp}=\dfrac{\sqrt{2N(C*RTT+K)}}{2} QLdctcp=22N(CRTT+K) Q L r e n o = C ∗ R T T + B S i z e 2 QL_{reno}=\dfrac{C*RTT+BSize}{2} QLreno=2CRTT+BSize ,将 N 等效为 BSize,可见 dctcp 队列的变化比 reno tcp 慢得多,很小的 K 值保持很小的排队时延就能容忍很宽的 C * RTT 范围,与此能力相对,reno tcp 需要 BSize 线性同步于 C * RTT,如果 C * RTT 很大而没有足够大的 buffer 与之匹配,reno aimd 一下子把 cwnd 降一半,把 inflight 降到不足 C * RTT,带宽将得不到有效利用。

我们发现,dctcp 的结论竟然就是异步 reno aimd 的结论,参见 dcn 交换机 buffer 的平方反比律。

大致就这么多。

如果把 dctcp 搬到广域网,满足 l4s 框架的交换机替代可 ecn 的 dcn 交换机,在 rtt 动态范围很大的广域网场景,配合 rtt-independence 特性解决小 rtt 流量侵略性问题: m × i n c r e a s e m e n t p e r A C K = 1 W v i r t m\times increasement_{perACK}=\dfrac{1}{W_{virt}} m×increasementperACK=Wvirt1,所以, i n c r e a s e m e n t p e r A C K = 1 m 1 W v i r t = 1 m 1 C ∗ R T T v i r t = 1 m 1 C ∗ m ∗ R T T = 1 m 2 1 W increasement_{perACK}=\dfrac{1}{m}\dfrac{1}{W_{virt}}=\dfrac{1}{m}\dfrac{1}{C*RTT_{virt}}=\dfrac{1}{m}\dfrac{1}{C*m*RTT}=\dfrac{1}{m^2}\dfrac{1}{W} increasementperACK=m1Wvirt1=m1CRTTvirt1=m1CmRTT1=m21W1,典型的一个 bdp 不变,把宽拉成长的操作。这就是一个低时延,低丢包,可扩展的算法,tcp prague,当然,它才刚起步。

我曾经对减小锯齿的方向不看好,因为我没有想到可以靠网络反馈信息,在纯端到端约束下,纯靠 capacity-search 的 aimd 变体根本无法减小锯齿,当它变钝,它必变长,当它变尖,它必变深,拉扯而已,却始终无法既短又钝,既尖又浅。vegas 在另一个方向也有时延不可扩展的问题难以解决。

随着带宽逐渐丰盈,应用也逐渐丰富,实时应用基本取代了离线应用,人们对时延的要求超过了对带宽的要求,宁取低时延而无需高带宽,带宽和时延的需求是不对称的,正如总量和种类的需求不对称一样,当人们吃饱了时,就无需越来越多的大米小麦了,但对饮食种类的需求是无止境的。

在这背景下,任何阻碍低时延的障碍都应被清除。起初人们认为网络分层模型是一个好模型,当时互操作大于一切,而如今低时延大于一切时,谁还在乎分层。网卡都可以 offloading tcp 了,交换机为什么不能呢。我在前几天评论到,在 rfc9000 quic 之前,人们把 quic 视作应用层,在 rfc9000 之后,quic 就无层了。

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

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

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

相关文章

快速跳闸中间继电器 RXMS1-RK216 066-AD 24V 柜内安装,板后接线带中座

系列型号 RXMS1 RK 216 437快速跳闸继电器;RXMS1 RK 216 237快速跳闸继电器; RXMS1 RK 216 449快速跳闸继电器;RXMS1 RK 216 249快速跳闸继电器; RXMS1 RK 216 450快速跳闸继电器;RXMS1 RK 216 250快速跳闸继电器&…

5.云原生之DevOps和CICD

文章目录 怎么理解DevOps?所需环境介绍创建devops java项目DockerFile文件Jenkinsfiledevops.yaml文件 搭建 DevOps 项目创建凭证创建devops项目创建流水线编写流线文件运行流线 为流水线设置电子邮箱服务器设置QQ邮箱 SMTP服务器配置jenkins邮箱服务器 使用Webhook…

【C语言数组传参】规则详解

目录 数组传参介绍 数组传参规则 数组传参的实参 特殊情况一:sizeof(数组名) 特殊情况二:&数组名 数组传参的形参 数组传参使用数组名作为形参接收 形参如果是⼀维数组 形参如果是⼆维数组 数组传参使用指针作为形参…

嵌入式实战(一)| GPIO实验 跑马灯效果实现 寄存器及其代码全解析

文章目录 1 GPIO编程用到的寄存器介绍1.1 PxSEL寄存器1.2 PxDIR寄存器1.3 PxINP寄存器 2 按键消抖2.1 软件消抖 3 经典任务代码解析 硬件图如下 实际上他们在端口命名的时候进行了分组 如上所示,P和点号之间的我认为他就是代表一个组,用某个寄存器控制&…

当hashCode相同时,equals是否也相同?

目录 hashCode方法 equals方法 String类的hashCode和equals 用String为例 当hashCode相同时 总结 在Java中,理解对象的这两个基本方法—hashCode和equals对于编码是至关重要的,尤其是在处理集合类如HashMap和HashSet时。然而,一个常见的…

CV必备的15个多尺度模型分享,涵盖特征融合、多尺度预测等4种网络结构

在卷积神经网络中,感受野的大小会影响到模型能够捕捉到的特征的尺度,从而影响模型的性能。因此我们在设计网络时,需要合理地控制感受野的大小。 那么问题来了:怎样才能合理控制? 到目前为止,已有很多学者…

Leetcode11-快乐数(202)

1、题目 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为: 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。 如果这个过程 结果为 1…

银行家算法c++

银行家算法 1. 银行家算法1.1 银行算法家的目的1.2 银行算法家的作用2. 设计原理2.1 银行家算法的数据结构2.2 银行家算法介绍2.3 安全性算法 3. 实验要求4. 银行家算法实例5. 完整代码和运行测试5.1 测试结果5.2 完整代码 1. 银行家算法 1.1 银行算法家的目的 银行家算法是避…

奇技淫巧:如何给项目中的RabbitMQ添加总开关

本文主要分享了如何给项目中的RabbitMQ添加总开关,通过简单配置开/关RabbitMQ。 一、需求背景 SpringBoot项目里使用了RabbitMQ,但某些场景下,不希望项目启动时自动检查RabbitMQ连接 例如: 在开发不需要RabbitMQ的功能过程中&…

python的课后练习总结4(for循环)

1,for循环 for 临时变量 in 序列: 重复执行的代码1 重复执行的代码2 ........... 遍历序列 字符串 我是中国人 列表 [‘星期一,星期二,星期三,星期四] 元组 (‘星期一,星期二,星期三,星期四) 一,break 终止循环 二,con…

【C初阶——指针2】鹏哥C语言系列文章,基本语法知识全面讲解——指针(2)

崩刃的剑,依旧致命,锈蚀的盾,屹立如初(王者荣耀李信) 本文由睡觉待开机原创,转载请注明出处。 本内容在csdn网站首发 欢迎各位点赞—评论—收藏 如果存在不足之处请评论留言,共同进步&#xff0…

能翻页的电子图册怎么做

​随着科技的进步,电子图册已经成为了越来越多企业宣传和展示产品的重要工具。相比于传统的纸质图册,电子图册具有更多的优点,如方便携带、易于分享、可交互性强等。那么,如何制作一款能翻页的电子图册呢? 一、确定主题…

INT201各种题型收集

汇总一下 FA 有穷自动机 - RL正则语言 DFA M (Q, Σ, δ, q, F) Q 是有限状态集合(Finite Set of States): 这表示自动机中存在一个有限数量的不同状态。每个状态代表了自动机在某个特定时刻的内部状态。这些状态可以用符号或名称表示。 …

基于多反应堆的高并发服务器【C/C++/Reactor】(中)Buffer的创建和销毁

TcpConnection:封装的就是建立连接之后得到的用于通信的文件描述符,然后基于这个文件描述符,在发送数据的时候,需要把数据先写入到一块内存里边,然后再把这块内存里边的数据发送给客户端,除了发送数据,剩下…

内存的基础知识-第四十天

目录 什么是内存?内存的作用 常用的数量单位 指令的工作原理 思考 三种装入方式 绝对装入 可重定位装入(静态重定位) 动态运行时装入(动态重定位) 写程序到程序运行 编译和链接 链接的三种方式 本节思维导…

代码随想录27期|Pthon|Day31|贪心算法|理论基础|455.分发饼干|376. 摆动序列|53. 最大子序和

理论基础 首先,贪心算法基本靠“做题感觉”,所以没有规范的总结和做题技巧,只能说见到过之后还能想起来。 一般情况可以看成是对于一个大的问题的子问题的局部最优的求解,然后可以推导出全局的最优。 这个过程没有证明&#xf…

数据库中的几种锁

数据库锁 1.数据库锁的种类 以 mysql innoDB 为例,数据库的锁有 排他锁,共享锁,意向锁,自增锁,间隙锁,锁的范围有包括,行锁,表锁 ,区间锁。 从应用研发的视角&#xff…

Gromacs WARNING问题

上述示例中,NA 是对系统净电荷进行中和的阳离子。请根据您的系统特性和仿真需求调整这些值。 总体而言,这个警告是为了提醒您关于电荷中性化的问题,确保您的模拟结果更加物理可信。 收敛性未达到预期精度: 警告指出,优…

普中STM32-PZ6806L开发板(HAL库函数实现-访问多个温度传感器DS18B20)

简介 我们知道多个DS18B20的DQ线是可以被挂在一起的, 也就是一根线上可以访问不同的DS18B20而不会造成数据错乱, 怎么做到的,其实数据手册都有说到, 就是靠64-bit ROM code 进行识别, 也可以理解成Serial Number进行识别, 因为主要差异还是在Serial Numb…

成为一名合格的软件测试工程师,得掌握什么技能?

在这个信息时代,软件行业的需求空前增长,而软件测试工程师作为软件开发过程中的重要角色,也越来越受企业的重视。那么,成为一名合格的软件测试工程师需要掌握什么技能呢?我结合多年的教学经验为大家总结出以下几点。 …