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

news2024/12/26 11:22:14

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

只要 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 本身就经历过这样的过程。

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

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

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

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

相关文章

MongoDB开启事务

MongoDB开启事务 配置单节点。到路径C:\Program Files\MongoDB\Server\4.0\bin 使用记事本以管理员权限打开文件mongod.cfg添加如下配置: replication:replSetName: rs02. 重启MongoDB服务 3. 重启后执行命令 rs.initiate()

Python采集学习笔记-request的get请求和post请求

使用http://httpbin.org测试,一个简单的 HTTP 请求和响应服务。(需联网)1.导入requests包 import requests 2.测试get请求 url http://httpbin.org/get par {key1: value1, key2: value2} # 不带参数请求 r1 requests.get(url) # 带参数请求 r2 requests.get(url, paramspa…

数据库管理-第158期 Oracle Vector DB AI-09(20240304)

数据库管理158期 2024-03-04 数据库管理-第158期 Oracle Vector DB & AI-09(20240304)1 创建示例表2 添加过滤条件的向量近似查询示例1示例2示例3示例4示例5示例6示例7 总结 数据库管理-第158期 Oracle Vector DB & AI-09(20240304&a…

怎么采集GBK或GB2312等特殊字符编码的网站数据

如果要采集的网站是GBK或GB2312等特殊字符编码,采集结果可能是一堆看不懂的文字或乱码,无法使用。 通常网页文章采集工具有字符编码选项,默认是UTF-8(现在大部分网站都是),改选为GBK或GB2312字符编码即可&…

无人机/飞控--ArduPilot、PX4学习历程记录(1)

本篇博客用来记录个人学习记录,存放各种文章链接、视频链接、学习历程、实验过程和结果等等.... 最近在整无人机项目,接触一下从来没有接触过的飞控...(听着就头晕),本人纯小白。 目录 PX4、Pixhawk、APM、ArduPilot、Dronecode Dronekit…

【ArcPy】游标访问几何数据

访问质心坐标相关数据 结果展示 代码 import arcpy shppath r"C:\Users\admin\Desktop\excelfile\a2.shp" with arcpy.da.SearchCursor(shppath, ["SHAPE","SHAPEXY","SHAPETRUECENTROID","SHAPEX","SHAPEY",&q…

【Mybatis】批量映射优化 分页插件PageHelper 逆向工程插件MybatisX

文章目录 一、Mapper批量映射优化二、插件和分页插件PageHelper2.1 插件机制和PageHelper插件介绍2.2 PageHelper插件使用 三、逆向工程和MybatisX插件3.1 ORM思维介绍3.2 逆向工程3.3 逆向工程插件MyBatisX使用 总结 一、Mapper批量映射优化 需求: Mapper 配置文件很多时&…

高精准无人机激光雷达标定板

无人机激光雷达标定板是一种用于校准无人机激光雷达系统的工具,它可以帮助无人机获取更准确、更可靠的数据,从而提高无人机的导航精度和自主控制能力。本文将从无人机激光雷达标定板的基本概念、作用、应用领域、市场现状和发展趋势等方面进行介绍。 一…

LeetCode 1976.到达目的地的方案数:单源最短路的Dijkstra算法

【LetMeFly】1976.到达目的地的方案数:单源最短路的Dijkstra算法 力扣题目链接:https://leetcode.cn/problems/number-of-ways-to-arrive-at-destination/ 你在一个城市里,城市由 n 个路口组成,路口编号为 0 到 n - 1 &#xff…

【音视频开发好书推荐1】《RTC程序设计:实时音视频权威指南》

1、WebRTC概述 WebRTC(Web Real-Time Communication)是一个由Google发起的实时音视频通讯C开源库,其提供了音视频采集、编码、网络传输,解码显示等一整套音视频解决方案,我们可以通过该开源库快速地构建出一个音视频通…

12-Linux部署Zookeeper集群

Linux部署Zookeeper集群 简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。…

设计模式:六大原则 ③

一、六大设计原则 🍠 开闭原则 (Open Close Principle) 💌 对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。简言之,是为了使程序的扩展性好,易…

4步教你完成一篇让人挑不出毛病的产品需求文档!

“需求”这个词是产品经理工作中的常客,产品需求文档也贯穿于整个产品经理的日常工作中,本周小编将通过什么是产品需求文档,产品需求文档的作用、如何写好产品需求文档等方面分享如何写出一篇让你挑不出毛病的PRD,让需求文档助力产…

光分路器概述

光分路器主要有两种 技术: ㈠平面波导型光分路器(PLC Splitter) PLC分路器的封装是指将平面波导分路器上的各个导光通路(即波导通路)与光纤阵列中的光纤一一对准,然后用特定的胶(如环氧胶)将其粘合在一起…

计算机系统中的文件系统梳理

看之前,大家动动小手点个关注,谢谢。 原文地址:计算机系统中的文件系统梳理 - Pleasure的博客 下面是正文内容: 前言 这是一篇笔记 我之所以要选择这个话题,是因为前几天在对TF卡进行格式化的时候遇到了问题。有些专…

每日一练 | 华为认证真题练习Day192

1、下面是路由器RTB的部分输出信息,关于输出信息描迷错误的是: A. 接口上动态加入的组播组个数是1。 B. 加入的组播组地址是225.1.1.2 C. DISPLAY IGMP GROUP命令用来查看IGMP组播组信息,包括通过成员报告动态加入的组播组和通过命令行静态加入的组播组…

抖音视频下载软件|视频批量采集工具

便捷操作,高效采集 在快节奏的数字化时代,我们的视频下载软件提供了简单便捷的操作流程,让用户能够高效地采集所需视频内容。用户只需输入关键词并点击开始抓取,系统会自动搜索指定关键词下的抖音视频数据,并将待解析视…

2024年软考考试安排和报名时间出来了!有重大变化!

软考办2024年软考考试安排终于发布了!变化很大!信息系统项目管理师上半年考、系统集成项目管理工程师下半年考。很多科目一年只考一次了! 温馨提示: 1、目前这个文件,软考办官网还未发布,但是陕西软考办官方已经发布了2024年考试安排&…

kafka查看消息两种方式(命令行和软件)+另附发送消息方式

1、命令行方式 ①找到kafka安装文件夹 ②执行命令 #指定offset为指定时间作为消息起始位置 kafka-consumer-groups.sh \ --bootstrap-server 20.2.246.116:9092 \ --group group_1 \ --topic lanxin_qiao \ --reset-offsets \ --to-datetime 2023-07-19T01:00:00.000 \ -exe…

有没有想过找个编程的贴身帮手?一步一步引入编程路上的副驾驶--copilot

辅助编程,或者说智能编程,这个概念不是这两年才提出,但比较成型的产品就在这几年,这里有一款智能编程的软件叫做copilot,从软件的名字我们知道,他貌似定位还蛮准确的,意思是你编程路上的副驾驶&…