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

TCP 的文化内涵

从历史和文化内涵的视角看 TCP 协议的优势和局限,这些都刻在基因里。节约和经济获得向下兼容,但这也意味着它没有浪费带宽的本意,任何相左的优化策略终将遇到无法解决的困难,大致就这样,这为设计新协议提了意见,别抄 TCP,否则就容忍继承它的一切。

最近看了一份考古文献,来自范雅各布森(VJ):The original Van Jacobson memo,它讲的是一个正常流优化的故事,即坊间著名的 “30 instruction TCP receive”。

结合相关 RFC 和实现,讨论一下 TCP 的文化内涵。

如果过度关注 TCP 性能,会发现这实际上是与 TCP 的核心思想相违背的,而 TCP 核心思想能用两个字总结:“节约” 或 “经济”。

RTO 被认为是个兜底策略,总是被各种优化试图绕开,这是从快速重传(rfc1072,VJ88)开始的,这些优化逐渐模糊并偏离了 TCP 的内涵,给人 “优化可以一直持续下去” 的错觉,现在我们很清楚,很多困难根本无法解决。

VJ 开启了 TCP 优化,但这种优化风格却最终终止了优化,从 RTO 开始,结束于无解的 rate-based cc,大致我们可以看清这个过程。

TCP 作为一个端到端协议,经过多跳收到确认所需时间的概率密度函数图像随着距离的增加越发矮胖,这意味着 RTT 预测非常困难,这是固有的。举例说明,去阳台拿个东西,超过 10 秒就会被催,去 500 米外买东西,20 分钟到 30 分钟都是允许的,因为过路口,排队结账都不可预期,去 30 公里以外上班,1 小时到 2 小时之间都合理。

RTO 最终被确定为:
R T O = S R T T + γ ⋅ R T T V A R RTO=SRTT+\gamma\cdot RTTVAR RTO=SRTT+γRTTVAR

其中:

R T T V A R = β ⋅ R T T V A R + ( 1 − β ) ⋅ ∣ S R T T − R ∣ RTTVAR=\beta\cdot RTTVAR+(1-\beta)\cdot|SRTT-R| RTTVAR=βRTTVAR+(1β)SRTTR
S R T T = α ⋅ S R T T + ( 1 − α ) ⋅ R SRTT=\alpha\cdot SRTT+(1-\alpha)\cdot R SRTT=αSRTT+(1α)R

VJ 的著名参数 α = 7 8 , β = 3 4 , γ = 4 \alpha=\dfrac{7}{8},\beta=\dfrac{3}{4},\gamma=4 α=87,β=43,γ=4 多少有些随意,“调得一手好参数” 并不能被人信服,但 “容易计算” 似乎是一个更好的理由,仅用简单的移位,加减就能快速计算正体现了节约和经济,这与文初的引用连接的思想完全一致,这就是 VJ-Style。

粗看起来,节约似乎和优化在结果看来都是 “速度更快”,但也仅仅是结果一致。“更快” 只是节约的顺便,而不是它的目标。这个文化内涵让 TCP 可运行在所有设备上,就像 Linux 和猫科动物,适应所有环境,向下兼容的高尚正由此文化内涵体现,向下兼容确实好。

节约和经济决定了 TCP 的保守。

TCP 尽量少处理异常,因为异常处理需要比正常流执行更多的指令,这意味着节约和经济的反面。如文初链接所体现,要让正常流变得普遍,就要让异常不发生,这决定了传输策略的保守,够用但不逞强。一个具体的例子就是 “重传期间不更新 SRTT”,我前面专门说过这个遗憾源自 TCP 最初的内核,就是上面这段话的意思。同时这也决定了测量 TCP 的 RTT 真的很难,即便如今已经为其添加了那么多 feature,依然摆脱不了这个难题。

另一方面,对指令的节约为我们设计新传输协议也指明了方向,空间换时间,设计更大的序列号空间,避免回绕问题,剪除 PAWS,设计更大滑动窗口空间,剪除 WSCALE,设计更大的端口号空间,剪除端口分配的把戏。

再看看这种文化内涵的背景,摩尔定律,吉尔德定律的曲线即便已经弯折,通信速度的提升仍然快于计算速度的提升,为计算速度而不是带宽来做优化是划算的。软件开发中有一个类似的例子,不要优化代码,而要等待更新的硬件。

在这种背景中孕育的文化的影响下,TCP 不会故意注入更多数据到网络以获得更大的吞吐,因为这种为吞吐而进行的赌博需要更多的异常处理来兜底赌输的情景,这与节约和经济的文化内涵不符。这也是近些年各种为带宽而做优化的算法效果普遍不好的原因,因为这与 TCP 的内核相左,于是人们开始纷纷研发新协议。

让我们再看看现实,马上就会明白为什么 TCP 不再合时宜,也就知道新协议应该怎么做。

网络带宽越来越大,虽然从计算的视角看依然要节约,但带宽却是可是浪费的,于是 TCP 在 2010 年代遭遇带宽利用率不足的问题也就是不足为奇了。我们看一下 VJ-Style 的 loss-based 拥塞控制模型,设 B 为吞吐带宽,p 为容忍丢包率, B = α ⋅ p β B=\alpha\cdot p^{\beta} B=αpβ,这个公式对 p 要求过高了,要想获得更大吞吐,p 必须足够低,低到超过介质的传输误码率极限。

这意味着若要适配高速网络,这个模型必须被废弃,BBR 只解决了理论问题,因为互联网规模已经足够庞大,全网如何平滑切换到一个仅仅吞吐较高但尚未论证稳定性和公平性的算法,风险何其大。

在尚未有能力切换到一个 “完备的下一代协议” 之前,来看 TCP 的解法会存在哪些问题,并给出新协议的建议。

随着网络越加长肥,TCP 反馈慢的代价越大,如果网络过长,拥塞信号至少 1 个 RTT 的反馈时间就显得很慢,而如果网络同时又过肥,这 1 个 RTT 的时间段中 sender 会注入非常大量的数据到网络,从而加重拥塞。CDN 的部署缓解了这个问题,但远未解决。

虽 CDN 已大量部署,但静态资源的需求逐渐减少,随着直播流量占比增加,传统远距离高吞吐认知中的长肥管道拥塞问题会越来越严重。

在本质上,避免反馈的协议才是正确解法,receiver 主导的拥塞控制或许要胜过 sender 依赖的确认反馈,但如何让 sender 对拥塞快速反应,就依赖层间协作了。

总之,不光 TCP,连同整个 TCP/IP 协议族都不太适应越来越高速的网络,和本文前面说的节约的文化内涵一致,这也是整个 TCP/IP-based 互联网的文化内涵,而它源自旨在抵抗核打击的 DARPA。

分组交换带来的收益一定需要付出成本来交换,成本之一就是性能。

so?是层间解耦与高速网络不适应,那耦合它们呢?很难。

幸运的是,这条路在数据中心完全可以走通(infiniband? roce?),总之,网络越往高速发展,就越不可抗拒地将设计推回到面向连接的电路交换。

范雅各布森的 style 就是 TCP 的文化精髓,谨慎,保守,精细。如果你问 srtt 的 α 为什么是 1/8,rto 的 β 为啥是 4,真是调得一手好参数吗,非也!因为 2 的次幂容易算啊,这不但迎合了低端机器,也迎合了 Linux 内核不支持浮点数,顺便和统计概率吻合而已,只有 1% 的概率超过 4 确定的平均方差边界,道出了统计复用动力学的本质。在遥远的 1980 年代,为计算速度而不是带宽优化,已经开始成了信条,最终成了文化。

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

相关文章:

TCP 的文化内涵

从历史和文化内涵的视角看 TCP 协议的优势和局限,这些都刻在基因里。节约和经济获得向下兼容,但这也意味着它没有浪费带宽的本意,任何相左的优化策略终将遇到无法解决的困难,大致就这样,这为设计新协议提了意见&#x…...

ASP.NET |日常开发中读写XML详解

ASP.NET |日常开发中读写XML详解 前言一、XML 概述1.1 定义和结构1.2 应用场景 二、读取 XML 文件2.1 使用XmlDocument类(DOM 方式)2.2 使用XmlReader类(流方式) 三、写入 XML 文件3.1 使用XmlDocument类3.2 使用XmlWr…...

Less和SCSS,哪个更好用?

前言 Less 和 SCSS 都是流行的 CSS 预处理器,它们的目的都是扩展 CSS 的功能,使样式表更具组织性、可维护性和可重用性。虽然它们有许多相似之处,但在语法、特性和工作方式上也存在一些差异。 Less Less 是一种动态样式表语言,…...

第一个C++程序--(蓝桥杯备考版)

第一个C程序 基础程序 #include <iostream>//头⽂件 using namespace std;//使⽤std的名字空间 int main()//main函数 {cout << "hello world!" << endl; //输出&#xff1a;在屏幕打印"hello world!" return 0;}main函数 main 函数是…...

NanoLog起步笔记-7-log解压过程初探

nonolog起步笔记-6-log解压过程初探 再看解压过程建立调试工程修改makefile添加新的launch项 注&#xff1a;重新学习nanolog的README.mdPost-Execution Log Decompressor 下面我们尝试了解&#xff0c;解压的过程&#xff0c;是如何得到文件头部的meta信息的。 再看解压过程 …...

【MySQL 进阶之路】基础语法及优化技巧

MySQL DML 基础语法及优化技巧 一、DML&#xff08;数据操作语言&#xff09;概述 DML 是数据库操作语言的子集&#xff0c;用于数据的增、删、改、查四个基本操作。MySQL 中的 DML 操作通常是指以下四种基本操作&#xff1a; INSERT&#xff1a;插入数据SELECT&#xff1a;…...

微信小程序做电子签名功能

文章目录 最近需求要做就记录一下。 人狠话不多&#xff0c;直接上功能&#xff1a; 直接搂代码吧,复制过去就可以用&#xff0c;有其他需求自己改吧改吧。 signature.wxml <!-- 电子签名页面 --> <custom-navbar title"电子签名"show-home"{{fals…...

PR的选择与移动

选择工具 可以选择序列上的剪辑&#xff0c;如果需要多选可以按住shift键选中多个剪辑 CtrlA&#xff1a;可以进行全选 编组 选中多个剪辑后“右键-编组“可以将所选的剪辑连接在一起。这时单击任意剪辑都可以选中全部 向前选择轨道工具与向后选择轨道工具 向前选择轨道工具…...

Linux系统 —— 进程系列 - 进程状态 :僵尸与孤儿

目录 1. 进程状态的概念 1.1 课本上的说法&#xff1a;名词提炼 1.2 运行&#xff0c;阻塞和挂起 1.2.1 什么叫做运行状态&#xff08;running&#xff09;&#xff1f; 1.2.2 什么叫做阻塞状态&#xff08;sleeping&#xff09;&#xff1f; 1.2.3 什么叫做挂起状态&…...

linux/centOS7用户和权限管理笔记

linux系列中可以&#xff1a; 配置多个用户配置多个用户组用户可以加入多个用户中 linux中关于权限的管理级别有2个级别&#xff0c;分别是&#xff1a; 针对用户的权限控制针对用户组的权限控制 一&#xff0c;root用户 root用户拥有最大的系统操作权限&#xff0c;而普通…...

使用C#基于ADO.NET编写MySQL的程序

MySQL 是一个领先的开源数据库管理系统。它是一个多用户、多线程的数据库管理系统。MySQL 在网络上特别流行。MySQL 数据库可在大多数重要的操作系统平台上使用。它可在 BSD Unix、Linux、Windows 或 Mac OS 上运行。MySQL 有两个版本&#xff1a;MySQL 服务器系统和 MySQL 嵌入…...

Scala函数的泛型

package hfd //泛型 //需求&#xff1a;你是一个程序员&#xff0c;老板让你写一个函数&#xff0c;用来获取列表中的中间元素 //List(1,2,3,4,5)>中间元素的下标长度/2 >3 //getMiddleEle object Test38_5 {def print1():Unit{println(1)}def print2(): Unit {println(…...

云轴科技ZStack亮相中国生成式AI大会上海站 展现AI Infra新势力

近日&#xff0c;以“智能跃进&#xff0c;创造无限”为主题的2024中国生成式AI大会在上海举办。本次大会由上海市人工智能行业协会指导&#xff0c;智东西、智猩猩共同发起&#xff0c;邀请了人工智能行业的顶尖嘉宾汇聚一堂&#xff0c;以前瞻性视角解构和把脉生成式AI的技术…...

态感知与势感知

“态感知”和“势感知”是两个人机交互中较为深奥的概念&#xff0c;它们虽然都与感知、认知相关&#xff0c;但侧重点不同。下面将从这两个概念的定义、区分以及应用领域进行解释&#xff1a; 1. 态感知 态感知通常指的是对事物当前状态、属性或者内在特征的感知。它强调的是在…...

汽车零部件设计之——发动机曲轴预应力模态分析仿真APP

汽车零部件是汽车工业的基石&#xff0c;是构成车辆的基础元素。一辆汽车通常由上万件零部件组成&#xff0c;包括发动机系统、传动系统、制动系统、电子控制系统等&#xff0c;它们共同确保了汽车的安全、可靠性及高效运行。在汽车产业快速发展的今天&#xff0c;汽车零部件需…...

谷歌浏览器的网页数据导出与导入方法

谷歌浏览器是全球最受欢迎的网络浏览器之一&#xff0c;它不仅提供了快速、安全的浏览体验&#xff0c;还拥有丰富的功能和扩展程序。本文将详细介绍如何在Chrome浏览器中导出和导入网页数据&#xff0c;同时涵盖一些相关的实用技巧&#xff0c;如调试JavaScript、自动填充表单…...

pytroch环境安装-pycharm

环境介绍 安装pycharm 官网下载即可&#xff0c;我这里已经安装&#xff0c;就不演示了 安装anaconda 【官网链接】点击下载 注意这一步选择just me 这一步全部勾上 打开 anaconda Prompt 输入conda create -n pytorch python3.8 命令解释&#xff1a;创建一个叫pytorch&…...

【大模型】PostgreSQL是向量数据库吗

PostgreSQL&#xff08;通常简称为 Postgre&#xff09;本身并不是一个专门的向量数据库&#xff0c;但它可以通过扩展或插件支持向量数据的存储、检索和处理&#xff0c;因此可以在某些场景下作为向量数据库使用。以下是关于 PostgreSQL 是否可以作为向量数据库的详细说明&…...

【PyQt5教程 一】Qt Designer 安装及其使用方法说明,附程序源码

目录 一、PyQt5介绍&#xff1a; &#xff08;1&#xff09;PyQt简介&#xff1a; &#xff08;2&#xff09;PyQt API&#xff1a; &#xff08;3&#xff09;支持的环境&#xff1a; &#xff08;4&#xff09;安装&#xff1a; &#xff08;5&#xff09;配置环境变量…...

Qt 联合Halcon配置

文章目录 配置代码窗口绑定 配置 选择添加库 选择外部库 LIBS -LC:/Program Files/MVTec/HALCON-17.12-Progress/lib/x64-win64/ LIBS -lhalconcpp\-lhdevenginecpp\-lhalconINCLUDEPATH C:/Program Files/MVTec/HALCON-17.12-Progress/include DEPENDPATH C:/Program Fil…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

FastAPI 教程:从入门到实践

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

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter

java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用&#xff08;Math::max&#xff09; 2 函数接口…...