TCP 丢包恢复策略:代价权衡与优化迷局

news/2025/2/5 17:07:31/

网络物理层丢包是一种需要偿还的债务,可以容忍低劣的传输质量,这为 UDP 类服务提供了空间,而对于 TCP 类服务,可以用另外两类代价来支付:

  • 主机端采用轻率的 GBN 策略恢复丢包,节省 CPU 资源,但浪费网络带宽;
  • 主机端采用极其谨慎的 SACK 策略恢复丢包,浪费 CPU 资源,但节省带宽;

无论哪种,都属于异常处理路径,可靠传输协议,丢包总要恢复,省是省不了的,要么用 CPU 换带宽,要么用带宽换 CPU,TCP 协议已经可以将策略完美配置在两个极端。

上述两类策略我特意加上 “轻率” 和 “谨慎” 修饰,以表明标准版 GBN 和 SACK 是恢复丢包的最小代价,CPU 和 带宽是决策的两端。我写这个目的在于表明但凡你稍微给 GBN 或 SACK 加戏,就要付出额外代价,结局是既浪费了 CPU 又浪费了带宽。

来举两个例子,先看 GBN,我们知道 GBN 几乎不费 CPU,只要超时或 3 次 dupack 立马就重传 snd_una 到 snd_nxt 间所有段,如果你发明一个新的 GBN 算法,加入了比超时和 3 次 dupack 更复杂的丢包判断,由于重传动作省不了,就额外增加了丢包判断的 CPU 消耗。

再看 SACK,从相关 RFC 中我们看到 TCP SACK 谨慎到鉴别 scoreboard 每一个段的状态,虽然 RACK 后有所松散,但依然保持谨慎的底色,这意味着作为 GBN 反面的 SACK 不希望浪费一个段的带宽,但如此复杂的状态鉴定显然需要更多 CPU,如果你发明了一个更加 “高效” 的 SACK 算法,希望丢包能更加快速恢复,势必要冒险重传不该重传的段,精确鉴定省不了,多发的额外重传段却浪费了带宽。

那么是否存在一个交易点,在这个点位,重传动作更快开始,恰到好处的精确丢包判定,恰到好处的精确重传。理论上这个点肯定存在,但实际上根本找不到,因为端到端传输协议携带的信息量根本不足以找到这个点,TCP/IP 框架下的传输协议的网络度量在本质上是不可观测的,比如 RTT 和 delivery rate 根本无法测准。

若要解决测不准问题,要么需要协议携带更多信息,这增加了协议头开销,要么端网协同,这增加了转发节点的计算和状态存储开销,本质上还是交易,在分布式复杂系统中,买卖的收益是递减的,也就是说增加一个机制会引入该机制本身的消耗,而它带来的收益却只是解决一个不值得解决的问题。

在现实中,我们经常看到类似不值得做的事,只要它工作的还不至于糟糕,就让它继续工作。

解决丢包重传问题的根本方法就是升级底层网络,提高线路质量,提高交换容量。自下而上才能起到优化效果,而自上而下只能规避问题,是为 workaround,这一点上,TCP 用最小代价处理(而不是解决,解决只能靠物理层,链路层)丢包恢复已经足够好。如果算法上没有明显的缺陷,优化效果几乎只能自下而上呈现,而 TCP GBN 和 TCP SACK 没有缺陷。

So?还做什么 TCP 传输优化,现有信息量约束下,每做一个新策略都是在同时浪费 CPU 和带宽,同时浪费公司的钱。

还有另一类丢包值得关注,即拥塞丢包,它不是问题,相反,它是功能。就像感冒和醉酒一样,拥塞丢包是一种功能性信号,如何处理拥塞也像如何治疗感冒和醒酒一样常规。在统计复用系统中,没有任何机制可以避免拥塞丢包,问题在于用最小的代价回应拥塞,答案都在 AIMD 或测度方法里,不赘述。

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


http://www.ppmy.cn/news/1569559.html

相关文章

MySQL知识点总结(十七)

在从属服务器上执行RESET SLAVE命令时,会发生哪些操作? RESET SLAVE命令会断开从属服务器与主服务器的连接,以重置从属服务器,具体效果如下:清除 master.info和relay.log资料档案库删除所有中继日志启动新的中继日志文…

【C++】STL——vector的使用

目录 💕1.vector介绍 💕2.vector的基本用法 💕3.vector功能的具体用法 (讲解) 💕4.vector——size,capacity函数的使用 (简单略讲) 💕5.resize&#xff…

【JavaEE】Spring(6):Mybatis(下)

一、Mybatis XML配置文件 Mybatis开发有两种方式: 注解XML 之前讲解了注解的方式,接下来学习XML的方式 1.1 配置数据库连接和Mybatis 直接在配置文件中配置即可: spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?cha…

基序和纯度分数的计算

以下对这两个概念的详细解释: 基序 纯度分数 PWM矩阵的来源 为什么会有PWM矩阵? 一个特定的转录因子(TF)的结合位点的基序(motif)并不是唯一的。实际上,TF结合位点通常具有一定的序列变异性&a…

高阶开发基础——快速入门C++并发编程6——大作业:实现一个超级迷你的线程池

目录 实现一个无返回的线程池 完全代码实现 Reference 实现一个无返回的线程池 实现一个简单的线程池非常简单,我们首先聊一聊线程池的定义: 线程池(Thread Pool) 是一种并发编程的设计模式,用于管理和复用多个线程…

jEasyUI 转换 HTML 表格为数据网格

jEasyUI 转换 HTML 表格为数据网格 引言 随着互联网技术的飞速发展,前端框架和库的应用越来越广泛。jEasyUI 是一款功能强大的 jQuery UI 扩展库,它提供了丰富的 UI 组件,其中数据网格(DataGrid)是 jEasyUI 中一个非常重要的组件。本文将详细介绍如何使用 jEasyUI 将一个…

ASP.NET Core与配置系统的集成

目录 配置系统 默认添加的配置提供者 加载命令行中的配置。 运行环境 读取方法 User Secrets 注意事项 Zack.AnyDBConfigProvider 案例 配置系统 默认添加的配置提供者 加载现有的IConfiguration。加载项目根目录下的appsettings.json。加载项目根目录下的appsettin…

对顾客行为的数据分析:融入2+1链动模式、AI智能名片与S2B2C商城小程序的新视角

摘要:随着互联网技术的飞速发展,企业与顾客之间的交互方式变得日益多样化,移动设备、社交媒体、门店、电子商务网站等交互点应运而生。这些交互点不仅为顾客提供了便捷的服务体验,同时也为企业积累了大量的顾客行为数据。本文旨在…