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

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

自然语言处理——循环神经网络

自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元&#xff08;GRU&#xff09;长短期记忆神经网络&#xff08;LSTM&#xff09…...

如何在最短时间内提升打ctf(web)的水平?

刚刚刷完2遍 bugku 的 web 题&#xff0c;前来答题。 每个人对刷题理解是不同&#xff0c;有的人是看了writeup就等于刷了&#xff0c;有的人是收藏了writeup就等于刷了&#xff0c;有的人是跟着writeup做了一遍就等于刷了&#xff0c;还有的人是独立思考做了一遍就等于刷了。…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

【 java 虚拟机知识 第一篇 】

目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...