TCP 拥塞状态机演进

news2024/11/17 0:00:13

下面是 TCP 拥塞状态机:
在这里插入图片描述

但它只是冰山一角,这只是 loss-based 状态机,实现一个完全的 delay-based cc 就对不上这个状态机。

该状态机来自 RFC5681,源自 RFC2581,RFC2001,大概在 1990 年代,loss-based 就是范雅各布森(Van Jacobson) 1988 年拥塞控制版本的直接描述。

Linux kernel TCP 在独立的拥塞控制模块之上内置上述状态机,这意味着 Linux kernel TCP vegas 等 delay-based cc 并不完备,依然无条件以 reno 方式响应丢包。

幸运的是,BBR 后 Linux TCP cc 框架导出了 cong_control 回调足以绕开该 loss-based 拥塞状态机,实现 cong_control 回调重写 vegas 即可实现完整的 delay-based cc。

重传和 loss 紧密关联,绕开该拥塞状态机是解除重传和 cc 之间的耦合的关键。随着 TCP 拥塞控制的演化迭代,无论标准上还是在实现上,解耦重传和 cc 的过程一直在进行。

简单描述这过程。

如拥塞状态机所示重传和 cc 之间的胶合主要在于传输状态如何影响 cwnd,背后是不同兑换比的数据包守恒:

  • 兑换比大于 1:Open 状态(如拥塞避免的 additive increase,BBR probe)
  • 兑换比等于 1:收到几个 (S)ACK 发出几个 Data,如 BBR 丢包状态
  • 兑换比小于 1:Recovery 状态(如快速重传的 PRR multiplicative decrease)

理论上,cc 只管 when & how much,重传只管 what,二者无关联,但内置拥塞状态机实现让二者不得不胶合。

一旦检测到丢包,拥塞状态机转换,cwnd 变小,即使确认非拥塞丢包,依然要忍受小 cwnd,更严重的是,一旦 cwnd 变小,rate-based cc 几乎无法运行,因为没有足够 data 支撑 delivery rate 测量。

由于 loss-based 拥塞状态机的假设是拥塞引发丢包,在 Recovery 状态无条件谨慎,导致丢包重传状态更容易跌入兜底 Loss 状态。

为避免过多跌入 Loss 状态,TCP 标准沿以下路径迭代:

  • reno:一次多个丢包很容易导致 ACK 时钟丢失,跌入 Loss。
  • SACK:解决丢包检测问题,可重传多个包,但小于 reordering 个 SACK 不会触发重传,且每个 Lost 包只能重传一次,不然还会跌入 Loss。
  • FACK:不再依赖 reordering 个 SACK,取 seq 序,但在 Recovery 依然只有一次重传机会。
  • RACK:不再取 seq 序,改取时间序,可为每个报文登记 xmit time,在 Recovery 重传次数不再受限。
  • Next?我觉得 RACK 可以覆盖 Loss 了,TCP 甚至不再需要为 timeout 保留单独的 Loss 状态。

在实现上,TCP 也逐步迭代,导出 cong_control 回调解放了 cc,可在 Recovery 状态自行管理 cwnd。

TCP 标准不断为 Recovery 状态准备更多可供发送的数据,TCP 实现也逐步摆脱 loss-based 假设。如果看 Linux kernel TCP 的实现,6.1 的 TCP 实现比 3.10 更简单,印证如上所述。与此前的 TCP 相比,更新的实现:

  • scoreboard 管理更简单,废除 forward-retrans。
  • seq reordering 被 RACK 废除,内置于时间序。

是不是精简了很多。

总体来讲,“为 Recovery 状态准备更多可供发送的数据” 这件事除了标准演进之外,各种增补优化也一直在努力,如典型的 early retrans 为 thin stream 放宽了 fast retransmit 触发条件,而 tail loss probe(TLP) 则在尾部增加触发 fast retransmit 的弹药(这会儿没新数据可供传输,片刻后就有了呢,尽量用新数据触发 SACK 信息的带回)。

漫长的一周终于结束,聊一下 RFC5681 TCP 拥塞状态机的演进。

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

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

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

相关文章

10分钟内创意爆发,这些头脑风暴技巧让你IDEA满满

当初道叔刚入广告行业,与同事经历了一次困扰的头脑风暴,老板让他们想出一个大集团公司年会的主题口号。我们7-8个团队成员耗费了一个下午的时间,提出了几十个提议,但最终硬是没有一个能满足需求。许多人可能也有过道叔这样的经历。…

Js保留树型数据指定层级

自定义一个树型的数据 const tree [{value: 1, label: "1",children: [{value: 11, label: "1-1",children: [{value: 111, label: "1-1-1"}]}]}, {value: 2, label: "2"}]保留指定层级的方法 function keepNodesAtLevel(data, level…

vue源码阅读之Watcher类

我们上次分析vue源码讲的是收集依赖,数据变化之后我们把依赖收集到dep类中,通过这个管理器进行管理。 里面有一个subs数组,用来存放依赖,并且定义了几个实例方法用来依赖进行添加,删除,通过操作。 比如ad…

mysql基础5——mysql主从

文章目录 一、基本了解二、主从原理三、主从复制3.1 从无到有3.1.1 服务器初始化3.1.2 配置主库3.1.3 配置从库3.1.4 效果验证 3.2 从有到无3.2.1 主库全备,并同步到从库3.2.2 配置主库3.2.3 配置从库3.2.4 效果验证 四、数据库运维4.1 几个参数4.2 查看进程列表 一…

【案例实战】高并发业务的多级缓存架构一致性解决方案

我们在高并发的项目中基本上都离不开缓存,那么既然引入缓存,那就会有一个缓存与数据库数据一致性的问题。 首先,我们先来看看高并发项目里面Redis常见的三种缓存读写模式。 Cache Aside 读写分离模式,是最常见的Redis缓存模式&a…

树莓派教程2023

摘要:本教程只适用于最新版树莓派64位系统(debian11) 树莓派官网(之前是org): https://www.raspberrypi.com/ 一.烧录系统 1.官网下载官方烧写器 https://downloads.raspberrypi.org/imager/imager_late…

部署Redis到云服务器

购买某服务商的云服务器 在云服务器中设置TCP端口号 配置云服务器的开放端口 通过telneat测试端口是否可用 配置redis服务器 需要配置一下自己云服务器的ip 保护模式关闭、允许其他远端连接 设置和云服务器开放一致的端口号 打开此项设置redis的连接密码,更加…

一、计算复杂度

补充说明: 1、决定性问题: 一个决定性问题(decision problem)是指其输出,只有“是”或“否”的问题。 一、P问题(polynomial time class) 1、问题描述: 可于确定型图灵机以多项式时间求解的决定性问题…

STM32学习之keil5环境搭建

1.keil5是开发ARM内核芯片最常用的集成开发环境IDE。STM32开发环境的搭建主要分为两步: 第一步,安装Kile5.到keil官网下载:Keil Embedded Development Tools for Arm, Cortex-M, Cortex-R4, 8051, C166, and 251 processor families. 第二步…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI指数的生态质量评价及拓展应用

第一章 生态环境脆弱性评价内涵及基于文献可视化方法研究热点分析 一、基本原理 生态环境脆弱性内涵 生态环境脆弱性评价研究 生态环境脆弱性驱动力研究 生态环境脆弱性研究热点 二、文献可视化软件介绍及常用功能介绍 VOS Viewer文献可视化及研究热点分析&#xff…

工业物联网时代需要什么样的数据采集设备

引言: 随着物联网技术的飞速发展,数据成为推动企业决策和创新的核心资源。然而,要实现高效的数据收集和分析,需要可靠的数据采集设备。本文将探讨物联网时代对数据采集设备的需求,并介绍一款优秀的工业边缘网关产品——…

软考A计划-系统集成项目管理工程师-项目范围管理(三)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

DevOps系列文章之 DevOps 运维服务体系

DevOps 体系是从原始运维一步步走过来的,原始运维好比是本,有了本进而想继续提升效率、减少出错、优化流程,就发展到了 DevOps,AIOps……各种Ops 首先,运维的业务职能规范后形成章程、纲领,在互联网快速发…

flutter手写一个底部导航栏

使用了一下flutter提供的导航栏,NavigationBar,不过感觉使用起来不是很方便。 譬如说: 不能直接使用图片资源,需要中间加几层转换把图片转化成icon文本大小及颜色不太好控制状态栏的上边来一个横线也没有相应的样式,等…

对 tcp out-of-window 的安全建议

TCP 收到一个 out of window 报文后会立即回复一个 ack,这是 RFC793 中 SEGMENT ARRIVES 段的要求。但这是为什么?难道不是默默丢弃才对吗? 对 oow 报文回复 ack,岂不是把正确的 ack 号回过去了吗,这样攻击者盲打一番…

设计模式篇---建造者模式

文章目录 概念结构实例总结 概念 建造者模式的定义:将一个复杂对象的构建与它的表示分离,使得同样的构造过程可以创建不同的表示。 这么看起来有点难以理解,翻译一下就是 用户无需关注创建复杂对象的过程,只需要指定创建的对象即…

一文带你了解云HIS

一、简介 基于云计算技术的B/S架构的HIS系统,为基层医院机构提供标准化的、信息化的、可共享的医疗信息管理系统,实现医患事务管理和临床诊疗管理等标准管理信息系统的功能。系统利用健康云计算平台的技术优势,建立统一的健康档案存储平台&am…

spark调试中常见的错误集锦

示例一、没有引入jar错误 错误描述: 以spark在pyspark环境解析xml为例 spark核心包不支持解析xml,所以需要引入引用依赖包配置为: config("spark.jars.packages", "com.databricks:spark-xml_2.12:0.16.0") 在spark-submit部署提交…

ctfshow_反序化漏洞

web254 首先进行一个代码审计 <?php error_reporting(0); highlight_file(__FILE__); include(flag.php);class ctfShowUser{public $usernamexxxxxx;public $passwordxxxxxx;public $isVipfalse;public function checkVip(){return $this->isVip;}public function logi…

Converting Phase Noise to Random Jitter(Period)

推导了Phase Noise to Random Jitter(Period)的转换过程&#xff0c;解释了分频对Phase Noise & Spur(每2分频改善6dB)的影响&#xff0c;每N分频&#xff0c;TIE RJ(1&#x1d70e;)不变(之前已推导)&#xff0c;而Period RJ(1&#x1d70e;)增加√N倍。