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

TCP/IP 的韧性:尽力而为 可靠传输协议

总有人拥有执念,认为自己重做一遍比现成的好,但现实很遗憾,就像自己做饭大概率没有饭店好吃一样,绝大多数自研传输协议都不会优于标准协议,不管嘴再硬,这就是事实。

你可以在标准协议上做二次开发,然后声称这是自研的,这也是绝大多数所谓的自研,但即使这样,修改后的表现也几乎不会有什么质的提升,考虑到投入的人力成本,这几乎是一个赔本的买卖。

我把协议的成本归为三部分,算法成本,实现成本,研发成本。其中算法是核心,但会被拙劣的实现拖累,而研发成本更是不容小觑。算法成本付出再多收益也有限,很少有人有能力做出好算法,大部分都是普通编程者。其次,若对标准协议二次开发,考虑到标准协议的通用性兼容性,实现成本根本不可能小,如 TCP 标准打印出来比字典还厚, 但实际可能 1 页纸就够传输了,CPU 指令浪费在那些几乎永远进不去的 if 分支判断。最后,研发人力成本不多说,摸鱼 5 年不上线的项目多得是,但一月不给他们发工资试试。总之,自研协议,重造轮子是赔本的。

说这么多旨在说明本文提到的 UDP-based 可靠传输协议一个实现并非我的自研,相反,前面的垫话已经表明了我的态度,我讨厌自研,我写这篇文章只是想说明一个通用的观点,即实现一个通用意义的可靠传输协议时,应该怎么利用互联网的承诺,而 TCP 是否也利用了该承诺。

互联网的承诺是尽力而为,理解这一点非常重要,它会改变协议设计时的思维方式。

做一个可靠传输协议,如果网络不是尽力而为的,而是完全随机混沌的,那么接收顺序就是随机混沌的,可能仅呈现在时间上与发送相关的积累分布特征,但由于实际接收缓存的限制,中心极限定理失效,样本不足以呈现上述统计特征,因此这些相关性很难被利用,那么完全的 sack,nack 就是必要的,除此之外没有任何办法确定一个数据报是收到了还是在超过一个最大容忍时间后仍未收到,紧接着的问题就是该最大容忍时间是多少。

由于无法对网络的传输行为进行任何假设,也就是没有任何信息可利用,即使先来后到也因为统计样本不足而无法利用其特征,在具体数据结构上,接收端不得不采用完全的,如红黑树等平衡二分结构来进行重排序。

但幸运的是,网络并非随机混沌,网络的尽力而为意味着它会尽最大努力保持发送序列的相对顺序不做任何干预,而这正是由最短路径优先原则保证的。换句话说,若想要接收序列完全违背发送序列的相对顺序,网络必须故意额外扰乱它们的相对顺序,比如故意将一些报文发到别的路径上,或者故意暂扣某些报文,让其后面的先通过后再放行,这明显是要费劲不讨好的,否则,只要最短路径不变,顺序就是保持的。如果接收端收到了乱序数据,那一定是无意的。

基于此尽力而为的假设,可以认为互联网传输是准序的,接收端接收的序列也是准序的。既然准序,乱序就是偶然的,对高频事件优化的原则可以使用简单链表而不是树来实现偶然乱序的重排序。

要论及 TCP 是否利用了网络尽力而为而准序的特性,答案无疑是肯定的,TCP 核心的 “积累确认” 即对尽力而为的假设,基于积累确认的 GBN 亦然。若不是网络尽力而为,TCP 绝不敢积累确认并 GBN,因为如此一来,理论上最多将有接近一倍的数据被重传,瞬间淹没网络。

标准无法规定如何实现,标准是一回事,实现是另一回事,实现需要考虑并兼任现实的不同境况。TCP 的实现必须兼容照顾各种乱序度的网络,在不同网络中获得一致的行为,不偏不倚,也正因此,TCP 实现尽量采用高效的数据结构,比如二叉树来缩小不同境况行为统计特征的方差,尽力保持行为一致的不变性特征。

现在可以给出 “好网络” 中的一个 UDP-based 可靠传输协议的实现框架了,依然基于我的高速传送带模型来实现。它本身就是链表,而准序网络可看作一个可局部受损并可局部修复的链表,接收端为 socket2tun 链表加入此修复逻辑即可完成。

很简单,为 packet 编号,用链表组织实现,我将代码附于图示:
在这里插入图片描述

在发送端,单独的线程处理确认和重传,依然全部链表操作:
在这里插入图片描述

若网络 “孬”一点,不那么尽力,链表可能就低效了,因为由于乱序遍历插入的概率高了,当它不再偶然时,使用二叉树就比链表有明显收益,然而并不是非黑即白,如果只是孬那么一点点,这棵树便可以很偏斜,用更大的倾斜换更少的树平衡操作带来的开销,总之,要让二叉树的平衡操作与网络的孬度同步正相关,数据结构也就从链表到完全二叉树而转换。

TCP/IP 屹立 40 多年,IP 尽力而为为 TCP 提供了一个相对整洁的世界,但又没有任何承诺,同样 TCP 无需担心最混乱且杂乱无章的事发生,但又要兼容所有可能,成功正来自这种松弛。彼此在同尺度的适应,且不随规模发散,适应性是不变量。

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

http://www.dtcms.com/a/415606.html

相关文章:

  • 与做网站的人怎么谈判网页设计与制作的原则
  • 咸宁网站建设价格有没有专做于投融资的网站
  • 门户网站建设和运行招标公告如何在第三方网站做推广
  • 南宁网站建设找哪家wordpress 技术类主题
  • 如何使用Python压缩和解压文件
  • 小迪web自用笔记40
  • 奇异值分解(Singular Value Decomposition, SVD)详解——从特征值到奇异值
  • 免费网站安全检测网络游戏名字大全
  • [冀信2025]雄
  • 住建部城乡建设网站中国核工业第二二建设有限公司地址
  • 卓手机建网站查询网站旗下域名
  • DevEco Studio 预览器的使用
  • jar包Tls检验问题处理
  • 网站总体设计方案优秀企业网站的特点
  • PyTorch 实现 CIFAR10 图像分类知识点总结
  • 商城维护工作内容网站建设wordpress 插件站
  • 做网站要的图片斗鱼刚做淘客没有网站
  • vite项目 查看代码编译过程的插件vite-plugin-inspect
  • C语言指针的概念
  • 做购物比价的网站有哪些做图片赚钱的网站
  • 一定要建设好网站才能备案吗中铁建设集团官网登录
  • 免备案自助建站网站天元建设集团有限公司企业号
  • inet_ntoa 函数深度解析
  • 四川省城乡建设厅官方网站附近模板木方市场
  • 网站创建的基本流程做外贸如何建立网站平台
  • 【前端知识】关于Web Components兼容性问题的探索
  • Shimmy - 隐私优先的 Ollama 替代方案
  • 桥东企业做网站跑腿网站建设
  • 用虚拟主机做网站wordpress多城市子站
  • Java 黑马程序员学习笔记(进阶篇14)