从 TCP Reno 经 BIC 到 CUBIC
重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章,感觉还是啰嗦了,今日重新一气呵成这个话题。
reno 线性逼近管道容量 Wmax,相当于一次查询(capacity-seeking),但长肥管道从 0.5*Wmax 到 Wmax 的线性遍历太慢,期间一旦遭遇丢包,则前功尽弃。
以下的两条 rtt 相差 5 倍的流在同等丢包率下的带宽和 inflt 发展图:

对已排序序列的查询,二分法是普适方法,首选用二分法替换,查询管道容量 Wmax 的速度快得不是一点半点,这就是 bic:
w n = w n − 1 + W m a x − w n − 1 2 w_n=w_{n-1}+\dfrac{W_{max}-w_{n-1}}{2} wn=wn−1+2Wmax−wn−1
代码很简单:
B, I = 4, 1 # B 理论值取 2,但不够平滑
for n in range(1, len(times)):...if wx[n-1] < wmax_x and wmax_x - wx[n-1] > I:wx[n] = wx[n-1] + (wmax_x - wx[n-1])/Belif wx[n-1] > wmax_x:wx[n] = wx[n-1] + (wx[n-1] - wmax_x)/Belse:wx[n] = wx[n-1] + I..
bic 的 cwnd 曲线形状如下:

加入下列 red 模拟:
for n in range(1, len(times)):...if wx[n] + wy[n] > 1.5*C*R:if random.random() < 0.3:wmax_x = wx[n]wx[n] = (1 - beta)*wx[n]if random.random() < 0.3:wmax_y = wy[n]wy[n] = (1 - beta)*wy[n]if wx[n] + wy[n] > 2*C*R:if random.random() < 0.5:wmax_x = wx[n]wx[n] = (1 - beta)*wx[n]if random.random() < 0.5:wmax_y = wy[n]wy[n] = (1 - beta)*wy[n]while wx[n] + wy[n] > 4*C*R:wmax_x = wx[n]wx[n] = (1 - beta)*wx[n]wmax_y = wy[n]wy[n] = (1 - beta)*wy[n]
双流共存效果如下(忽略 z):

它极大解决了 reno 长流打开 cwnd 慢的问题,文初相同的环境,用 y-bic 和 x-reno 重跑结果如下(忽略 z):

但由于 bic 步进完全由 ack-selfclock 驱动,同为 bic 的不同流,对较大 rtt 不友好,用以下代码包裹 x 和 y 两条流,给出一个 4 倍的 rtt 关系:
for n in range(1, len(times)):if n % 5:# 流 x 的计算if n % 20:# 流 y 的计算
模拟如下(忽略 z):

于是抽离 rtt,就是 cubic,cubic 用一条式子里与 rtt 无关的 3 次曲线拟合 bic 折线:
w ( t ) = C ⋅ ( t − ( 1 − β ) ⋅ W m a x C 3 ) 3 + W m a x w(t)=C\cdot(t-\sqrt[3]{\dfrac{(1-\beta)\cdot W_{max}}{C}})^3+W_{max} w(t)=C⋅(t−3C(1−β)⋅Wmax)3+Wmax
公式看起来很复杂,实际就是个数学处理技巧:
- 目标:拟合 bic 折线,平滑为曲线;
- 候选项:有 2 阶拐点的奇数次曲线,简单选 3 次;
- 用 bic 的 Wmax 坐标算 3 次曲线系数。
cubic 长下面的样子:

cubic 只与绝对时间有关,不管 rtt 如何,只要 ack 虽迟但到,公平性就毫无问题。重跑 bic 的例子:
for n in range(1, len(times)):...if n % 5 == 0:wx[n] = wmax_x + G*(n - n_x - K_x)**3else:wx[n] = wx[n-1]if n % 10 == 0:wy[n] = wmax_y + G*(n - n_y - K_y)**3else:wy[n] = wy[n-1]...beta = 0.3if wx[n] + wy[n] > 1.5*C*R:if random.random() < 0.3:n_x = nwmax_x = wx[n]tmp = wmax_x*(1 - beta)/GK_x = math.pow(tmp, 1/3)wx[n] = (1 - beta)*wx[n]if random.random() < 0.3:n_y = nwmax_y = wy[n]tmp = wmax_y*(1 - beta)/GK_y = math.pow(tmp, 1/3)wy[n] = (1 - beta)*wy[n]if wx[n] + wy[n] > 2*C*R:if random.random() < 0.5:...
同样 4 倍 rtt 的关系,如下:

长肥管道同样比 reno 效率高:

然而在短瘦管道却不如 reno,理由很简单,cubic 曲线形状唯一由参数 C 确定,短瘦管道中 cubic 曲线片段更加矮胖,不如长肥管道中瘦高,以至于它矮胖到斜率还没有 reno 大:

实际的结果如下:

换句话说,cubic 在短瘦管道对 bic 折线拟合得不好,于是引入 tcp_friendliness,即在短瘦管道中至少保持与 reno 相图的性能,处理方式很简单:
for n in range(1, len(times)):...if n % 1 == 0:wx[n] = wmax_x + G*(n - n_x - K_x)**3tmp = wx[n-1] + Iif tmp > wx[n]:wx[n] = tmpelse:wx[n] = wx[n-1]if n % 1 == 0:wy[n] = wy[n-1] + Ielse:wy[n] = wy[n-1]
效果如下:

差不多就这些东西。至少经理还有皮鞋。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
从 TCP Reno 经 BIC 到 CUBIC
重读 TCP拥塞控制算法-从BIC到CUBIC 以及 cubic 的 tcp friendliness 与拐点控制 这两篇文章,感觉还是啰嗦了,今日重新一气呵成这个话题。 reno 线性逼近管道容量 Wmax,相当于一次查询(capacity-seeking),但长肥管道从 0.5*Wmax …...
工厂模式与建造者模式的区别
在软件设计中,工厂模式和建造者模式是两种常见的设计模式,它们都是用于创建对象,但是各自有不同的应用场景和目的。本文将通过餐馆点餐的例子,深入探讨这两种模式的区别。 工厂模式 工厂模式的核心思想是通过一个抽象工厂类来创…...
电脑usb接口封禁如何实现?5种禁用USB接口的方法分享!(第一种你GET了吗?)
“防患于未然,安全始于细节。”在信息技术飞速发展的今天,企业的信息安全问题日益凸显。 USB接口作为数据传输的重要通道,在带来便利的同时,也成为了数据泄露和安全风险的高发地。 因此,对电脑USB接口进行封闭管理&a…...
有效的括号
有效的括号 思路:我们先创建一个栈,让左括号入栈,与右括号判断 Stack stacknew Stack<>(); 将字符串中的符号转化为字符 char ch s.charAt(i); 完整代码如下: class Solution {public boolean isValid(String s) {if (s …...
Vue3.0面试题汇总
Composition API 可以说是Vue3的最大特点,那么为什么要推出Composition Api,解决了什么问题? 通常使用Vue2开发的项目,普遍会存在以下问题: 代码的可读性随着组件变大而变差每一种代码复用的方式,都存在缺…...
TCP编程:从入门到实践
目录 一、引言 二、TCP协议原理 1.面向连接 2.可靠传输 三、TCP编程实践 1.TCP服务器 2.TCP客户端 四、总结 本文将带你了解TCP编程的基本原理,并通过实战案例,教你如何在网络编程中运用TCP协议。掌握TCP编程,为构建稳定、高效的网络通信…...
Python NumPy 数据分析:处理复杂数据的高效方法
Python NumPy 数据分析:处理复杂数据的高效方法 文章目录 Python NumPy 数据分析:处理复杂数据的高效方法一 数据来源二 获取指定日期数据三 获取指定行列数据四 求和计算五 比例计算六 平均值和标准差七 完整代码示例八 源码地址 本文详细介绍了如何使用…...
【Preference Learning】Reasoning with Language Model is Planning with World Model
arxiv: https://arxiv.org/abs/2305.14992 问题背景:当前LLM推理受到几个关键因素的限制: (1)LLM缺乏世界模型(一种人类就有的对环境的心理表征,可以模拟行动以及活动对外部世界状态的影响)去…...
OJ在线评测系统 后端基础部分开发 完善CRUD相关接口
完善相关接口 判斷编程语言是否合法 先从用户的请求拿到Language package com.dduo.dduoj.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dduo.dduoj…...
计算机网络--TCP、UDP抓包分析实验
计算机网络实验 目录 实验目的 实验环境 实验原理 1、UDP协议 2、TCP协议 实验具体步骤 实验目的 1、掌握使用wireshark工具对UDP协议进行抓包分析的方法,掌握UDP协议的报文格式,掌握UDP协议校验和的计算方法,理解UDP协议的优缺点&am…...
FreeRTOS的中断管理
前言 FreeRTOS的任务有优先级,MCU的硬件中断有中断优先级,这是两个不同的概念,FreeRTOS的任务管理要用到硬件中断,使用FreeRTOS时候也可以使用硬件中断,但是硬件中断ISR的设计要注意一些设计原则,在本节中我…...
JS加密=JS混淆?(JS加密、JS混淆,是一回事吗?)
JS加密、JS混淆,是一回事吗? 是的!在国内,JS加密,其实就是指JS混淆。 1、当人们提起JS加密时,通常是指对JS代码进行混淆加密处理,而不是指JS加密算法(如xor加密算法、md5加密算法、…...
hive-拉链表
目录 拉链表概述缓慢变化维拉链表定义 拉链表的实现常规拉链表历史数据每日新增数据历史数据与新增数据的合并 分区拉链表 拉链表概述 缓慢变化维 通常我们用一张维度表来维护维度信息,比如用户手机号码信息。然而随着时间的变化,某些用户信息会发生改…...
高并发内存池(六):补充内容
目录 有关大于256KB内存的申请和释放处理方法 处理大于256KB的内存申请 补充内容1 补充内容2 补充内容3 处理大于256KB的内存释放 新增内容1 新增内容2 测试函数 使用定长内存池替代new 释放对象时不传对象大小 补充内容1 补充内容2 补充内容3 补充内容4 测试…...
高性能存储 SIG 月度动态:优化 fuse 提升 AI 存储接入能力,erofs 工具发布新版本
本次月报综合了 SIG 在 7、8 两个月的工作进展,包含多项新特性、优化、Bugfix 等。 SIG 整体进展 fuse 支持 failover,并优化 background 读写公平性,提升 AI 存储接入场景的能力。 erofs page cache 共享特性已发到上游社区,re…...
2024 年最新 Protobuf 结构化数据序列化和反序列化详细教程
Protobuf 序列化概述 Protobuf(Protocol Buffers)是由Google开发的一种语言中立、平台中立、可扩展的序列化结构数据的方法。它用于在不同系统之间高效地交换数据。Protobuf使用定义文件(.proto)来描述数据结构,并通过…...
【小程序】微信小程序课程 -4 项目实战
目录 1、 效果图 2、创建项目 2.1 创建小程序端 2.1.1 先创建纯净项目 2.1.2 删除components 2.1.4 删除app.json红色部分 2.1.5 删除index.json红色部分 2.1.6 删除index.wxss全部内容 2.1.7 删除index.wxml全部内容 2.1.8 app.json创建4个页面 2.1.9 app.json添加…...
【期刊】论文索引库-SCI\SSCI\IE\南大核心\北大核心\CSCD等
外文期刊检索 SCI SCI即《科学引文索引》(Science Citation Index),是由美国科学信息研究所(Institute for Scientific Information)创建于1961年,收录文献的作者、题目、源期刊、摘要、关键词,不仅可以从文献引证的角度评估文章的学术价值,还可以迅速方便地组建研究课…...
开源链动 2+1 模式 S2B2C 商城小程序:社交电商团队为王的新引擎
摘要:本文深入探讨在社交电商领域中,团队的重要性以及如何借助开源链动 21 模式 S2B2C 商城小程序,打造具有强大竞争力的团队,实现个人价值与影响力的放大,创造被动收入,迈向财富自由之路,同时为…...
使用Fiddler Classic抓包工具批量下载音频资料
1. 通过F12开发者工具,下载音频文件 浏览器打开音频列表->F12快捷键->网络->媒体,播放一个音频文件,右边媒体下生成一个音频文件,右击“在新标签页中打开”,可以下载这个音频文件。 2.通过Fiddler Classic抓…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
【Java学习笔记】BigInteger 和 BigDecimal 类
BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点:传参类型必须是类对象 一、BigInteger 1. 作用:适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
