《互联网的世界》第四讲-拥塞控制与编码

需要澄清的一个误区是,拥塞绝不是发送的数据量太大导致,而是数据在极短的时间段内到达了同一个地方以至于超过了网络处理容量导致,拥塞的成因一定要考虑时间因素。换句话说,拥塞由大突发导致。

只要 pacing,再多的数据量也不会拥塞,1GB,100GB,100TB 的数据遵循同一 pacing 发送只是需要不同时间平滑送完,然而只要 100MB 的数据同时到达就可能导致拥塞,即使再大的瓶颈带宽,再大的 buffer,更大的突发也会导致拥塞必然发生,拥塞绝不是资源不足导致。

如今带宽已足够大,配合丢包,整型,限速,足以应对任何程度的拥塞,但任意一个上述措施都将压力给到了端主机。按 1970 年代网络和主机环境的假设,传输层需要模拟一个无损网络细水长流地送达,端主机必须处理丢包以及波动,这种假设下,tcp 顺势而生的彼时需重点考虑稀缺的带宽和内存,长肥管道怎么办也一直是 tcp 担心遇见却很长一段时间都不存在的环境,可如今的广域网几乎都很长肥,多亏了 cdn。

本节我以不同的视角给我的孩子们描述一个不同的网络传输假设。

现在的带宽足够大且便宜,内存也足够大且便宜,1970 年代的假设已经不复存在,改变主要表现在三方面。

首先,数据的获取方式变成了实时传输,而不再从硬盘上获得。曾经的先下载后使用的方式彻底被改变,曾经的下载过程不需要关注时延抖动,如今的实时传输则要同时关注速率和抖动。其次,足够大且便宜的带宽允许主机在更长的时间段发送更大的数据,数据编码不再一字千金。最后,足够大且便宜的内存允许主机在展示数据之前缓存足够久的时间,这段时间则为纠错等预处理提供了操作空间。

因此,始自 1970 年代的传输方式需要改变,不能通过重传的方式加剧时延抖动,不必过于在意传输数据量大小,通过更冗余的编码在 receiver 纠错。

在继续这个话题之前,我并没有给孩子们过多灌输 tcp/quic/rdma 这类协议是如何做的,因为如果他们对此太了解了反而不好,如果以近乎完美的 tcp 携带 bbr 为标杆,我需要不断解释下面这段话:

冗余编码肯定会更长,这个必须要接受,tcp 以重传构建无损的优化方式是引入 fec 而减少重传,但所有声称具有灵活切换重传(术语叫 arq)和 fec 的协议都是在侥幸赌博,设计者的心理向着压缩数据量靠拢,企图以最少的数据量传输信息,在不得不加入冗余的时刻再加入,而需要加入冗余的时刻恰恰就是拥塞的时刻,但拥塞期间提高冗余只能更拥塞,这也是他们所看到的结果,他们会告诉你,fec 在拥塞期间效果并不好,最终还是要靠重传。他们接受不了将冗余平滑到整个传输期间,因为他们接受不了或者说理解不了在不拥塞的时候为什么还要冗余,他们希望得到免费的午餐,不想增加一点点他们知道哪怕只是可能会输掉的筹码。

我让孩子们试着去理解英文和中文的差别,英文听错一个音节无碍于听懂整个词,中文听错一个音节就损失整个词,这是为什么。因为英文单词是多音节编码,多音节自带了冗余,而汉字是单音节编码,没有冗余。英文以多音节单词为书写单位,单词之间有空格,以连读关联两个甚至多个单词来提供语音的黏连冗余,而汉字以单音节单字为书写单位,每个汉字之间有空格并不区分词,连读黏连也就很自然向整体拼读方向压缩,比如 “之于” 本来还是两个音节,被压缩成了 “诸”,“什么” 变成了 “啥”,还有一些正在发生的,比如 “这样” 和 “酱”,“不好” 和 “表”(其实本来就有连音字 “嫑”),还有 “只因” 和 “鸡”。

映射到如今的计算机编码和传输,很容易发现始自英语国家的计算机反而使用中文的编码和传输方式。单独编码字母而不是单词,每个字母是一个单独的 ascii/unicode,字母与字母之间平行无关联,显然就是一种 “单音节,无黏连” 的方式。

用自然语言的编码和传输方式作为模板去设计计算机(特别是 ai 领域)网络传输方式,虽不一定最优,至少合理。

作为 80 后互联网工人,我必须试着从 “压缩数据量结合重传” 的保守策略转换到 “增加冗余量允许丢包” 的激进策略。前者说的是 “压缩数据量也有利于避免拥塞,但不幸拥塞发生了,重传兜底”,后者则意味着 “无需太在意数据量大小,丢包就丢包吧”。

仍以现有的 unicode 码为基础,假想一种简单的拉链式黏连编码,后一个符号编码有一部分是前一个符号编码的纠错码,或者更简单一点,以连续两个字符为单位编码成 “x|y|x + y”,如果 y 丢了,用 x + y - x 来恢复,这些都是很自然的方案。

但考虑到计算机网络传输的特殊性,依然需要更加复杂的处理。

考虑两个环境特征,首先,数据以数据包(packet)为单位传输,每个数据包有 mtu 字节的大小,超过 1KB,连续编码的原始数据和纠错码几乎是一丢全部丢;其次,拥塞非均匀发生,拥塞本身具有突发性和连续丢包概率。在实际传输前需要做两层随机,将上述两件不幸的事平滑开来。第一,将连续编码随机到不同数据包,第二,将拥塞丢包的纠错码随机到非拥塞时期。

下面是一个孩子们能理解的简单方案:
在这里插入图片描述

这里仍然存在两个问题,第一个问题,x,y,x+y 所在的数据包丢了两个,就无力恢复了,但这个问题可以缓解,比如引入拉链,“a|b|a+b|c|b+c|d|c+d|…”,但依然无法彻底解决,所以转变观念很重要,也许大不了还是可以反馈一个 nack 的。第二个问题是传输数据量会成倍增加。第二个问题解决后,第一个问题就能进一步缓解,因为可以容纳更多冗余了。

如果全世界只有英文,用计算机网络传输英文和用嘴说英文没有什么不同,人们用 26 个字母排列组合成所有的文字资料,但记忆单位却是多个字母组成的多音节单词甚至短语,习惯用语,人们编码的是单词。计算机也可以直接编码单词,比如用 1 个码来表示 “skinshoe”,而不是 8 个码,这就极大的压缩了编码空间。

如果引入其它字符,比如中文,编码词语依然比编码单个汉字更有效,比如 “皮鞋” 可以只用 1 个码,而现有方案却需要 2 个码,但由于中文本来就已经极度压缩了,比如 “之于” 压缩成了 “诸”,这种词语编码显然没有英文的单词编码性价比更高。

chatgpt 在神经网络的意义空间里就是类似的编码方式,字,单词,词组,短语,句子,段落,文章等信息均被编码到一个用意义关联的多维空间,“h” 和 “e” 不再是孤立的字符,“he” 和 “him”,“his” 距离很近,同理,“桌子” 和 “椅子” 距离很近,因为它们都是家具。这是从意义中恢复的依据,所谓的意义就是个概率空间。“我去你妈的” 和 “我去你奶奶的” 不同,但意思一样。但有点跑题,今天的话题是冗余传输。

一条直线由 2 个点确定,每个单词都可以编码到一条直线,只需要给 2 个点 4 个坐标即可,如果加入冗余,可以传输该直线上的 3 个点,4 个点,甚至更多点,只要 receiver 收到任意两个点,就能恢复这个单词,4 个坐标编码一个单词看起来并不便宜,如果 3 个,5 个点提供冗余就更昂贵了,但如果编码更长的单词呢,就会变得更划算,借鉴哈夫曼编码思想,直线可以编码 “常用但长” 的单词,短语。

m 次曲线需要 m + 1 个点唯一确定,只要被编码数据量和 m + 1 + k 个点的坐标数据量在同一量级,其比值越大越划算。

只是人们并不习惯这种方法,如果仔细观察网络上传输的任何文字类数据,几乎没有不是单词,词组构成的无意义字符串,如果非要传输类似 “dqgfbkjfwkbswnfegeg” 的字符串,自然回退到 ascii/unicode 的代价就是冗余本身的代价。

至于图片,音乐的编码,它们本质上都是对模拟信息的数字化,而模拟信号都自带冗余,蓝天背景缺失的一块依然是蓝天,极小概率是一只恰好飞过的鸟。

讲给小孩子开个脑洞完全 OK,也能指引他们重新思考未来的传输协议,但回到现实中,工程化需要成熟和稳定的兼容性支撑,idea 随时都有,但落地的事只能踩着大规模部署技术的脚印前行。

刚刚跟博士聊到,那么多学界的 idea 其实都只是 idea 和论证,落地的东西还是传统 tcp/ip 相关的那套,实验室的假设在工程实践上很难被满足,好多新玩意儿最初都是军事目的,从军界需求扩散到学界在到民用的转化周期并不短,比如 tcp/ip 本身就经历过这样的过程。

所以,工人好好做工,经理好好开会,士不可以不弘毅,君子不能不经理。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软考59-上午题-【数据库】-小结+杂题

一、杂题 真题1: 真题2: 真题3: 真题4: 真题5: 真题6: 真题7: 真题8: 二、数据库总结 考试题型: 1、选择题(6题,6分) 2、综合分析题…

python实现手机号归属地查询

手机上突然收到了某银行的短信提示,看了一下手机的位数,正好是11位。我一想,这不就是标准的手机号码吗?于是一个想法涌上心头——用python的库实现查询手机号码归属地查询自由。 那实现的效果如下: 注:电…

五、软考-系统架构设计师笔记-信息安全技术基础知识

信息安全技术基础知识 1、信息安全基础知识概述 信息安全的概念 信息安全包括 5 个基本要素: 机密性:确保信息不暴露给未授权的实体或进程。完整性:只有得到允许的人才能修改数据,并且能够判别出数据是否已被篡改。可用性:得到授权的实体在需要时可以…

“祖传代码“的是是非非

程序员眼中的“祖传代码”,就像一本古老而神秘的魔法书,藏着无穷的智慧和技巧,有些代码像家传宝贝,有些像祖传秘方。快来分享一下你遇到的“祖传代码”吧~ 祖传代码的历史与文化价值 祖传代码通常指的是经过长时间使用和传承的代…

于51单片机的智能驾驶系统设计[proteus仿真]

基于51单片机的智能驾驶系统设计[proteus仿真] 智能驾驶检测系统这个题目算是课程设计和毕业设计中常见的题目了,本期是一个基于51单片机的智能驾驶系统设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥&…

大话C++之:对象内存模型

一般继承(无虚函数覆盖) 只有一个虚指针,指向一个虚表,虚函数按顺序从祖先节点开始插入到虚表上。字段按顺序从祖先节点开始插入到对象内存上 一般继承(有虚函数覆盖) 只有一个虚指针,指向一个虚表,虚函数按顺序从祖先节点开始&a…

嵌入式中volatile关键字的使用方法

Hi,大家好! 今天我们来学习一下volatile关键字,volatile关键字想必大家在平时编程中都见过或用过。可是小伙伴们有没有想过什么时候需要使用volatile关键字吗? 在C语言中,volatile是一个关键字,用于告诉编译器不要优化…

绘图机器 - 华为OD统一考试(C卷)

OD统一考试(C卷) 分值: 100分 题解: Java / Python / C 题目描述 绘图机器的绘图笔初始位置在原点(0, 0),机器启动后其绘图笔按下面规则绘制直线: 1)尝试沿着横向坐标轴…

【Redis】RedisTemplate和StringRedisTemplate的区别

两者的关系是 StringRedisTemplate 继承 RedisTemplate 。 两者的数据是不共通的:也就是说 StringRedisTemplate 只能管理 StringRedisTemplate 里面的数据,RedisTemplate 只能管理 RedisTemplate 中的数据。 RedisTemplate 看这个类的名字后缀是 Temp…

安康杯安全知识竞赛上的讲话稿

各位领导、同志们: 经过近半个月时间的准备,南五十家子镇平泉首届安康杯安全生产知识竞赛初赛在今天圆满落下帏幕,经过紧张激烈的角逐, 代表队、 代表队和 代表队分别获得本次竞赛的第一、二、三名让我们以热烈的掌声表示祝…

vue3+uniapp在微信小程序实现一个2048小游戏

一、效果展示 二、代码 <template><view class"page"><view class"top"><view class"score">得分:{{total}}</view><view class"time">用时:{{allTime}}s</view></view><view cl…

【代码随想录算法训练营Day34】860.柠檬水找零;406.根据身高重建队列;452.用最少数量的箭引爆气球

❇️Day 34 第八章 贪心算法 part04 ✴️今日任务 860.柠檬水找零406.根据身高重建队列452.用最少数量的箭引爆气球 ❇️860.柠檬水找零 本题看上好像挺难&#xff0c;其实挺简单的&#xff0c;大家先尝试自己做一做。题目链接&#xff1a;https://leetcode.cn/problems/lem…

python lambda表达式(匿名函数)

lambda 表达式 在Python中&#xff0c;匿名函数&#xff08;也称为lambda函数&#xff09;是一种简洁的方式来定义小函数&#xff0c;这些函数可以在需要的地方直接定义和使用&#xff0c;而不需要使用def关键字来定义一个具有名称的函数。 lambda 函数是一种小型、匿名的、内…

软件测试/测试开发|一文讲清楚你什么是测试用例

前言 对于一个测试工程师来说&#xff0c;测试用例的编写是一项必须掌握的能力&#xff0c;但有效的设计和熟练的编写确实一项十分复杂的技术。不仅需要掌握软件测试技术和流程&#xff0c;而且还要对整个软件不管从业务&#xff0c;还是对软件的设计&#xff0c;程序模块的结…

【Bugs】class path resource [xxx.xml] cannot be opened because it does not exist

报错&#xff1a; 关键报错信息&#xff1a; class path resource [scope.xml] cannot be opened because it does not exist完整报错信息&#xff1a; 2024-03-01 14:26:58 866 [main] DEBUG org.springframework.context.support.ClassPathXmlApplicationContext - Refres…

外部存储器接口(EMIF)

外部存储器接口&#xff08;EMIF&#xff09; 该设备支持双核架构&#xff1b;为了为每个CPU子系统提供一个专用的EMIF&#xff0c;该设备支持两个EMIF模块——EMIF1和EMIF2。两个模块完全相同&#xff0c;具有相同的功能集&#xff0c;但具有不同的地址/数据大小。EMIF1在CPU…

赋能中国制造,大道云行发布智能制造分布式存储解决方案

《中国制造2025》指出&#xff0c;“制造业是国民经济的主体&#xff0c;是立国之本、兴国之器、强国之基。” 智能制造引领产业提质增效 智能制造是一种利用先进的信息技术、自动化技术和智能技术来优化和升级制造业生产过程的方法。它将人工智能、大数据、物联网、机器学习等…

代码工具APEX的入门使用(未包含安装)

第一次使用APEX是2019年&#xff0c;这个技术成名已久只是我了解的比较晚。请看Oracle ACE的网站&#xff0c;这就是用APEX做的。实际上有一次我看O记的人操作他们的办公流程&#xff0c;都是用APEX做的。 那一年&#xff0c;我用APEX做了一个CMDB的管理系统。那时候还没有流行…

Docker实战——容器

目录 Docker 容器的基本概念与操作1.使用“docker create”创建容器。这里基于Nginx的镜像创建了一个容器&#xff0c;名字为mycontainer。2.使用“docker ps -a”命令查看所有的容器&#xff0c;这时的容器不一定是运行状态。3.使用 “docker start” 命令可以启动容器。4.使用…

如何创建测试计划?这些要考虑到

以下为作者观点&#xff1a; 创建一个彻底和有效的测试计划对软件测试的成功至关重要。它可以帮助识别过程中可能出现的潜在问题或问题。 什么是测试计划&#xff1f; 测试计划是一份文件&#xff0c;概述了软件测试过程的策略、目标、资源和时间表。测试计划通常包括一些细…