当前位置: 首页 > news >正文

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依赖&#xff0c;包含RabbitMQ--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency> 发送消息 注入RabbitTemplate Autowired RabbitT…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)

前景提要 整个“方案再探”篇 围绕着如何将项目附件文档中Part 1 部分中给出的零散问题讨论整理、重组为一个结构化的设计文档。为此提出了讨论题目&#xff1a; 特定于领域的模板--一个三套接的hoc结构 它是本项目actors 的剧本原型。其地位&#xff1a; 祖传代码脚本模板…...

WebRtc02:WebRtc架构、目录结构、运行机制

整体架构 WebRtc主要分为三层&#xff1a; CAPI层&#xff1a;外层调用Session管理核心层&#xff1a;包括视频引擎、音频引擎、网络传输 可由使用者重写视频引擎&#xff1a;编解码器、视频缓存、视频增强音频引擎&#xff1a;编解码器、音频缓存、回音消除、降噪传输&#x…...

数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)

查找&#xff08;检索&#xff09;&#xff1a; 定义&#xff1a;从给定的数据中找到对应的K 1&#xff0c;顺序查找&#xff1a; O(n)的从前向后的遍历 2&#xff0c;对半查找&#xff0c;要求有序 从中间开始查找&#xff0c;每次检查中间的是否正确&#xff0c;不正确就…...

el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割

需求&#xff1a;一个输入框字段需要支持多次输入&#xff0c;最后传输给后台的字段值以逗号分割 解决方案&#xff1a;结合了el-tag组件的动态编辑标签 那块的代码 //子组件 <template><div class"input-multiple-box" idinputMultipleBox><div>…...

C# 枚举格式字符串

总目录 前言 当前文章为 C# 中的格式设置(格式化字符串) 大全 中的一个小章节。 一、概述 1. 基本信息 可以使用 Enum.ToString 方法&#xff0c;新建表示枚举成员的数字值、十六进制值或字符串值的字符串对象。枚举格式说明符不区分大小写。 二、自定义数字格式说明符详解…...

【51单片机-零基础chapter1】

安装软件(配套的有,不多赘述) 1.管理员身份运行keil和破解软件kegen 将CID代码复制粘贴到 一定要管理员方式,不然会error 插入板子 我的电脑,管理 1.如果是拯救者,查看端口,如果没有则显示隐藏 2.苹果不知道,好像不可以 3.其他电脑在"其他设备找" (注:本人在校已…...

记录:导出功能:接收文件流数据进行导出(vue3)

请求接口&#xff1a;一定要加responseType: blob 后端返回数据&#xff1a; api.js export function export() {return request({url: dev/api/export,method: get,responseType: blob,//一定要加}) } vue&#xff1a; import {export} from /api// 导出 const exportTab…...

基于Spring Boot + Vue3实现的在线汽车保养维修预约管理系统源码+文档

前言 基于Spring Boot Vue3实现的在线汽车保养维修预约管理系统是一种前后端分离架构的应用&#xff0c;它结合了Java后端开发框架Spring Boot和现代JavaScript前端框架Vue.js 3.0的优势。这样的系统可以为汽车服务站提供一个高效的平台来管理客户的预约请求 技术选型 系统…...

PHP框架+gatewayworker实现在线1对1聊天--接收消息(7)

文章目录 接收消息的原理接收消息JavaScript代码 接收消息的原理 接收消息&#xff0c;就是接受服务器转发的客户端消息。并不需要单独创建函数&#xff0c;因为 ws.onmessage会自动接收消息。我们需要在这个函数里进行处理。因为初始化的时候&#xff0c;已经处理的init类型的…...

18.1、网络安全策略分类 流程 内容

目录 网络安全测评概况网络安全测评类型—基于测评目标分类网络安全测评类型—基于实施方式分类网络安全测评类型—基于测评对象保密性分类网络安全等级保护测评内容网络安全测评流程与内容 网络安全测评概况 网络安全测评&#xff0c;它是指参照一定的标准规范要求&#xff0…...

深入理解连接池:从数据库到HTTP的优化之道

在现代应用开发中&#xff0c;高效的资源管理是关键&#xff0c;其中连接池&#xff08;Connection Pool&#xff09;技术起到了至关重要的作用。本文将带你深入了解连接池的概念及其在数据库和HTTP通信中的应用&#xff0c;结合 JDBC 与 Druid 的关系&#xff0c;以及 HttpURL…...

【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】

作者简介&#xff1a;✌CSDN新星计划导师、Java领域优质创作者、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流。✌ 主要内容&#xff1a;&#x1f31f;Java项目、Python项目、前端项目、PHP、ASP.NET、人工智能…...

关于使用vue-cropperjs上传一张图后,再次上传时,裁剪的图片不更新的问题

不更新的原因 它与cropperjs不太一样&#xff0c;vue-cropperjs不是一个实例&#xff0c;当页面首次刷新时它就已经创建&#xff0c;即使后面更改了它的某些数据也不会改变&#xff0c;因为浏览器会对dom组件进行缓存。 解决办法 可以使用v-if来控制它的显示和隐藏&#xff…...

学习threejs,导入VTK格式的模型

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.VTKLoader VTK模型加…...

大麦抢票科技狠活

仅供学习参考&#xff0c;切勿再令您所爱的人耗费高昂的价格去购置黄牛票 ⚠️核心内容参考: 据悉&#xff0c;于购票环节&#xff0c;大麦凭借恶意流量清洗技术&#xff0c;于网络层实时甄别并阻拦凭借自动化手段发起下单请求的流量&#xff0c;强化对刷票脚本、刷票软件以及…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

GitHub 趋势日报 (2025年06月08日)

&#x1f4ca; 由 TrendForge 系统生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日报中的项目描述已自动翻译为中文 &#x1f4c8; 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...

【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具

第2章 虚拟机性能监控&#xff0c;故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令&#xff1a;jps [options] [hostid] 功能&#xff1a;本地虚拟机进程显示进程ID&#xff08;与ps相同&#xff09;&#xff0c;可同时显示主类&#x…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

深度学习习题2

1.如果增加神经网络的宽度&#xff0c;精确度会增加到一个特定阈值后&#xff0c;便开始降低。造成这一现象的可能原因是什么&#xff1f; A、即使增加卷积核的数量&#xff0c;只有少部分的核会被用作预测 B、当卷积核数量增加时&#xff0c;神经网络的预测能力会降低 C、当卷…...

安卓基础(aar)

重新设置java21的环境&#xff0c;临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的&#xff1a; MyApp/ ├── app/ …...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...