当前位置: 首页 > 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;强化对刷票脚本、刷票软件以及…...

FastAPI 教程:从入门到实践

FastAPI 是一个现代、快速&#xff08;高性能&#xff09;的 Web 框架&#xff0c;用于构建 API&#xff0c;支持 Python 3.6。它基于标准 Python 类型提示&#xff0c;易于学习且功能强大。以下是一个完整的 FastAPI 入门教程&#xff0c;涵盖从环境搭建到创建并运行一个简单的…...

CentOS下的分布式内存计算Spark环境部署

一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架&#xff0c;相比 MapReduce 具有以下核心优势&#xff1a; 内存计算&#xff1a;数据可常驻内存&#xff0c;迭代计算性能提升 10-100 倍&#xff08;文档段落&#xff1a;3-79…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行

项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战&#xff0c;克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

ubuntu22.04 安装docker 和docker-compose

首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...

FTXUI::Dom 模块

DOM 模块定义了分层的 FTXUI::Element 树&#xff0c;可用于构建复杂的终端界面&#xff0c;支持响应终端尺寸变化。 namespace ftxui {...// 定义文档 定义布局盒子 Element document vbox({// 设置文本 设置加粗 设置文本颜色text("The window") | bold | color(…...

大模型真的像人一样“思考”和“理解”吗?​

Yann LeCun 新研究的核心探讨&#xff1a;大语言模型&#xff08;LLM&#xff09;的“理解”和“思考”方式与人类认知的根本差异。 核心问题&#xff1a;大模型真的像人一样“思考”和“理解”吗&#xff1f; 人类的思考方式&#xff1a; 你的大脑是个超级整理师。面对海量信…...

Spring Boot SQL数据库功能详解

Spring Boot自动配置与数据源管理 数据源自动配置机制 当在Spring Boot项目中添加数据库驱动依赖&#xff08;如org.postgresql:postgresql&#xff09;后&#xff0c;应用启动时自动配置系统会尝试创建DataSource实现。开发者只需提供基础连接信息&#xff1a; 数据库URL格…...

TI德州仪器TPS3103K33DBVR低功耗电压监控器IC电源管理芯片详细解析

1. 基本介绍 TPS3103K33DBVR 是 德州仪器&#xff08;Texas Instruments, TI&#xff09; 推出的一款 低功耗电压监控器&#xff08;Supervisor IC&#xff09;&#xff0c;属于 电源管理芯片&#xff08;PMIC&#xff09; 类别&#xff0c;主要用于 系统复位和电压监测。 2. …...