时延抖动和通信的本质

先从网络时延抖动的根源说起。

信息能否过去取决于信道容量,而信道利用率则取决于编码。这是香农定律决定的。

考虑到主机处理非常快,忽略处理时延,端到端时延就是信息传播时延,但现实中通信信道利用率非常不均匀,统计复用的意思是,某些时刻信息量太大以至信道过载,某些时刻信息量过小导致信道轻载甚至空载,因此引入少量 buffer 平滑这种统计波动,同时提高信息到达率和信道利用率。

关于统计复用网络的全部就以上这么多,抖动则来源于对以上描述具体操作时的弄巧成拙。

信息在链路某处若超过信道容量一定过不去,问题的核心是在实际有空闲容量资源发送它前你最多容忍多久,而这恰恰不由你决定,它不仅由 buffer 大小决定,还由通信协议决定。

buffer 过大导致的排队时延是不得已的,你的应用对 0~buffer_size/bw 的时延抖动无能为力。只能寄希望于设备厂商压缩 buffer 大小。

协议时延分端到端协议抖动和底层协议抖动,而端到端协议抖动可以避开。比如应用层自己都认为可以丢弃的数据,tcp 却擅作主张非要死命重传而引入至少 rtt 量级的时延抖动,这时就可以选择 udp 进行有损传输。

底层协议抖动比较难避开。比如 wifi 提供一种尽力而为的传输服务,如果传输一帧时出现冲突,wifi 会自行重试多次而引入 0~n*10ms 级的时延抖动,即使应用层并不需要这种努力也不行。

网络中或大或小的 buffer,网络边缘的无线 wifi,再加上使用了 tcp,都是抖动的根源,端到端时延不可能稳定,解决问题的方法很简单,在应用层加 buffer,这才是问题的实质,buffer 带来的问题通过再加一个 buffer 就能解决,重读上面的 3 个段落,可将 buffer 分两类,常规意义上的交换机可排队 buffer 算空间类,而 tcp,wifi 类的重传,重试行为算时间类,两类 buffer 共同引入了时延抖动。

buffer 引入的时延抖动显然是一种统计波动,而统计波动只要一个 buffer 就能平滑,这不,圆回来了一个圈。

最近帮朋友做一个无 buffer 协议,顺带着就聊聊 buffer 的本质。无 buffer 协议是一个非常简单的传输协议,“信息能否过去取决于信道容量,而信道利用率则取决于编码。” 没 buffer 什么事,意思是如果过不去就随他,能过多少是多少,通过编码来完全或部分恢复丢失的信息,这便是一个无抖动的 有损传输协议,这也是信息传输的本质需求,它从来不要求 100% 高保真,本质上有损的传输,为什么用时间来抵偿呢。

为啥长链路吞吐干不过短链路,困扰程序员多年的长肥管道问题,都能用香农公式说明白,信道容量和带宽 B 和信噪比 S/N 正相关,随着链路长度增加,B,S 不变,N 在增加,S/N 减小。印证我之前文章里另一种解释,随链路长度增加,好事发生的概率是各好事的概率相乘,坏事则是各概率相加,就殊途同归了。

计算机网络不讲这个,但本质上还是这个。计算机网络讲的是在目标处 100% 保真重现源信息,又不能违背香农自然律,就必须用协议靠时间去弥补信道固有损失,吞吐 = 保真数据量/时间,无论在数据中加冗余,还是抵偿了时间,表现都是降低了吞吐。

用空间换时间,提高信噪比,用冗余编码确保信息保真,带宽不满足时等一会儿再发,信息丢失了重新发一遍,这些其实都是在对抗不了香农定律后试图弥补损耗的不同方法,但计算机网络围绕基于 buffer 的 “包交换”,也就是统计复用的分组交换技术展开,因此后两种方法值得关注,其中,buffer 是核心。 有趣的是,包交换之前的打电话恰恰相反,因此你听到的电话那头的声音明显失真,但绝不卡顿。

明显失真,但绝不卡顿,看上去不错,但计算机网络却是明显卡顿,但绝不失真。

来看 buffer 的本质。

把 buffer 看作一种信用货币,而带宽则是我们买东西的实际货币,就好理解了。现代社会,实际货币也算信用货币,就像 bdp = bw * proprt + buffer 一样。通俗讲,信用货币就是每一元的币值不必对应某种等价物 比如黄金,而可以 “凭信用” 发行货币,只要拿到货币的人可以偿还等值就行。

信用货币产生于交易规模的扩大。只有 10 人参与交易,黄金可以分属 10 人,参与交易的人达到 10 亿人,仍然用黄金就不现实了,一个满怀信心的企业家开发一款注定能卖钱的新产品需借款 10 万块时,可能没有任何地方有价值 10 万的黄金借给他,如果他要借 100 亿,这个数可能超过当前全世界所有黄金总价值,这是不可能的,这是黄金等价物的 bug,信用货币修正了这个 bug,无论多少钱,把时间算进来,只要他在未来能偿付,这笔钱就可以无中生有。

解决了大规模交易问题,坏处也显而易见,即信用膨胀(你可能已经想到 bufferbloat 了)。银行疯狂放贷,以为这些钱可以在未来被勾销,但如果借钱的人纷纷还不上怎么办?一次大额借款不可怕,海量不受控的中小额借款才可怕,这就是次贷危机。

大规模通信需要 buffer 平滑大额需求,就像借贷,在未来以带宽勾销。buffer 太小无法覆盖需求,太大又属于信用超发,勾销前时间太久而 bdp 过大,buffer 度量信用额度,一处部署 buffer,处处需要部署 buffer 以吸纳它处的信用超发,最终实际可用带宽(流通货币)没有任何变化,但 bdp 却增大,这就带来通胀风险,一个 sender 想要保住它现有吞吐,越来越大的 buffer 中它要发送越来越多的报文,只为保住配额,表现为物价飞涨。

上述场景适合描述 10 年来的房产市场,从银行借一笔钱还给开发商,月薪大涨却拿一大部分还银行,最终实际能消费的钱却没有任何改变。当交换机意识到这个问题时,aqm 会丢包来触发 buffer 通缩,各个 sender 降低 cwnd 回归现实,对于现实世界,失业,断供也会让人们做价值回归,随之而来的可能就是通缩。

显而易见的经济规律配备合理的玩法,网络流量在 buffer 调节下自然也是繁荣与萧条的此起彼伏,波动,时延抖动是固有的,根植于 buffer。然而 rdma/roce 促进的 pfc(priority flow control) 却把 buffer 玩成了花。

当次贷危机已发生,解题的有效方法就是促进破产,这理论不见得恒对,但破产确实能消除债务。网络拥塞后丢包不仅仅是通知 sender,也确实缓释了当前 buffer,消除了部分作为债务的 queue,减缓了拥塞的进一步危害。可 pfc 反压是什么鬼?

拥塞只影响当前交换机流量甚至在 codel 起作用时只影响单流,拥塞不出交换机,就地解决。而 pfc 则将拥塞状态蔓延,一个 buffer 堆积造成一个 buffer 树一起堆积,多少无关流量受害,甚至 deadlock,然后是一系列解决特定问题比如 pfc-deadlock 的顶会奇技淫巧,小范围烂账迅速蔓延成次贷危机以及随之而来的新政。

pfc 本质上要提供一个无丢包网络,但根据信道的香农定律,绝对不丢包不可能,而弥补丢包必然引入不可预期的时延抖动,无论 buffer,tcp 还是 wifi,都以时延抖动为代价提供了不丢包和尽量不丢包的保证,而 pfc 做同一类事的方式最不雅且鲁莽,它不惜影响网络全局状态只为不丢包。

历史早就过去,但历史的方案还在,这就有大问题。rdma 需要一个无损网络只因 gbn 代价太大,而在硬件中实现 sack 代价更大,pfc 恰好以小代价提供了无损网络的底层。如果非要保留 pfc,不如在每交换机 buffer 旁边部署一个副 buffer,大小大概一个 bdp,在通知到 sender 抑制速率前继续缓存,但千万别把状态反压给上游,拥塞不蔓延是原则。

人们太执着于提供一个可靠传输协议,提供一个无损传输网络,对丢包天然抵触,以为传输就应该完全可靠,人们用完美保真的态度看待传输,这是典型的计算机分层方法论,只关注接口语义而不管细节,但这种方法论同时也给人们带来了很大负担。

共享带宽链路上跑 capacity-searching 协议,必然会冲突,排队甚至丢包,解决这些必然发生的问题就是协议的目标,也正是解决这些问题的进展把事情搞得越来越复杂。计算机的视角下,通信的本质被分层协议模型完全掩盖。

换一种思路,以通信视角看传输并配合按需重传。以明确的 nak 请求重传取代擅自 arq。配合精致的冗余编码,buffer 也可同步减少以降低时延抖动,不用再怕丢包,有些数据是可丢的,不可丢的如果不能从冗余中恢复,还可以请求重传,而这一切都在应用程序自己的控制范围内,也就从根本上消除了它不想要的时延抖动。

幸运的是,随着流媒体发展,需求越发允许失真,但不接受卡顿,回归了信息传输的本质。传输优化越发倾向于精巧编码 + fec 而不是 buffer-oriented cc(先拥塞后控制),接受你最低限度接受的,剩下的放弃掉不要。

信道容量由香农定律限定,而编码说来如何?尽量用短数据编码长数据(这里面包含了压缩)并提供冗余,规矩一样,提供冗余,不苛求信道,传输量尽可能小。

假设要编码 s = 1234567890987654321,直线 y = ax + s 上一定存在一个点 P 使 {a, P} 比 s 更短,传输 {a, P} 即可,receiver 取斜率为 a,过点 P 直线的截距即可解码原始数据 s,如果找到多个这样的点,同时传输 {a1, P1},{a2, P2},…{an, Pn} 可提供冗余,receiver 只要收到任意一个即可还原 s。

同理,可提供 m 次曲线编码大数据,提供能唯一确定该曲线且可用更短数字编码的 n 个点,同时传输多个 n 次拼接的短数据即可提供冗余,可视 receiver 的保真要求调节冗余度,由此,曲线不必精确,亦可拟合。很多年前写的 密钥分存 比较有趣,供参考。

问题是怎么找到这些编码更短的点,比如事先不知 y = (x - 1)(x - 2), 当 x = 100000 时,y = 9999899998,现在若要编码 9999899998,只需找到并传输 {1, 2, 5} 即可,receiver 即可根据二次曲线解码 y。这是技巧和算力的事,但和重传,重试,buffer 相比,性价比大概提升,守恒律,不费电不行,提高信号功率也得费电。

上周末写的 因式分解的几何意义 里也有编码的启发,一大一小正方形固定挨在一起,就可以决定很多比两个正方形边长更长的数字,主要就是短数据决定了什么长数据是不变的。

正式的标准化编码原理我这里不提,请自行学习。

总之,让传输回归自然律。

接着昨天的 tcp pure ack “反馈风暴”,以通信的视角重新看网络传输这件事。

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

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

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

相关文章

一则 MongoDB 副本集迁移实操案例

文中详细阐述了通过全量 增量 Oplog 的迁移方式,完成一套副本集 MongoDB 迁移的全过程。 作者:张然,DBA 数据库技术爱好者~ 爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 本文约 900…

python炒股自动化(1),量化交易接口区别

要实现股票量化程序化自动化,就需要券商提供的API接口,重点是个人账户小散户可以申请开通,上手要简单,接口要足够全面,功能完善,首先,第一步就是要找对渠道和方法,这里我们不讨论量化…

linux 内核等待队列

等待队列在Linux内核中用来阻塞或唤醒一个进程,也可以用来同步对系统资源的访问,还可以实现延迟功能 在软件开发中任务经常由于某种条件没有得到满足而不得不进入睡眠状态,然后等待条件得到满足的时候再继续运行,进入运行状态。这…

网络安全--基于Kali的网络扫描基础技术

文章目录 1. 标准ICMP扫描1.1使用Ping命令1.1.1格式1.1.2实战 1.2使用Nmap工具1.2.1格式1.2.2实战1.2.2.1主机在线1.2.2.2主机不在线 1.3使用Fping命令1.3.1格式1.3.2实战 2. 时间戳查询扫描2.1格式2.2实战 3. 地址掩码查询扫描3.1格式3.2实战 2. TCP扫描2.1TCP工作机制2.2TCP …

MySQL 索引类型

什么是索引? 索引是一种用于提高数据库查询性能的数据结构。它是在表中一个或多个列上创建的,可以加快对这些列的数据检索速度。 索引的作用是通过创建一个额外的数据结构,使得数据库可以更快地定位和访问数据。当执行查询语句时&#xff0c…

【数据库设计和SQL基础语法】--SQL语言概述--SQL的基本结构和语法规则(一)

一、SQL的基本结构 2.1 SQL语句的组成要素 SQL语句的组成要素 关键字(Keywords): 定义:SQL语句的基本操作命令,表示要执行的动作。例子:SELECT、INSERT、UPDATE、DELETE等。 标识符(Identifiers&#xf…

位运算总结

文章目录 🍈1. 基础位运算🍌2. 给一个数n,确定它的二进制表示中的第x位是0还是1🍏3. 将一个数n的二进制表示的第x位修改成1🍓4. 将一个数的n的二进制表示的第x位修改成0🥔5. 位图的思想🫒6. 提前…

医疗智能化:人工智能的助力与隐患

文章目录 引言:积极影响风险和挑战 结尾: 引言: 医疗领域正处于人工智能技术革新的前沿。人工智能的涌现为医疗保健带来了前所未有的变革,同时也潜藏着一系列积极影响和潜在挑战。探索人工智能在医疗领域中的影响将有助于我们更深…

医保移动支付程序开发

作为公司最苦命的开发,年初接到任务开发医保移动支付程序(微信小程序和支付宝小程序),为医疗机构提供线上医保结算。好家伙,我一看解压后资料大于一个G,内心无比的惊慌。 一、技术流程图 图太大了显示不全需…

0-1背包的初始化问题

题目链接 这道题的状态转移方程比较易于确定。dp[i][j]表示能放前i个物品的情况下,容量为j时能放物品的数量(这道题歌曲数量对应物品数量,容量对应时间)。 技巧(收获) 二维dp数组可以视情况优化为一维dp数组…

【创建一个组件并通过npm让其他人安装和调用】

创建一个组件并通过npm让其他人安装和调用 步骤一:创建一个组件步骤二:准备发布步骤三:注册npm账号并登录步骤四:发布组件步骤五:安装和使用组件 步骤一:创建一个组件 在本地创建一个新的文件夹来存放你的组…

Linux——vim编辑文件时——.swp文件解决方案

test.cpp样例 当我们vim test.cpp进入编辑文件。 却忘记了保存退出 再次进入就会出现一下画面 当你摁下Enter键位 出现以下几个选项 O——是只读不写 E——是正常打开文件但不会载入磁盘内容 R——覆盖——是加载存储磁盘的文件(当我们忘记保存时,系统会自动帮我…

事件代理?

1.什么是事件代理? 事件代理也叫事件委托,只指定一个事件处理程序,就可以管理某一类型得事件。 可以简单理解为,事件代理就是将本应该绑定子元素事件绑定给父元素代理。它的优点就是:减少事件得执行,减少浏…

CentOS 7 部署 MariaDB 的 2 种方法

有两种安装 MariaDB 服务器的方法。您可以安装 CentOS 7 存储库中可用的默认版本,也可以通过手动添加 MariaDB 存储库来安装最新版本。 如果安装过MariaDB或MySQL,使用以下命令彻底删除它们: yum remove mariadb* yum remove mysql* 方法一: 使用 Yum…

[ Vue3 ] 三种方式实现组件数据双向绑定

Vue3 三种方式实现组件数据双向绑定 在 Vue 中,组件数据双向绑定是一项非常重要的特性,它使得我们能够轻松地在组件中处理数据的变化并将其同步到视图 比如我们想要在父组件中修改数据能够同步给子组件,并且子组件修改数据也能同步给父组件…

Make Pixels Dance: High-Dynamic Video Generation论文解析

高动态视频生成的新进展 Make Pixels Dance: High-Dynamic Video Generation高动态视频生成的新进展前言视频生成模式摘要论文十问实验数据集定量评估指标消融研究 训练和推理技巧训练技术推理技术 更多的应用 Make Pixels Dance: High-Dynamic Video Generation 高动态视频生…

VBA技术资料MF87:创建固定顺序名称的一组文件夹

我给VBA的定义:VBA是个人小型自动化处理的有效工具。利用好了,可以大大提高自己的工作效率,而且可以提高数据的准确度。我的教程一共九套,分为初级、中级、高级三大部分。是对VBA的系统讲解,从简单的入门,到…

gRPC Java、Go、PHP使用例子

文章目录 1、Protocol Buffers定义接口1.1、编写接口服务1.2、Protobuf基础数据类型 2、服务器端实现2.1、生成gRPC服务类2.2、Java服务器端实现 3、java、go、php客户端实现3.1、Java客户端实现3.2、Go客户端实现3.3、PHP客户端实现 4、运行效果 本文例子是在Window平台测试&a…

Unity UGUI图片锯齿严重怎么解决

在开发的时候,发现图片锯齿严重,打包到移动端或者在编辑器都这样,如下图 原因: 查了一些资料,找到了原因如下:关于为什么会发生这种情况:看起来你的源资源比你在屏幕上显示的大小大得多。所以当…

【迅搜04】索引配置(一)加载配置文件以及服务端配置

索引配置(一)加载配置文件以及服务端配置 对于一个搜索引擎来说,索引配置是非常重要,并且也是非常核心的内容。在 XS 中,我们的索引配置是通过一个配置文件来实现的。在前两篇文章的测试中,我们使用了一个叫…