TCP 演进之路:软硬件跷跷板与新征程
今天依旧是与 TCP 相关的一个短评。
先看软硬件间的胶着。晶体管诞生以来,硬件一直在突飞猛进发展,后来这个事被摩尔定律正则化,人们开始可以预测未来,但即便如此,软件依然跟不上来,不过几年,老的软件架构就成了新硬件的掣肘。
再看协议的实现基础。早期的 CPU 是一个串行指令执行机器,C 语言成了对它的最经典描述。总有人讨厌指针(特别是谭式指针),其实指针的背后存储执行的架构,总需要有个地址来索引内存。
最后看协议理论基础。分组交换网和分时复用操作系统之间的关系分不开,它们都旨在提供一个连续的假象,它们共同构建了统计复用共享资源的理论基础,从分时系统控制的主机到分组交换控制的网络。
在这背景下,若想将一些字节从本地传输到远端主机,结构决定行为,模拟 CPU 的行为是最自然的,协议自然是流式的。一个 1970 年代的 multipath spray 协议是难以想象的,至少 CPU 就不允许并行操作。
于是序列号管理映射到地址管理,TCP 传输一个 1MB 的文件和 memcpy(dst, src, 1MB) 语义一致,如果将序列号一一映射进内存地址空间,便是 RDMA,冥冥中似乎早有定数。
但 Socket API 将这可能性封死了,将传输原语彻底绑死在单核 CPU 架构上,并影响了 RFC793。要进行一次传输,必须先创建一个 socket 句柄,随后只能在该句柄上操作而不是直接操作序列号:
sd = socket(...);
...
write(sd, ...);
recv(sd, ...);
序列号管理被隐藏了,更别提序列号和内存地址之间的映射管理,这天然与并行处理相悖。比比看下面的:
CPU-1:
Rmemcpy(Raddr, src, 1KB)
CPU-2:
Rmemcpy(Raddr + 1KB, src + 1KB, 1KB)
说 Socket API 直接阻碍了并行传输协议的发展一点也不为过。 但 Socket API 本身就诞生在一个串行架构时代,以分时 IPC 为目的,这是时代局限,也是日后 “软件跟不上硬件” 的经典案例。
1990 年代之前这没有任何问题,就连最初的 Cisco 路由器都只类似于一台 2010 年代初安装了 Linux 内核的单 CPU 软路由,这种局面一直持续到 D-Link,TP-Link 进入千家万户时,事实上直到今天,大多数家用路由器依然如此。但核心网络在 2000 年后就开始完全不同。
当硬件全面步入并行架构后,多核处理器,阿斯克,FPGA 等非常善于逐包 spray,负载均衡,ECMP,这种事对并行硬件而言轻松而高效,但始发于主机的 socket 是流式的,socket 句柄无法充分利用主机和网络的并行处理能力,同时对这种能力抵触,主机或网络对属于同一条数据流的 packet 做 spray 是要出问题的,比如 TCP 会乱序从而导致无效重传而恶化拥塞,即使并行能力再强的硬件也不得不采用更复杂的技术维护 “数据流”,最简单的莫过于五元组 hash,即使这样,也类似于为马车加装蒸汽机,在电车后拉柴油发电机。
看看现在的 TCP 传输,核心交换机的并行能力上不来,主机的多核能力无法发挥作用,由于按流管理拥塞,大象流,老鼠流对链路带宽抢占的作用效果完全不同,这对拥塞控制更是带来了挑战。
现在我们有 MPTCP,但它怪怪的,本质上它并不是真正的 multipath,只是将 TCP 流分成了 flowlet(subflow),一个大 TCP 变成了几个小 TCP 而已,TCP 面临的问题,在更低的 MPTCP 层面,subflow 依然还是要面对。不是没法重新设计,而是为了兼容 socket API,根本无法 multipth。
试想一种完全的 mutipath spray 传输协议,向前泛洪,收于目标主机,这将对传统 TCP/IP 架构带来巨大改变,IP 路由不再 SPF,接入带宽等于(甚至大于)汇聚甚至核心带宽,拥塞消除,这将是多么巨大的皮鞋:
- 多路径 spray,充分利用可能的(不太远,不最优)每一条路径传输(包括重传)数据;
- 主机的流量被多条路径分担,设主机数为 m,网络链路数为 n,核心能力为 n,接入能力为 n;
- 每个主机的流量被核心同等分担,拥塞被同等分担,链路利用率均匀化,拥塞消除更容易。
广域网迭代慢,整不了这些花活儿,但数据中心能啊。
为什么没有成为这样,与流式传输和最短路径这两个 TCP/IP 的早期核心概念分不开,因为 1970~1980 年代只能这样。随着硬件的快速发展,软件需要更新,但向前兼容阻碍了更新。
进入云计算时代风水轮流转。如弹性需求,边缘计算,软件理念逐渐开始超前,SDN,SDS,万物皆可 SD,促进了硬件的革新。每当一些新的理念在 Linux 平台被 POC,总有好几股力量将它硬件化,不管 Homa,SRD,Falcon 还是最新的 TTPoE,它们先进的卖点都是硬件实现,各类定制硬件实现了定制协议,开启了软硬一体化。总有一个应用最广泛的被标准化,通用化,成为新的标准,然后诸如此类反复,这叫牧村摆动。
如果你在设计一个新传输协议,首先要摆脱 Socket API,其次才考虑传输语义,带宽不是问题(一条路拥塞,其余链路空闲比比皆是),如何用带宽才是。
浙江温州皮鞋湿,下雨进水不会胖。
相关文章:
TCP 演进之路:软硬件跷跷板与新征程
今天依旧是与 TCP 相关的一个短评。 先看软硬件间的胶着。晶体管诞生以来,硬件一直在突飞猛进发展,后来这个事被摩尔定律正则化,人们开始可以预测未来,但即便如此,软件依然跟不上来,不过几年,老…...
React最小状态管理Jotai
Jotai 状态管理 1. 简介 Jotai 是一个基于原子 atom 概念的 React 状态管理库,它提供了简单且灵活的方式来管理应用状态, 而且非常轻量, 大厂用的非常多。 JotaiRedux适合单个页面,多次用到的属性适合全局公共属性超级轻量(与use…...
计算机网络 —— 网络编程(TCP)
计算机网络 —— 网络编程(TCP) TCP和UDP的区别TCP (Transmission Control Protocol)UDP (User Datagram Protocol) 前期准备listen (服务端)函数原型返回值使用示例注意事项 accpect (服务端)函数原型返回…...
字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化
字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化 字玩FontPlayer是笔者开源的一款字体设计工具,使用Vue3 ElementUI开发,源代码: github: https://github.com/HiToysMaker/fontplayer gitee: https://gitee.com/toysmaker/fontplayer …...
RabbitMQ案例
1. 导入依赖 <!--AMQP依赖,包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 发送消息 注入RabbitTemplate Autowired RabbitT…...
智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)
前景提要 整个“方案再探”篇 围绕着如何将项目附件文档中Part 1 部分中给出的零散问题讨论整理、重组为一个结构化的设计文档。为此提出了讨论题目: 特定于领域的模板--一个三套接的hoc结构 它是本项目actors 的剧本原型。其地位: 祖传代码脚本模板…...
WebRtc02:WebRtc架构、目录结构、运行机制
整体架构 WebRtc主要分为三层: CAPI层:外层调用Session管理核心层:包括视频引擎、音频引擎、网络传输 可由使用者重写视频引擎:编解码器、视频缓存、视频增强音频引擎:编解码器、音频缓存、回音消除、降噪传输&#x…...
数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
查找(检索): 定义:从给定的数据中找到对应的K 1,顺序查找: O(n)的从前向后的遍历 2,对半查找,要求有序 从中间开始查找,每次检查中间的是否正确,不正确就…...
el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割
需求:一个输入框字段需要支持多次输入,最后传输给后台的字段值以逗号分割 解决方案:结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…...
C# 枚举格式字符串
总目录 前言 当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。 一、概述 1. 基本信息 可以使用 Enum.ToString 方法,新建表示枚举成员的数字值、十六进制值或字符串值的字符串对象。枚举格式说明符不区分大小写。 二、自定义数字格式说明符详解…...
【51单片机-零基础chapter1】
安装软件(配套的有,不多赘述) 1.管理员身份运行keil和破解软件kegen 将CID代码复制粘贴到 一定要管理员方式,不然会error 插入板子 我的电脑,管理 1.如果是拯救者,查看端口,如果没有则显示隐藏 2.苹果不知道,好像不可以 3.其他电脑在"其他设备找" (注:本人在校已…...
记录:导出功能:接收文件流数据进行导出(vue3)
请求接口:一定要加responseType: blob 后端返回数据: api.js export function export() {return request({url: dev/api/export,method: get,responseType: blob,//一定要加}) } vue: import {export} from /api// 导出 const exportTab…...
基于Spring Boot + Vue3实现的在线汽车保养维修预约管理系统源码+文档
前言 基于Spring Boot Vue3实现的在线汽车保养维修预约管理系统是一种前后端分离架构的应用,它结合了Java后端开发框架Spring Boot和现代JavaScript前端框架Vue.js 3.0的优势。这样的系统可以为汽车服务站提供一个高效的平台来管理客户的预约请求 技术选型 系统…...
PHP框架+gatewayworker实现在线1对1聊天--接收消息(7)
文章目录 接收消息的原理接收消息JavaScript代码 接收消息的原理 接收消息,就是接受服务器转发的客户端消息。并不需要单独创建函数,因为 ws.onmessage会自动接收消息。我们需要在这个函数里进行处理。因为初始化的时候,已经处理的init类型的…...
18.1、网络安全策略分类 流程 内容
目录 网络安全测评概况网络安全测评类型—基于测评目标分类网络安全测评类型—基于实施方式分类网络安全测评类型—基于测评对象保密性分类网络安全等级保护测评内容网络安全测评流程与内容 网络安全测评概况 网络安全测评,它是指参照一定的标准规范要求࿰…...
深入理解连接池:从数据库到HTTP的优化之道
在现代应用开发中,高效的资源管理是关键,其中连接池(Connection Pool)技术起到了至关重要的作用。本文将带你深入了解连接池的概念及其在数据库和HTTP通信中的应用,结合 JDBC 与 Druid 的关系,以及 HttpURL…...
【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
作者简介:✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容:🌟Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...
关于使用vue-cropperjs上传一张图后,再次上传时,裁剪的图片不更新的问题
不更新的原因 它与cropperjs不太一样,vue-cropperjs不是一个实例,当页面首次刷新时它就已经创建,即使后面更改了它的某些数据也不会改变,因为浏览器会对dom组件进行缓存。 解决办法 可以使用v-if来控制它的显示和隐藏ÿ…...
学习threejs,导入VTK格式的模型
👨⚕️ 主页: gis分享者 👨⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨⚕️ 收录于专栏:threejs gis工程师 文章目录 一、🍀前言1.1 ☘️THREE.VTKLoader VTK模型加…...
大麦抢票科技狠活
仅供学习参考,切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉,于购票环节,大麦凭借恶意流量清洗技术,于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量,强化对刷票脚本、刷票软件以及…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
ubuntu搭建nfs服务centos挂载访问
在Ubuntu上设置NFS服务器 在Ubuntu上,你可以使用apt包管理器来安装NFS服务器。打开终端并运行: sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享,例如/shared: sudo mkdir /shared sud…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
PL0语法,分析器实现!
简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...
C++使用 new 来创建动态数组
问题: 不能使用变量定义数组大小 原因: 这是因为数组在内存中是连续存储的,编译器需要在编译阶段就确定数组的大小,以便正确地分配内存空间。如果允许使用变量来定义数组的大小,那么编译器就无法在编译时确定数组的大…...
