当前位置: 首页 > 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,其次才考虑传输语义,带宽不是问题(一条路拥塞,其余链路空闲比比皆是),如何用带宽才是。

浙江温州皮鞋湿,下雨进水不会胖。

http://www.lryc.cn/news/516212.html

相关文章:

  • React最小状态管理Jotai
  • 计算机网络 —— 网络编程(TCP)
  • 字玩FontPlayer开发笔记4 性能优化 首屏加载时间优化
  • RabbitMQ案例
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之13 方案再探之4:特定于领域的模板 之 div模型(完整版)
  • WebRtc02:WebRtc架构、目录结构、运行机制
  • 数据结构复习 (顺序查找,对半查找,斐波那契查找,插值查找,分块查找)
  • el-input输入框需要支持多输入,最后传输给后台的字段值以逗号分割
  • C# 枚举格式字符串
  • 【51单片机-零基础chapter1】
  • 记录:导出功能:接收文件流数据进行导出(vue3)
  • 基于Spring Boot + Vue3实现的在线汽车保养维修预约管理系统源码+文档
  • PHP框架+gatewayworker实现在线1对1聊天--接收消息(7)
  • 18.1、网络安全策略分类 流程 内容
  • 深入理解连接池:从数据库到HTTP的优化之道
  • 【2025最新计算机毕业设计】基于SpringBoot+Vue智慧养老医护系统(高质量源码,提供文档,免费部署到本地)【提供源码+答辩PPT+文档+项目部署】
  • 关于使用vue-cropperjs上传一张图后,再次上传时,裁剪的图片不更新的问题
  • 学习threejs,导入VTK格式的模型
  • 大麦抢票科技狠活
  • PostgreSQL 表达式
  • WPF区域导航+导航参数使用+路由守卫+导航日志
  • Springboot启动报错:Failed to start bean ‘documentationPluginsBootstrapper‘
  • qt-C++笔记之动画框架(Qt Animation Framework)入门
  • C++26 函数契约(Contract)概览
  • Flink CDC 自定义函数处理 SQLServer XML类型数据 映射 doris json字段方案
  • F.interpolate函数
  • 华为交换机---自动备份配置到指定ftp/sftp服务器
  • nginx学习之路-nginx配置https服务器
  • UCAS 24秋网络认证技术 CH10 SSL 复习
  • 【linux内核分析-存储】EXT4源码分析之“文件删除”原理【七万字超长合并版】(源码+关键细节分析)