从 Reno TCP 到 Scalable TCP,HighSpeed TCP
前文 Scalable TCP 如何优化长肥管道 介绍了 Scalable TCP,但联系另一个类似的算法 HighSpeed TCP(简称 HSTCP),就会看到一个类似从 Reno TCP 经 BIC 到 CUBIC 的路线,但采用了不同的策略。
Reno TCP 经 BIC 到 CUBIC 路线的核心在于 “在长肥管道中快速逼近管道容量”,采用二分法或三次曲线除了属于不同实现方式,二者也有承接。
而从 Reno TCP 分化而来的 Scalable TCP,HSTCP 这条路线的核心在于 “在长肥管道容忍更高的丢包率”,前文已经说过 Scalable TCP,本文简述 HSTCP,来自 Sally Floyd,参见 HighSpeed TCP (HSTCP)。
我在 2021 年已经写过一篇关于 HSTCP 的详细推导 漫谈 HSTCP,本文为其缩略版,侧重核心的推导。
常规 Reno TCP 的问题在于对大容量管道没有扩展性,一方面 cwnd 打开速度太慢,另一方面对丢包容忍度太低,二者相互加深纠缠:在高速网络缓慢的 cwnd 打开过程中,只要遭遇丢包,窗口就会减半,而这个过程越久,丢包概率就越大。这个丢包容忍度甚至已经低于世界上最好的介质误码率。
该问题产生的根源在于,设计单纯的端到端拥塞控制算法时只考虑了拥塞丢包(buffer 溢出)的因素,并未考虑底层介质误码造成的随机丢包。这个因素一直影响着几乎所有拥塞控制算法的设计,直到今日。
HSTCP 对 Reno TCP 的优化全在 response curve 上进行。首先给出标准 Reno 的 response function:
W = a ⋅ ( 2 − b ) 2 b ⋅ p W=\sqrt{\dfrac{a\cdot(2-b)}{2b\cdot p}} W=2b⋅pa⋅(2−b)【这个式子我就不推导了,详见之前的文章】
将 a = 1,b = 0.5 带入,得到现行 Reno TCP 的 response function:
W = 1.22 ⋅ 1 p W=1.22\cdot\sqrt{\dfrac{1}{p}} W=1.22⋅p1
双对数坐标系里绘图:
如红色标注所示,支撑 100 的 cwnd 就需要 10^{-4} 丢包率,可见条件之苛刻。需要让这条线陡峭起来。
不能指望调整 a,b 达到目标,因为 p 的指数不变,线条只能平行移动,而不能改变斜率。前文所述 Scalable TCP 采用改变 per-ack 行为,将与 RTT 相关的 “Per-RTT- Additive Increase” 变换为 RTT 无关的 “Per-ACK- Additive Increase”,做到了 “使斜率变为 -1,直线变陡”,得到了新的 response function:
W = a b ⋅ p W=\dfrac{a}{b\cdot p } W=b⋅pa
HSTCP 则采用了另一种方法,直接从 response curve 上入手,求直线方程:
很容易求出直线的斜率,即 response function 中 p 的指数:
S = ln w 1 − ln w 0 ln p 1 − ln p 0 S=\dfrac{\ln w_1-\ln w_0}{\ln p_1 -\ln p_0} S=lnp1−lnp0lnw1−lnw0
按照 paper 建议将 p0(0.0015, 31) 和 p1(10^{-7}, 83000) 代入,可求得 S = -0.82,再代入一点坐标,得 HSTCP 的 response function:
W = 0.15 p 0.82 W=\dfrac{0.15}{p^{0.82}} W=p0.820.15
这就是 HSTCP 算法完整描述。但考虑到实际部署实施,还要考虑如何实现算法。
本质上,HSTCP 仍然是一个 AIMD 算法,但显然无法套入 W = a ⋅ ( 2 − b ) 2 b ⋅ p W=\sqrt{\dfrac{a\cdot(2-b)}{2b\cdot p}} W=2b⋅pa⋅(2−b)公式去求 a,b,同时也不能像 Scalable TCP 那样改变 ACK 时钟处理的行为,否则那就是 Scalable TCP 了。HSTCP 的路子是分段拟合不同 a,b 的 response curve: W = a ⋅ ( 2 − b ) 2 b ⋅ p W=\sqrt{\dfrac{a\cdot(2-b)}{2b\cdot p}} W=2b⋅pa⋅(2−b),具体来讲看下图:
注意与标准 Reno TCP 的 response curve 黄色线平行的不同 a,b 参数线,图例上都有,它们与 HSTCP 的 response curve 蓝色粗线均有交点,选择几个典型的 a,b 参数,获得各交点的 w 坐标,以这些坐标为界,当 cwnd 达到某个 w 界标后,采用该界标的 a,b 参数直到 cwnd 到达下一个界标 w。
可从 RFC3649 了解整个待定系数的过程:
Linux kernel 的 HSTCP 实现 中有一张大表,数据均来自该 RFC 建议。
来,看一个不同网络容量下 HSTCP 锯齿的观感:
看,是不是管道容量越大,锯齿越细,这就是 “可扩展性”!
最后,我们发现 HSTCP 与 Scalable TCP 很像,均做到了 “在大容量网络对 p 的容忍”,即让 response curve 更陡峭,为了做出比较,我将 Scalable TCP 的 curve 也一并画入:
可见 HSTCP 与 Scalable TCP 何其相似,和 Scalable TCP 固定 AIMD 步频不同,HSTCP 也具有 “可扩展性”,但它体现在 “当前探测的管道容量越大,Additive Increase 就越快,Multiplicative Decrease 比例就越低”,容量越大,就要 capacity-seeking 追得越快,而出现拥塞后的 robustness 容忍度也越大,相对也就不需要过激 md。
这就是 Scalable TCP,HSTCP 的路线,与 BIC,CUBIC 不同,但相似,它们旨在解决类似的问题,提供了不同的方案和迭代路线,《TCP/IP 详解》中提到的 “长肥管道” 问题在不断求解的过程中被解决,但总留下一些尾巴供给下一个挑战者。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:

从 Reno TCP 到 Scalable TCP,HighSpeed TCP
前文 Scalable TCP 如何优化长肥管道 介绍了 Scalable TCP,但联系另一个类似的算法 HighSpeed TCP(简称 HSTCP),就会看到一个类似从 Reno TCP 经 BIC 到 CUBIC 的路线,但采用了不同的策略。 Reno TCP 经 BIC 到 CUBIC 路线的核心在于 “在长…...

使用Java调用OpenAI API并解析响应:详细教程
使用Java调用OpenAI API并解析响应:详细教程 在现代应用程序中,API调用是一个非常常见的任务。本文将通过一个完整的示例,讲解如何使用Java调用OpenAI的ChatGPT API,并通过ObjectMapper处理JSON响应。本文的示例不仅适用于OpenAI…...

深入学习并发编程中的 synchronized
文章目录 并发编程中的三个问题可见性原子性有序性 了解Java内存模型JMMsynchronized 保证三大特性synchronized 保证原子性synchronized 保证可见性synchronized 保证有序性 synchronized 的特性可重入特性不可中断特性 通过反汇编学习synchronized原理当修饰代码块时当修饰方…...
AMD R9-9950X相比较I9-14900K有哪些提升
AMD R9-9950X相比较I9-14900K有哪些提升?在处理器领域,AMD与英特尔的竞争从未停歇,每一次新品发布都引发业界的高度关注。近日,AMD推出了其新一代桌面级旗舰处理器——Ryzen 9 9950X(简称R9-9950X)…...

计算机毕业设计 基于Python的个性化旅游线路推荐系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
总结:Flink之DataStream各API介绍
一、介绍 本文主要是详细介绍 DataStream<T> 类中的各个方法,并给出它们的使用场景。 二、基本方法 getId(): 作用:返回转换操作的唯一标识符。场景:当需要调试或日志记录时,有时候需要知道操作的 ID。getParallelism(): 作用:获取流的并行度。场景:在优化作业时…...
设计一个日志管理系统,支持多级别日志记录
设计一个日志管理系统,支持多级别日志记录 作为一名Python程序软件专家,我经常被问到关于日志管理系统的设计和实现。今天,我将分享一篇关于设计一个日志管理系统,支持多级别日志记录的博文,希望能够帮助大家更好地理解和使用Python语言。 日志管理系统的需求 在软件开…...

Javascript动态规划算法
JavaScript中的动态规划(Dynamic Programming,简称DP)是一种通过把原问题分解为相对简单的子问题的方式来求解复杂问题的方法。它主要致力于将“合适”的问题拆分成更小的子目标,并通过建立状态转移方程、缓存并复用以往结果以及按…...
Java 循环里怎么删除元素才安全
首先 在 Java 中,当你在循环中遍历集合时,直接删除元素可能会引发 ConcurrentModificationException。为了安全地删除元素,推荐使用 Iterator 来进行删除操作。 以下是使用 Iterator 删除元素的常见模式: import java.util.Arr…...
LabVIEW晶体振荡器自动化测试系统
基于LabVIEW平台的晶体振荡器自动化测试系统解决了传统手工测试晶体振荡器繁琐且易出错的问题。该系统通过高度自动化的测试流程,提高了测试效率和精度,实现了数据的自动采集与处理,适用于电子、通信等领域的晶振测试需求。 项目背景与意义 …...

3.6.xx版本SpringBoot创建基于Swagger接口文档
介绍 基于Swagger构建的JavaAPI文档工具,实现后端功能的测试,并撰写API接口文档。 方法 pom.xml中引入依赖,要注意的是,本依赖使用的SpringBoot版本为3.6.xx <!--Knife4j--><dependency><groupId>com.github.xiaoymin<…...
Oracle 12201非PDBS模式单机部署(静默安装)
一、创建Oracle数据库的用户 groupadd oinstall groupadd dba groupadd asmadmin groupadd asmdba useradd -g oinstall -G dba,asmdba oracle -d /home/oracle passwd oracle二、配置Linux 服务器参数 cat /home/oracle/.bash_profile export ORACLE_HOSTNAMEH_orcle01 expo…...
Python 源码编译安装详解:跨平台指南及完整步骤解析
Python 源码编译安装详解:跨平台指南及完整步骤解析 文章目录 Python 源码编译安装详解:跨平台指南及完整步骤解析一 准备工作1)Ubuntu/Debian2)CentOS/RHEL3)macOS 二 下载 Python 源码三 编译与安装1)解压…...

MQTT vs HTTP:谁更适合物联网?
前言 随着物联网(IoT)技术的飞速发展中,其应用规模和使用场景正在持续扩大,但它关键的流程仍然是围绕数据传输来进行的,因此设备通信协议选择至关重要。 作为两种主要的通信协议,MQTT 协议和 HTTP 协议各…...

小北的技术博客:探索华为昇腾CANN训练营与AI技术创新——Ascend C算子开发能力认证考试(初级)
前言 哈喽哈喽友友们,这里是zyll~(小北)智慧龙阁的创始人及核心技术开发者。在技术的广阔天地里,我专注于大数据与全栈开发,并致力于成为这一领域的新锐力量。通过智慧龙阁这个平台,我期望能与大家分享我的技术心得,共同探索技术的无限可能。 Ascend C编程:小北的技术…...

鸿蒙next开发者第一课02.DevEcoStudio的使用-习题
【习题】DevEco Studio的使用 通过/及格分80/ 满分100 判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发,均可使用预览器进行预览。F 正确(True)错误(False) 预览器不能进行传感器等特殊功能的开发,需要使用真机开发 2. module.json5文件中的…...

【vue】监听table水平滚动条切换tab后还原位置
有个需求就是切换tab后,原先的table水平滚动条要还原位置(如下图),先说下思路,大致就是 切出页面时 把滚动距离保存到Storage 中,切回来时在恢复 直接上代码 首先table ref指定一下ref"jtable" …...
C#使用PdfSharp生成PDF文件实例详解
许多项目开发中需要生成PDF, 常规办法使用官方提供的Microsoft.Office.Interop.Worddll插件,但是这种方法需要完全安装OFFICE,另外版本不一致还会出现很多错误。一般不推荐使用。 下面介绍几种巧妙的用法,定能事半功倍。 本文使用PDFsharp完成功能。 PDFsharp一款开源的…...

【软件系统架构设计师-案例-1】架构风格
1. 请用200字以内说明系统可靠性的定义及包含的4个子特性,并简要指出提高系统可靠性一般采用哪些技术? (1)可靠性定义:系统在规定的时间或环境条件下,完成规定功能的能力,就是系统无故障运行的…...

神经网络整体架构
文章目录 1.输入层Input2.卷积层Conv3.激活函数层(一)Sigmoid 函数(二)Tanh 函数(三)修正线性单元ReLU(四)Leaky ReLU函数(带泄露的Relu)(五)参数化ReLU 4.池化层POOL5.全连接层FC6.输出层Output 用全连接神经网络处理大尺寸图像具有三个明显的缺点: ①将图像展开为…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
【AI学习】三、AI算法中的向量
在人工智能(AI)算法中,向量(Vector)是一种将现实世界中的数据(如图像、文本、音频等)转化为计算机可处理的数值型特征表示的工具。它是连接人类认知(如语义、视觉特征)与…...

Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...