以太网,拥塞控制与 AQM

news2024/9/28 17:31:27

拥塞的表现是冲突,大量消费者挤兑有限资源,即拥塞,在一个绝对没有冲突的系统里,自然就没有拥塞。而冲突的来源有两个,一个是无序,一个是贪婪。

仅引入秩序不能解决冲突,但可减少冲突损耗,所谓冲突损耗,即一旦碰撞,两败俱伤。控制拥塞的另一面是控制贪婪,这需要让 Host “在不能发送报文的时候不发送”。

贪婪问题需要端到端拥塞控制机制,而秩序是端到端机制的前提,所以先看秩序。
但秩序带来的额外复杂性与冲突损耗相比,孰轻孰重,需权衡。

最初的系统一般简单无秩序,而冲突与贪婪正相关,渐大的冲突损耗会迫使 Host 自行收敛。
交叉路口相交的两条道路上如果车流量极小,便不必安装红绿灯,谁也不想出车祸,只能慢速通过。以一个程序员更熟悉但不同意的例子来说。

假设应用程序拥有完备的错误检测机制,便无需引入同步机制,不再需要 spinlock 这种东西,如果应用程序检测到错误,重试,直到获得正确结果,在轻负载场景,这种方式可以极大降低系统复杂度,同时获得不错的效率。

程序员往往在意 “随着系统规模扩大的 O(1) 特征。” 即使系统规模永不会扩大,追求精确,完备,可扩展的思维方式也会促使绝大多数程序员过早考虑可扩展性,从而过度设计,丢失了快速拿出第一版的机会。

但如果系统规模果真逐渐扩大,就真要引入秩序。

看个真实的历史。

IEEE 802.3 采用 CSMA/CD 流程。这是典型的 “直接发,错了就重试,直到正确” 的方式,跟上面那个同步临界区的例子别无二致。这种方式在早期轻负载场景非常有效,当分布式一致性秩序代价太高时,随机就是性价比最高的。至于可扩展性,遇到了再说。

再看与 802.3 有点竞争的 802.4 令牌总线和 802.5 令牌环。令牌相当于仲裁者,有效解决了 CSMA/CD 冲突损耗问题。令牌总线 or 令牌环 拥有重负载可扩展性但却失去了接入可扩展性(没有接入,哪有重负载?),秩序引入的复杂性并不值得。人们更容易接受 802.3,因为简单廉价,接入新节点代价小,以当时条件,以太网的使用方式比标准允许的更保守,CSMA/CD 也足够。

但可扩展性问题迟早会暴露,这也促进了 CSMA/CD 到交换式的演进,而不是用令牌网络替换以太网。

交换机引入秩序的方式比较有趣:
在这里插入图片描述

以太网线太长,光速太慢(量子纠缠要快太多),仲裁时间太久,这意味着 CSMA/CD 这种争抢方式性价比更高。然而将需要仲裁的共享介质压缩到盒子里,理论上可将仲裁时间缩短几百倍(以 200 米线缆以及 0.5 米边长的交换机主板为度量),该尺寸下,集中控制的开关矩阵非常有效,A/B,C/D 的通信可轻易并行不悖,比如 CrossBar。为了消除 Host 到交换机间的收发冲突,拉两组线即可,非常平滑又简单的一次进化。

交换机并不神奇,看上面右下角的开关矩阵,数数一共多少根线,如果在共享介质的同轴电缆上这拉这么多线,用继电器相交连接,也可实现开关矩阵,问题是线缆太长,光速太慢,仲裁信号传输太久。

开关矩阵,双绞线,buffer 这三件套将以太网引入了新时代,一直到今天,它的版本还在迭代。

回顾共享以太网到交换以太网的进化很有意义,这个过程中抽出一个控制面,转发逻辑被集中困在一个盒子里进行,盒子的每个端口都引出来收发两组线缆仅传输数据报文而不再传输控制报文,以秩序代替随机。集中 or 分布,秩序 or 随机,复杂 or 简单,背后都是性价比。
现在看冲突的另一面,贪婪。

秩序减缓了冲突损耗,同时也延迟了冲突的发生。与无序状态不同,Host 在 buffer overflow 之前无需承担任何贪婪的代价,注定控制贪婪的滞后性。

很多人强调 “端到端拥塞控制”,就好像端侧可以完全覆盖拥塞控制逻辑一样。这种观点并不正确。这种观点只是在描述 TCP/IP 端网分离的沙漏模型时为拥塞控制找一个位置罢了。

如果没有转发节点 AQM(or QM) 的参与,拥塞控制完全无法实施。以最简单的尾丢策略即可理解,更别提 RED 了,转发节点上的任何 buffer 管理机制都是 “秩序” 的一部分,前面提过,控制贪婪的前提是引入秩序。

转发节点使数据报文以一种有序的方式通过,消除了随机冲突损耗。但真正解决拥塞需要消费者与资源相匹配。因此端侧必须有某种可预期(而不是随机)的方式检测到拥塞的发生并实施拥塞控制,减少资源占用。

端侧获取的可预期判断恰来自 AQM 的反馈。端到端拥塞控制部署在端侧,AQM 部署在网侧,它们正交作用于网络,一个完整拥塞控制体系,二者缺一不可。

相比分布式控制网络,比如令牌网,TCP/IP over 以太网的 Host 离交换机太远,而光速太慢,发生拥塞是注定的,端到端拥塞控制与网侧 AQM 共同控制拥塞也是必须,这就是秩序的代价。

令牌网几乎不产生网络拥塞,每个 Host 在获得令牌前不会将报文注入到网络,而令牌数量和资源是匹配的。

AQM 和交换矩阵是 TCP/IP 网络实施资源仲裁的唯一位置,Host 并不参与仲裁,Host 到仲裁点的距离,注定 TCP/IP 的拥塞控制的滞后。
在这里插入图片描述

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

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

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

相关文章

JavaScript高级 浏览器的渲染原理

浏览器的渲染原理1. 网页的解析过程2. 浏览器内核3. 浏览器渲染过程1. HTML解析2. 生成CSS规则3. 构建Render Tree4. 布局(layout)5. 绘制(Paint)4. 回流和重绘解析1. 回流2. 重绘3. web 性能优化4. 合成和性能优化5. 浏览器遇到 …

【VulnHub靶场】——CHRONOS: 1

作者名:Demo不是emo 主页面链接:主页传送门创作初心:舞台再大,你不上台,永远是观众,没人会关心你努不努力,摔的痛不痛,他们只会看你最后站在什么位置,然后羡慕或鄙夷座右…

PaddlePaddle/PaddleX本地离线安装(分别以C++和Python为例)

目录一. 本地离线安装简介1.1 为什么需要源码编译1.2 源码编译的产物1.3 源码编译的原理二. 本地离线安装准备2.1 编译准备(C/Python通用)2.2 本地编译推荐配置(C)2.3 本地编译推荐配置(Python)三. Windows本地离线安装(C源码编译)3.2 编译工具安装3.3 打开Visual studio 终端3…

torch.cat函数

#dim0,上下拼接 #dim1,左右拼接 import torch # x1 x1 torch.tensor([[1,2,3],[4,5,6]],dtypetorch.int)# x2 x2 torch.tensor([[7,8,9],[10,11,12]],dtypetorch.int)#inputs为2个形状为[2 , 3]的矩阵 inputs [x1, x2] print(inputs)#dim0,上下拼接…

如何用Python字符串进行切片操作?

嗨害大家好鸭!我是小熊猫~ 我们基本上都知道Python的序列对象 都是可以用索引号来引用的元素的, 索引号可以是正数由0开始从左向右, 也可以是负数由-1开始从右向左。 在Python中对于具有序列结构的数据来说都可以使用切片操作&#xff0…

【C++升级之路】第五篇:C/C++内存管理(new和delete的实现原理)

🌟hello,各位读者大大们你们好呀🌟 🍭🍭系列专栏:【C学习与应用】 ✒️✒️本篇内容:C/C内存分布,C/C动态内存管理方法,C动态内存管理方法底层函数operator new 和operat…

浅谈树状数组

学习树状数组必不可少学习树状数组的精髓,lowbit()运算 在计算机中存储一个正数是以二进制的形式,而存储一个负数则是以二进制补码的形式,简单说就是二进制取反1,lowbit运算就是提取出最后一个1以后的位置,比如10100进…

【C语言】结构体、共用体、位域

结构体 1、 结构体的声明方法 struct struct_name {data_type member1;data_type member2;.. };这是其中一种声明方式~ 2、定义一个结构体变量 struct struct_name variable;3、访问成员变量 . 运算 一个结构体变量访问其成员时,使用的是 . 运算 下面…

BM35 判断是不是完全二叉树

题目 给定一个二叉树,确定他是否是一个完全二叉树。 完全二叉树的定义:若二叉树的深度为 h,除第 h 层外,其它各层的结点数都达到最大个数,第 h 层所有的叶子结点都连续集中在最左边,这就是完全二叉树。&a…

深入理解ConcurrentHashMap1.7源码

1. 概述 HashMap在我们的日常生活中使用很多,但是它不是线程安全的。我们可以使用HashTable来代替,主要实现方式是在方法中加入synchronized,所以效率也比较低。因此,对于键值对,我们可以尝试使用ConcurrentHashMap来…

实验室规划设计方案SICOLAB

一、实验室规划设计 喜格提供实验室布局方案 根据实验室性质、实验室定位、实验室功能、实验类型、实验工艺流程以及国家相关标准合理的规划布局。 喜格提供仪器摆放布局方案 根据该实验流程来确定仪器的种类、数量、规格型号、外形尺寸、电压功率等参数以及摆放位置以及提…

【Linux】tee、tail、killall、|、||、、命令学习

|、||、&、&&辨析 竖线‘|’在linux中是管道符的意思,将‘|’前面命令的输出作为’|后面的输入; 双竖线‘||’,用双竖线‘||’分割的多条命令,执行的时候遵循如下规则:如果前一条命令为真,则…

还在喷农民歌唱家大衣哥吗?他的一个不经意间的举动却造福了乡里

农民歌唱家大衣哥,一直以来都饱受争议,有人说他是炒货专家,然而事实真的如此吗?事实上,大衣哥也做了很多好事,像修桥补路等都不说了,单就他的一个不经意间的举动,就造福了四乡八邻。…

Windows内核--CPU和内核(1.7)

Windows内核支援哪些CPU? Intel x86/x86_64 IA64已不再支持. AMD amd64 ARM (Windows On Arm: WOA) ARM具备低功耗优势, 除了高通, 还有Broadcom/NXP等都支援ARM架构. 苹果自研M系列开了头,ARM不仅有低功耗,同样有性能,Windows也想分一杯羹…

【vue系列-03】vue的计算属性,列表,监视属性及原理

vue的核心属性一,vue核心属性1,计算属性2,监视属性3,样式绑定3.1,class样式绑定3.2,style样式绑定4,条件渲染5,列表渲染5.1,遍历列表5.2,key的作用5.3&#x…

2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细)

2022年全国职业院校技能大赛中职组网络安全竞赛——隐写术应用解析(超详细) B-8任务八:隐写术应用 *任务说明:仅能获取Server8的IP地址 环境需求私信博主 1.找出文件夹1中的文件,将文件中的隐藏信息作为Flag值提交; 解题步骤如下 2.找出文件夹2中的文件,将文件中的隐藏信息…

基于Vue的数据可视化设计框架,数据大屏可视化编辑器

开发文档(★★★★★) 请访问 https://lizhensheng.github.io/vue-data-view/ 完整代码下载地址:基于Vue的数据可视化设计框架,数据大屏可视化编辑器 简介 DataView是一个基于Vue的数据可视化设计框架提供用于可拖拽的控件提供…

Spring之IOC入门案例

目录 一:IOC入门案例实现思路分析 1.IOC容器管理什么? 2. 如何将被管理的对象告知 IOC 容器 ? 3.被管理的对象交给 IOC 容器,要想从容器中获取对象,就先得思考如何获取到 IOC 容器 ? 4.IOC 容器得到后,如何从容…

C++首超Java

TIOBE 公布了 2022 年 12 月的编程语言排行榜。 TIOBE 将于下个月揭晓其 2022 年度编程语言,目前共有 3 个候选者:Python、C 和 C。TIOBE CEO Paul Jansen 指出,虽然 Python 和 C 已多次斩获该头衔,而 C 仅在 2003 年获得过一次&a…

Android---开发笔记

ListView控件 <ListViewandroid:id"id/main_iv"android:layout_width"match_parent"android:layout_height"match_parent"android:layout_below"id/main_top_layout"android:padding"10dp"android:divider"null&qu…