从 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抓…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
Java如何权衡是使用无序的数组还是有序的数组
在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
