传输协议设计与牧村摆动(Makimoto‘s Wave)
有一条活鱼和一条死鱼,你准备怎么做,你会将活鱼红烧或将死鱼清蒸吗?好的食材只需要最简单的烹饪,不好的食材才需要花活儿。
我此前的文字几乎都在阐述一个观点,广域网就是那条死鱼,数据中心则是那条活鱼。做那条死鱼要下重料,而活鱼只需要张嘴吃即可。辣椒,老抽,胡椒看做 CUBIC,BBR,PCC,专门调教广域网的朽木,而在另一边,TTPoE 则是最简单的刺身。
然而事实上,哪怕在现实中,虽然几乎没人拿臭鱼烂虾做刺身,但红烧活鱼的却大有人在,哪个对哪个错是没有意义的,摆弄清楚这些事的内在关系才重要。
前不久 Tesla 刚推出 TTPoE 那会儿,不少人问我它和 TCP BBR 或 QUIC 相比如何,我没有过多回复,而是写了两篇短文。事实上我的意思是,TTPoE 是一道活鱼刺身,而 BBR 是一勺浓油重料,但现实中真有不少人喜欢浓油重料,无论针对什么食材。
总结一个方法论,良好的环境做减法,恶劣环境做加法,大概就是如何设计传输协议的根本方案了。
但干净的方案几乎不存在,被后起重要作用的是 “牧村摆动(Makimoto’s Wave)”,也叫 “牧村定律”。这个定律说的是,半导体产品发展历程总是在 “通用化” 与 “定制化” 之间交替摆动,大概每 10 年波动一次。这种定律的背后是市场和人的周期性波动,所有花活儿均来自其中,没什么太大的奥妙,我做简图如下,随便看看:

另一种理解,将性能功耗比看做 “硬件”,将开发效率看做 “软件” 是高尚的。硬件意味着定制和高效,软件意味着通用可编程,本质上,软件就是拿时间换空间,而按照熵增的说法,能量的本质就是时间,软件的性能能耗比高是内在的。
举一个不严谨但简单的例子,一个携带 32 个加法器的电路计算 32 位加法和一个携带 1 个加法器的电路计算 32 次 1 位加法是等效的,但后者拿时间换空间,花了前者 32 倍的时间,外部时序经历了 32 倍的电平转换,在时间的流逝中也消耗了更多能源,性能低,能耗大。
现在看看在牧村摆动中的网络是如何发展的。
最初,网络通信被 socket 接口抽象成 IPC,TCP 是 inet stream socket,这是软件主宰的时代,诞生了一大批 socket 工人,当 CPU 足够快了就有人嫌网络,于是网卡开始按 10 倍速进击。
从千兆卡说起,这时 CPU 又成了瓶颈,开始有人折腾 TOE,RSS,中断了,诞生了一大批 TCP 以及内核协议栈优化工人,而先前的 socket 工人被认为是不懂网络的。
当更新更快的网卡出现,DPDK(同时还有几个竞争者) 自然就出现了,此时那些内核协议栈工人变成了古人,因为大家都在争先恐后 bypass 掉内核,不管是 DPDK 工人还是 XDP 工人。
虚拟化,SDN,NFV 风潮暂且不表。
IPC 网络模型彻底受到了挑战。在此之前,网络通信是进程的职责,而进程自然归 CPU 调度管理,但当 CPU 被网络通信拖住时,疑问是 “既然是网络通信,为什么不让网卡来做”,至此 RDMA 开始浮出视野,在此之前 DMA 已经解放了拷贝和中断的 CPU 开销,如今就连网络对端的行为也被网卡接管。
定制化网卡开始遍地开花,FPGA,SmartNIC,曾经力压内核协议栈的 DPDK 工人反而成了通用工人。随后的 AI 时代彻底捧起了 RDMA,在此之上或与之并列,新技术新标准新协议也层出不穷,IB(差点死掉),RoCE,RoCEv2,HPCC,SRD,Homa,SRD,TTPoE(这个不在下文贬义行列),… 随之而来的就是掌握这些技术的工人开始统领大小厂子。
最终,网络技术到底是什么?TCP,socket,DPDK,XDP,RDMA,还是上面最后一行那些?或者是这些的大杂烩?答案明显是后者。
所有定制硬件做着做着都会做成通用(可编程)软件,携带着被最普遍应用的定制硬件的影子,所有通用软件最终会被性能需求分化出各种定制硬件,夹杂着通用软件的毛病,这就是牧村摆动本身的最佳阐释。希望设计一个干净的传输协议,本身就是妄想。
但回头看这 30~40 年,上述这些名词术语,均离地不过八百米,它们均局限在主机周围很小的范围内,即主机本身到数据中心的范围。回看广域网,大致 2000 年左右的问题如今仍然还是问题,以文初的类比,海边从 30 年前吃小蟹到现在 100 种刺身,遥远的内地的海鲜 30 年来依然只有带鱼。
设计数据中心的传输协议和设计优化广域网协议是完全不同的路子,有不同的方法论,广域网卷算法,数据中心卷硬件和自研协议(强调硬件实现)。但在更大的时间尺度看,二者又相似。广域网也有牧村摆动主导的技术和职业变革,但慢得多,这并不仅仅是设备更新换代慢的问题,我曾从反馈时延角度建模分析过 SDN controller 在广域网失败的原因。
数据中心是可控的环境,如果扩容,升级交换机,很多协议端花活儿都不需要了,反之如果只是网卡厉害,为了适应恶劣的交换机,还是要在主机端网卡整花活儿,这提升了工人的热情,但对整体无益,然而这就是牧村摆动过程本身必然要经历的中途。正如上周一位经理所说,干嘛要费劲做用户态协议栈,那点收益还不如让业务删除几行代码来的快。
加大于减,这就是人性。
总之,牧村摆动不会停摆,仅针对网络传输协议而言,最近一轮定制化周期开始时的 “只要有就行” 被纷纷进场的对手开始内卷后,必然转向 “只有好才行”,而 “好” 则是万变不离其宗的,它并不藏在性能能耗比或开发效率的巅峰或低谷,而处在经理的心中。
顺着牧村摆动的解释写了一篇文章。我一向相信世界在小范围内是随机的,大尺度下是周期的,摩尔定律,牧村定律,都可以以此建模。小时候经常听到准时而来的叫卖声,卖洗衣膏的,卖酱油醋的,卖粉浆的,卖卫生纸的,爆米花的,卖雪糕的,。。。准时而来,他们并非随机而来,你想让这些卖货的随机而来都不行,因为他们也有自己心里规划的周期,规则和顺序,现在理解了,他们只是每天沿着固定的街道路线行走而已,安阳老城九府十八巷,够他们溜达的,综合起来各个卖家,那就显得五花八门了。
一个人的整个人生就是在解一个傅里叶变换,事实也确实如此。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
传输协议设计与牧村摆动(Makimoto‘s Wave)
有一条活鱼和一条死鱼,你准备怎么做,你会将活鱼红烧或将死鱼清蒸吗?好的食材只需要最简单的烹饪,不好的食材才需要花活儿。 我此前的文字几乎都在阐述一个观点,广域网就是那条死鱼,数据中心则是那条活鱼。…...
JMeter进阶篇
目录 上篇导航: 总目录: 一、逻辑控制器: 1.逻辑控制器和关联: 2.if逻辑控制器: 3.forEach控制器: 4.循环控制器: 二、关联: 1.xpath: 2.正则表达式提取器&…...
LabVIEW编程基础教学(一)--介绍
LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种基于图形化编程的开发环境,专为工程应用、测试、测量、控制系统等设计。与传统的文本编程语言不同,LabVIEW 使用图形化的方式通过“数据流”模型来表示程序逻…...
HVV蓝队基础
免责声明 学习视频来自B 站up主泷羽sec,如涉及侵权马上删除文章。 笔记的只是方便各位师傅学习知识,以下代码、网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 企业网络架构 企业技术和信…...
[运维][Nginx]Nginx学习(1/5)--Nginx基础
Nginx简介 背景介绍 Nginx一个具有高性能的【HTTP】和【反向代理】的【WEB服务器】,同时也是一个【POP3/SMTP/IMAP代理服务器】,是由伊戈尔赛索耶夫(俄罗斯人)使用C语言编写的,Nginx的第一个版本是2004年10月4号发布的0.1.0版本。另外值得一…...
创客节小学组C++模拟题
来源:加码未来2024年深圳罗湖区创客节模拟题(小学组) 第一题 题目描述 给你n个数,找出出现次数超过一半的数。题目保证这样的数一定存在。 输入格式 第一行一个整数n,(n<=1000) 第二行n个整数(<1000000) 输出格式 输出一个整数 样例输入 5 1 2 3 3 3 样例输…...
阿里云ECS服务器使用限制及不允许做的事情
阿里云ECS(Elastic Compute Service)是一种高性能的弹性计算服务,允许用户在云端创建和管理虚拟服务器。尽管ECS提供了强大的功能,但在使用过程中,阿里云有一些限制和不允许的行为。以下是一些主要的使用限制和禁止行为…...
Linux开发讲课49--- Linux 启动过程分析
理解运转良好的系统对于处理不可避免的故障是最好的准备。 启动过程非常简单。内核在单核上以单线程和同步状态启动,似乎可以理解。但内核本身是如何启动的呢?initrd(initial ramdisk) 和引导程序(bootloader)具有哪些功能&#…...
Java-03
目录 算法 1.小美的因子查询 2.小美的密码 3.小美的数组删除 4.小美和大富翁 知识点 InnoDB中的行级锁是怎么实现的? 介绍一下Java中的IO流 讲讲Java的跨平台原理 COUNT(1)与COUNT(*)区别 Redis 为什么要用…...
微积分复习笔记 Calculus Volume 1 - 5.3 The Fundamental Theorem of Calculus
5.3 The Fundamental Theorem of Calculus - Calculus Volume 1 | OpenStax...
c++如何绑定一个类与类内成员的关系
在 C 中,成员函数和成员变量的归属关系(即某个成员属于哪个类)是通过编译器的多种机制和语言特性来实现和管理的。理解这些机制有助于更深入地掌握 C 的面向对象特性、内存管理以及编译过程。以下是 C 如何确定某个成员函数或成员变量属于特定…...
关于解决使用VMWare内的虚拟机无法识别USB问题小结
目录 前言 0. 查看是不是没有开启USB3.0的支持 1. 检查一下是否禁用了VMWare USB服务 2. 无奈之举 前言 笔者今天帮助一位同志解决了VMWare内的虚拟机不识别挂载设备的办法。这里对笔者使用的排查手段做一个总结。 0. 查看是不是没有开启USB3.0的支持 我们的第一件事情就…...
抢抓5G机遇,AORO A23防爆手机如何直击园区巡检挑战?
矗立在沙漠高原的铁塔,遍布都市的电线网络,远离郊区的海港油田……大型园区对智能巡检提出了新的需求,选择一款智能且高效的巡检设备,以确保园区高效运营,成为了管理者关注的重点。在调研多个智慧园区后,小…...
索引【MySQL】
文章目录 聚簇索引 VS 非聚簇索引索引MySQL与磁盘交互的基本单位主键索引索引操作唯一索引的创建普通索引的创建复合索引 索引创建原则 聚簇索引 VS 非聚簇索引 MyISAM存储引擎 - 主键索引结构 MyISAM存储引擎同样采用B树作为索引的基本数据结构 与InnoDB存储引擎的B树不同的…...
【Allure】mac下环境配置
安装 1.Mac 可以使用 brew 安装 allure,安装命令如下 brew install allure 2.与 pytest 结合需要安装 allure-pytest 插件: pip install allure-pytest3.查看allure版本 allure --version...
Android 开启混淆R8编译问题处理
Android R8是一个代码混淆和压缩工具,可以将应用程序的大小和安全性优化。它引入了一些新功能,如成员内省、混淆指针、类内省等。 但R8使用起来一直不友好,因为自从使用R8之后编译问题不断。主要还是和混淆相关,经常报错ÿ…...
Rust:GUI 开源框架
Rust的GUI代码包有多个选择,每个都有其独特的特点和优势。以下是一些比较受欢迎的Rust GUI库,以及它们的主要特点和适用场景: KAS GUI: 特点:基于Rust语言开发的状态化图形用户界面(GUI)框架&am…...
移远通信亮相骁龙AI PC生态科技日,以领先的5G及Wi-Fi产品革新PC用户体验
PC作为人们学习、办公、娱乐的重要工具,已经深度融入我们的工作和生活。随着物联网技术的快速发展,以及人们对PC性能要求的逐步提高,AI PC成为了行业发展的重要趋势。 11月7-8日,骁龙AI PC生态科技日在深圳举办。作为高通骁龙的重…...
力扣每日一题 3258. 统计满足 K 约束的子字符串数量 I
给你一个 二进制 字符串 s 和一个整数 k。 如果一个 二进制字符串 满足以下任一条件,则认为该字符串满足 k 约束: 字符串中 0 的数量最多为 k。字符串中 1 的数量最多为 k。 返回一个整数,表示 s 的所有满足 k 约束 的子字符串的数量。 如…...
SQL面试题——奔驰面试题
SQL面试题——奔驰SQL面试题 我们的表大致如下 CREATE TABLE signal_log( vin STRING COMMENTvehicle frame id, signal_name STRING COMMENTfunction name, signal_value STRING COMMENT signal value , ts BIGINT COMMENTevent timestamp, dt STRING COMMENTformat yyyy-mm…...
告别命令行:5分钟掌握ffmpegGUI视频处理新方式
告别命令行:5分钟掌握ffmpegGUI视频处理新方式 【免费下载链接】ffmpegGUI ffmpeg GUI 项目地址: https://gitcode.com/gh_mirrors/ff/ffmpegGUI ffmpegGUI是一款创新的跨平台视频处理工具,它将强大的FFmpeg命令行功能转化为直观的图形界面操作&a…...
3步快速上手!终极缠论量化工具:基于TradingView本地SDK的几何交易可视化完整指南
3步快速上手!终极缠论量化工具:基于TradingView本地SDK的几何交易可视化完整指南 【免费下载链接】chanvis 基于TradingView本地SDK的可视化前后端代码,适用于缠论量化研究,和其他的基于几何交易的量化研究。 缠论量化 摩尔缠论 缠…...
【米家IoT开发】巧用Charles抓包,高效定位与调试网络接口
1. 为什么Charles是米家IoT开发的调试神器 当你开发米家扩展程序时,最头疼的莫过于接口返回异常数据,或者请求莫名其妙失败。这时候如果只能靠猜问题出在哪里,那简直就是在黑暗中摸索。我刚开始做米家IoT开发时,就经常被这种问题困…...
零基础入门gstack:借助快马AI生成你的第一个可运行React+TypeScript项目
作为一名刚接触前端开发的新手,第一次听说gstack(ViteReactTypeScript组合)时,我完全不知道从何入手。直到发现了InsCode(快马)平台,才真正体会到"零配置"开发是什么感觉。下面记录我的学习过程,…...
Hunyuan-MT-7B部署教程:Pixel Language Portal与Prometheus监控系统集成
Hunyuan-MT-7B部署教程:Pixel Language Portal与Prometheus监控系统集成 1. 项目概述 Pixel Language Portal是一款基于腾讯Hunyuan-MT-7B大模型构建的创新翻译工具,将传统翻译体验重构为16-bit像素冒险风格。本教程将指导您完成从基础部署到与Prometh…...
前端测试的学习阶段,由基础到进阶的过程认识.....
前言:突然想起刚入行的学习感悟,一个知识点不懂的背后,是整个知识体系的欠缺, 那会从后端转入前端(非科班)有时候一个报错不知道从何找起,一、单元测试 【已经案例和知识相结合,可看…...
Qt5.14.2与VS2019整合开发避坑指南(从安装到第一个GUI项目)
Qt5.14.2与VS2019整合开发避坑指南(从安装到第一个GUI项目) 在Windows平台进行Qt开发时,Visual Studio作为强大的IDE环境,与Qt框架的结合能够显著提升开发效率。本文将深入剖析Qt5.14.2与VS2019整合过程中的关键环节,从…...
告别重复造轮子:用快马平台高效生成ibbot开发脚手架与核心模块
今天想和大家分享一个提升ibbot开发效率的实用技巧。作为一个经常需要开发对话机器人的程序员,我发现每次从零开始搭建项目结构、编写基础模块特别耗时。最近尝试用InsCode(快马)平台生成项目脚手架,效果出乎意料的好。 项目结构自动生成 平台能根据自然…...
2GB内存Linux系统运行Django或Flask项目会不会内存不足?
在 2GB 内存的 Linux 系统上运行 Django 或 Flask 项目,完全可行,但需要谨慎配置和监控。能否稳定运行取决于你的应用复杂度、并发量以及部署架构。 原文地址:https://blog.zestb.com/article/129805.html 以下是具体的分析和优化建议&…...
矩阵理论进阶:内积空间与正交变换的深度解析
1. 内积空间:从几何直觉到严格定义 第一次接触内积空间时,很多人会被各种抽象定义搞得晕头转向。其实我们可以从最熟悉的二维平面开始理解——当你计算两个向量的点积时,本质上是在测量它们的"相似程度"。这种几何直觉正是内积空间…...
