tcp vegas 为什么好
我吹捧 bbr 时曾论证过它在和 buffer 拧巴的时候表现如何优秀,但这一次说 vegas 时,我说的是从拥塞控制这个问题本身看来,vegas 为什么好,并且正确。
接着昨天 tcp vegas 鉴赏 继续扯。
假设一群共享带宽的流量中有流量退出或有新流量进入,剩余流如何感知到这事。loss-based 算法按照自己的步调填充 buffer 直到丢包,它们无法感知任何资源变化,而 bbr 则通过定期的 probe 来探测,但如果在 probe 之前有其它 bbr 流先行 probe,则后 probe 的流什么都拿不到。虽然它们都没有能力自动感知到资源变化,但它们无疑都希望自己能做到这一点。
本质上,大家都被灌输了 capacity-search 思想,想方设法要榨干最后 1k 的带宽,却往往适得其反,包括 bbr 在内的绝大多数算法引入越搞越复杂的 probe 机制,却没有收到应有的收益,而 vegas 采用松弛策略,反而自动做到了带宽利用率的最优化。
vegas 依靠 alpha < diff = (expected - actual) * basertt < beta 自动做到这一点。
如果有流量退出,所有流都会感知到 rtt 变小,actual 变大,diff 往左偏置,只要偏过左值 alpha,vegas 就会增加 cwnd 以适应这一变化。也就是说,流量退出腾出的 buffer 由大家公平瓜分了。
如果有流量进入,所有流都会感知到 rtt 变大,actual 变小,diff 往右偏置,只要偏过右值 beta,vegas 就会减少 cwnd 以适应这一变化,每条流都会腾出一些 inflight 分享给新进入的流。
vegas 是真正的拥塞控制。vegas 不做 capacity-search,我们看到,即使有流退出,也不会有单独的流抢走大多数带宽,因为 rtt 变化信号是大家同时可捕捉同时可反应的(相比之下,loss 信号则依赖比如说 red 丢谁没丢谁)。
再看 rtt 公平性。
diff = cwnd (1 - basertt / lastrtt) = cwnd (1 - basertt / (basertt + queuing_delay)) = cwnd (1 - 1 / (1 + queuing_delay / basertt)) ,设 basertt 是 y,cwnd 为 x,queuing_delay 为常数 q,diff = x(1 - 1 / (1 + q / y)) 要想把 diff 限制在相同的 alpha,beta 区间内,大家的 q 都是同一个,y 越大,x 越大,但带宽却一致,vegas 完美自适应 rtt。
不光如此,rtt 越小,带宽感知越灵敏,因为 rtt 越大,抖动代价越大,所谓尾大不掉,这不光影响自己,还影响其它流的公平性,因此 rtt 越大越趋向稳定。rtt 越大,获得的份额越小。其实 vegas 是按 bdp 分配带宽的,rtt 越大,buffer 占比越小,这是公平的根源。下面是简单的论证。
依旧设 basertt 是 y,cwnd 为 x,由于有流退出 q 由 2 减少到 1,diff 的 diff 为 q 变化前后两个 diff 相减,可表示为 z = -x / ((y + 2)(y + 1)),直观画图如下(就不求偏导了):

我们已经知道,y 越大,x 相对越大,如图所示(如果短肥管道,箭头贴着 x 轴,沿 y 轴存在 rtt 不公平,本文暂不谈),z 趋向于箭头指向的方向,在那里,平面非常平缓,这意味着,diff 受 basertt 影响非常小,对变化的感知力一致,进而能获得瓜分同样份额的 buffer,这就是公平的根源。
下面又是个有趣的重头戏。
vegas 对 loss 完全无感,因此它不得不修改 tcp 重传算法以适配它自己 “夹逼 diff 区间” 的算法。reno 早已深入人心,并且基于 loss-based reno 对拥塞控制做了标准化,有趣的是,包括 reno 在内的所有 loss-based cc 几乎都在使用 aimd 进行控制,而它们控制的并不是拥塞,vegas 专门控制拥塞的算法因为是后来的,反倒让人觉得奇怪。
vegas 不再使用 3 个dupack 触发重传,而采用了一种时间序方法,我这里截一个 vegas 原始论文 的图:

仔细看,这不就是 rack 嘛,关于 rack 可参考 rack 与 fack。rack 时间序最早正是来源于 vegas,它实际上在 rack 发布之前就早已被很多家公司运用。
时间序的一个重要作用就是解耦了重传和丢包检测。曾经重传依赖于某种丢包信号,比如 3 次 dupack 本身就算一种奇技淫巧,一旦等不到 3 次 dupack,这个机制就完全失效,其意义非常有限,但时间序重传不再依赖对端反馈,可源源不断提供可供传输的报文,剩下的交给拥塞控制。
有了时间序重传机制,就可以将丢包检测和重传分离,vegas 可完全不在乎 loss 而完全通过夹逼 diff 到 alpha,beta 区间完成拥塞控制,完全不再区分参与 diff 计算的是新数据还是重传数据,简洁而唯美。
linux tcp 内置了拥塞状态机,如今已经合入了 rack 作为除 dupack 之外的另一种触发重传的选择,并且已经支持 cong_control 回调完全接管整个拥塞控制而绕开拥塞状态机(比如 prr 会被绕开,因为如果不将 loss 做信号,也就没必要对 loss 反应那么大),我觉得可以实现一版完备的真 vegas 了,言外之意,此前的 vegas 是假的。
最后,vegas 改进了慢启动,不再盲目乘以 2,而是在慢启动期间加入了 diff 判断,从而择机退出慢启动 or 改变激进程度。
总之,从头看到尾,vegas 只有 diff 判断,任何时候(无论慢启动,重传等)只要算 diff 并和 alpha,beta 比较就行了,在这么简单的逻辑下,前面也简单论证过,vegas 的公平性和效率都非常好。
我曾经写过一个 cugas = cubic + vegas,但其实还不如将它变成 bbr 呢,如果世界上只有一种 vegas 就会非常稳定,因为天生公平的算法就不会引入很多公平性和效率之间的权衡问题,进而也不会引入号称能解决这些问题,结果只是新晋一员卷客,看看现在的拥塞控制领域那些不雅又奇怪的算法。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
tcp vegas 为什么好
我吹捧 bbr 时曾论证过它在和 buffer 拧巴的时候表现如何优秀,但这一次说 vegas 时,我说的是从拥塞控制这个问题本身看来,vegas 为什么好,并且正确。 接着昨天 tcp vegas 鉴赏 继续扯。 假设一群共享带宽的流量中有流量退出或有…...
【设计模式】命令模式
其他系列文章导航 Java基础合集数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 文章目录 其他系列文章导航 文章目录 前言 一、什么是命令模式? 二、命令模式的优点和应用场景 三、命令模式的要素和实现 3.1 命令 3.2 具体命令 3.3 接受者 …...
Unity头发飘动效果
Unity头发飘动 介绍动作做头发飘动头发骨骼绑定模拟物理组件 UnityChan插件下载UnityChan具体用法确定人物是否绑定好骨骼节点(要做的部位比如头发等)给人物添加SpringManager骨骼管理器给骨骼节点添加SpringBone这里给每个头发骨骼都添加上SpringBone。…...
【MIKE】MIKE河网编辑器操作说明
目录 MIKE河网编辑器说明河网定义河网编辑工具栏河网文件(.nwk11)输入步骤1. 从传统的地图引入底图1.1 底图准备1.2 引入河网底图1.3 输入各河段信息2. 从ARCView .shp文件引入底图MIKE河网编辑器说明 河网编辑器主要功能有两个: ①河网的编辑和参数输人,包括数字化河网及…...
RIPV1配置实验
查看路由器路由表: 删除手工配置的静态路由项: Route1->Config->static Remove删除路由项 删除Route3的路由项,方法同上删除Route2的路由项,方法同上 完成路由器RIP配置: Route1->Config->RIP->Ne…...
快速实现农业机械设备远程监控
农业机械设备远程监控解决方案 一、项目背景 近年来,农业生产事故时有发生,农业安全问题已经成为农业生产中的关键问题,农业监控系统在农业安全生产中发挥着重要作用。农业机械设备以计划维修或定期保养为主,在日常应用的过程中因…...
解决用Fiddler抓包,网页显示你的连接不是专用/私密连接
关键:重置fiddler的证书 在Fiddler重置证书 1、Actions --> Reset All Certificates --> 弹窗一路yes 2、关掉Fiddler,重新打开 3、手机删掉证书,重新下载安装。 (如果还不行,重新试一遍,先把浏览器…...
单片机原理及应用:流水灯的点亮
流水灯是一种简单的单片机控制电路,由许多LED组成,电路工作时LED会按顺序点亮,类似于流水的效果。 下面是运行在keil上的代码,分别使用了数组,移位符和库函数来表示。 //数组法 #include <reg52.h> //头文…...
蓝桥杯宝藏排序算法(冒泡、选择、插入)
冒泡排序: def bubble_sort(li): # 函数方式for i in range(len(li)-1):exchangeFalsefor j in range(len(li)-i-1):if li[j]>li[j1]:li[j],li[j1]li[j1],li[j]exchangeTrueif not exchange:return 选择排序: 从左往右找到最小的元素,放在起始位置…...
使用@jiaminghi/data-view实现一个数据大屏
<template><div class"content bg"><!-- 全局容器 --><!-- <dv-full-screen-container> --><!-- 第二行 --><div class"module-box" style"align-items: start; margin-top: 10px"><!-- 左 -->…...
神经网络:池化层知识点
1.CNN中池化的作用 池化层的作用是对感受野内的特征进行选择,提取区域内最具代表性的特征,能够有效地减少输出特征数量,进而减少模型参数量。按操作类型通常分为最大池化(Max Pooling)、平均池化(Average Pooling)和求和池化(Sum Pooling)&a…...
微服务常见的配置中心简介
微服务架构中,常见的配置中心包括以下几种: Spring Cloud Config: Spring Cloud Config是官方推荐的配置中心解决方案,它支持将配置文件存储在Git、SVN等版本控制系统中。通过提供RESTful API,各个微服务可以远程获取和…...
银河麒麟v10 rpm安装包 安装mysql 8.35
银河麒麟v10 rpm安装包 安装mysql 8.35 1、卸载mariadb2、下载Mysql安装包3、安装Mysql 8.353.1、安装Mysql 8.353.3、安装后配置 1、卸载mariadb 由于银河麒麟v10系统默认安装了mariadb 会与Mysql相冲突,因此首先需要卸载系统自带的mariadb 查看系统上默认安装的M…...
一篇文章带你搞定CTFMice基本操作
CTF比赛是在最短时间内拿到最多的flag,mice必须要有人做,或者一支战队必须留出一块时间专门写一些mice,web,pwn最后的一两道基本都会有难度,这时候就看mice的解题速度了! 说实话,这是很大一块&…...
Spring security之授权
前言 本篇为大家带来Spring security的授权,首先要理解一些概念,有关于:权限、角色、安全上下文、访问控制表达式、方法级安全性、访问决策管理器 一.授权的基本介绍 Spring Security 中的授权分为两种类型: 基于角色的授权&…...
模式识别与机器学习(十一):Bagging
1.原理 Bagging [Breiman, 1996a] 是井行式集成学习方法最著名的代表.从名字即可看出,它直接基于自助采样法(bootstrap sampling)。给定包含m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得…...
数据压缩(哈夫曼编码)
【问题描述】在数据压缩问题中,需要将数据文件转换成由二进制字符0、1组成的二进制串,称之为编码,已知待压缩的数据中包含若干字母(A-Z),为获得更好的空间效率,请设计有效的用于数据压缩的二进制…...
移动安全APP--Frida+模拟器,模拟器+burp联动
最近测APP被通报了,问题点测得比较深,涉及到frida和burp抓包,一般在公司可能会有网络的限制,手机没办法抓包,我就直接在模拟器上试了,就在这记录一下安装过程。 目录 一、Frida安装 二、burp与逍遥模拟器…...
MATLAB遗传算法工具箱的三种使用方法
MATLAB中有三种调用遗传算法的方式: 一、遗传算法的开源文件 下载“gatbx”压缩包文件,解压后,里面有多个.m文件,可以看到这些文件的编辑日期都是1998年,很古老了。 这些文件包含了遗传算法的基础操作,包含…...
复习linux——时间同步服务
加密和安全当前都离不开时间的同步,否则各种网络服务可能不能正常运行 时间错误可能导致证书应用出错 时间同步服务 多主机协作工作时,各个主机的时间同步很重要,时间不一致会造成很多重要应用故障,利用NTP协议使网络中的各个计算机时间达到…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
在四层代理中还原真实客户端ngx_stream_realip_module
一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
【从零学习JVM|第三篇】类的生命周期(高频面试题)
前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 …...
