现代操作系统和 TCP/IP(第二篇)

news2024/12/26 4:10:50

接着 现代操作系统和 TCP/IP 继续。

现代分时系统的时间片轮转机制让人们可以 “同时使用计算机”,从而滋生了 “同时使用网络” 的需求,现代分时系统是分组交换网的原动力。

从来没有超过一个人同时使用同一部电话,因此独占线路的电路交换理所当然,但计算机则相反,许多人一起使用计算机,每个人读希望独占通信线路,而分组交换则提供了独占线路的假象,正如时间片轮转提供了独占计算机的假象一样。

可以非常直接地类比时间片轮转的现代分时系统和分组交换网,两者太像了,背后的机制也一样。对于分组交换网,一条数据流被分为若干数据包,多条数据流的所有数据包统计复用网络链路,而对于现代分时系统,一个程序的指令流被分隔在不同的时间片中执行,多个程序的所有指令流时间片轮转。

继续类比就发现了传输协议的问题甚至 IP 的问题。

设想一个常见的场景,在多核系统加密一条数据流,高效的方式如下(这也是 wireguard 的方式):
在这里插入图片描述

虽然数据流是强序的,但加密的过程是个执行过程,数据是 OBJ 呈现的样子,而执行则是对 OBJ 加工的过程,数据和执行要分离才能高效利用资源。因此没人傻到对一条数据流顺序加密。

在更底层的指令层面,几乎所有的现代处理器都支持乱序执行,道理也是如此。

但类比到 TCP/IP 分组交换网,TCP 却没有采用这种显而易见的方式。

和 “加密” 一条数据流类似,现在是 “传输” 一条数据流,只是换了谓语,TCP 却成了下面的样子:
在这里插入图片描述

而正确的做法应该是下面的样子:
在这里插入图片描述

TCP 做不到这个样子,我想还是因为它诞生太早了,在 1970 年代,人们尚未完全认识到数据和执行要分离,更别提数据和传输要分离,当时电路交换的影响还很大,物理层面接受分组交换已经是一大突破,在逻辑层面却依然还是 “电路”,它们叫 “虚电路”。TCP 握手挥手,像极了电话拨号挂断等信令。如果在 2010 年代末重新设计传输协议,事情将会大不同,比如 SRD。

早期 TCP/IP,若不是主动 ECMP,瘦网(尽力转发)几乎没有能力将数据包做多路径分发,ECMP 也只能依赖传输层元组以及更高层协议信息,在 IP 层面没有任何指导多路径分发的字段可用,但在 2010 年代大规模部署的 IPv6 协议就有 flowid 字段可用,这也算摆脱了时代的局限。

即便是 ECMP,也不敢对 TCP 进行多路径分发,因为 TCP 的核心机制积累确认太依赖强序了,多路径分发 TCP 流量会导致大量丢包误判,SACK 也救不了。

直到现在的 TCP,若想换一条等价路径,对于 IPv4,除了重连换个端口,几乎没有别的方法,因此一些 trick 就是“重连比 RTO 退避效率高多了,重连会换端口,会换 ECMP 路径,之前的老路要么断了,要么严重拥塞了,也不用等了,直接 reset 连接,靠重连换路”,或者 “用短连接 reset 将 TCP 做 UDP 用,发几个包就 reset 掉,代价就是握手,如果支持 fastopen,就完美了”。

关于 TCP 强序问题,去年写过两篇文字:TCP 和宽容,TCP CC 和宽容。

在 1970 年代 TCP/IP 肇始,IP 路由虽是逐跳转发,但最短路径路由协议也依然会收敛到同一条路径,换句话说,早期的多路径是做备份的,而不容易做负载均衡,整个 TCP/IP 协议族都天生对多路径传输不友好。

ECMP,TCP SACK 等机制只是弥补了缺陷但远非修正。

现如今的最优路由逐跳转发天然不支持多路径。在新的时代实现真正的多路径乱序传输,核心是部署一个新的路由协议或者部署 SDN 控制器对东西向流量进行干预性调度,除此之外,传输协议只能说利用了底层的多路径特征。举个例子,现如今体系结构下,就算 MPTCP 构建了 10 条 subflow,它们大概率也会经由同一条路径到达对端进而也经历同样的拥塞。

若真的学现代分时系统的方式,就应该像将数据的形式和执行的过程分离一样,将数据和传输分离,不用操心传输的过程,只关注数据交付的形式。IP 路由天生就应该将到达同一目的地的流量分发到多条路径,但就目前看来,这却是 IP 路由极力避免的。以 Dijkstra 算法为例,收敛后的视图在每个路由器看来都是一棵树,这意味着到达确定目标只有唯一一条路径,而别的路径被 “剪枝” 了,只有当最优路径不再最优时,路由才可能重新收敛到新的路径,这天然不是多路径传输的方式。

但话又说回来,分时系统本身也远非完美,Linux + SMP 一直在演化,努力克服多核场景的同步问题,大量取消对共享数据结构的访问,但根本缺陷也并非那么容易克服,情况比网络传输更严重。

在分时系统内部,执行的时间尺度与数据交付的时间尺度是同一数量级,这意味着并行处理太过分时,同步开销占比将无限增加,但凡交互,必有同步,这是免不了的,因此总有一个 “度” 的问题,将问题如何拆解更合适,这部分已经逼近极限。

但这对于网络传输并不成问题。感谢光速,让几乎任何传输都需要足够久的时间,这部分时间(us 级别)远大于数据交付的时间(ns- 级),人们早已接受了如此慢的传播速度,多路径传输的同步开销和多路径传输本身带来的收益相比微不足道。

TCP/IP 分组交换与现代操作系统同时在一个 “寒武纪大爆发” 时代开始,两者的关系非常有趣。从原理上,它们都是统计复用系统,背后都是排队论,还可以从计算机使用方式和电话使用方式不同来看,但比较着比较着就会发现问题,最初的 TCP/IP 还是带有历史的影子包袱,这些包袱一背就是 40 余年,但这就是演化本身,这是一个精彩的故事。而现代操作系统没有这样的包袱,因为计算机本身就是通用机器,若非要找一个包袱,那么还是以电话为代表,作为专用机器站在通用机器的对面。说了这么多,电话这种东西才是二者共同的前辈。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455060.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023蓝桥杯省模拟赛附近最小

2023蓝桥杯省模拟赛附近最小 这个题算是一个经典的数据结构入门题了&#xff0c;写了几个解法水一篇文章 map维护 时间复杂度nlgn&#xff0c;但是常数比较大&#xff0c;所以只能过90%数据 #include <iostream> #include<vector> #include<map> #include…

卖房子真是稳赚不赔

上面是一段很长的语音&#xff0c;对话是用的我们河池的桂柳话&#xff0c;不过桂柳话和普通话有很多相识之处&#xff0c;理解起来并不困难。 大概的意思是 A公司要给员工一批福利房&#xff0c;然后就让开发商来竞标&#xff0c;竞标的时候开发商就会说明清楚到时候给员工的房…

关于stl容器的迭代器失效问题

场景 在项目中使用stl容器的时候&#xff0c;多线程环境下出错&#xff0c;调试很久发现问题是使用容器的时候由于容器扩容导致的线程不安全&#xff0c;还有扩容导致的迭代器失效问题&#xff0c;于是就想着把迭代器失效的问题总结一下。 场景重现1   我在项目开发中使用ve…

【AI帮我写代码,上班摸鱼不是梦】如何调教ChatGPT,让它帮我写程序。

最近发现磁盘空间严重不足&#xff0c;都弹窗提示我了&#xff1a; 想想看到底哪个文件夹占的空间比较大&#xff0c;好做针对性的删除和清理。奈何Windows系统没有查看文件夹大小的工具&#xff0c;只能鼠标放在某个文件夹上&#xff0c;等提示&#xff1a; AI时代都来临了&am…

AttributeError: ‘ChatGLMConfig‘ object has no attribute ‘quantization_bit‘解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

STM32 产生随机数方式

STM32 产生随机数方式 C语言的stdlib.h库里的srand(unsigned seed)和rand(void)函数&#xff0c;可以配合产生伪随机数。其中srand(seed)产生算法种子&#xff0c;再由rand()通过算法产生随机数&#xff0c;产生的随机数在宏定义RAND_MAX范围内。如果seed不变&#xff0c;则产…

测试从未如此简单:接口自动化测试Python脚本实现

目录 摘要 步骤1&#xff1a;安装依赖项 步骤2&#xff1a;编写测试脚本 步骤3&#xff1a;运行测试 结论 摘要 自动化测试是现代软件开发过程中的重要环节。在许多情况下&#xff0c;特别是在web应用程序和移动应用程序中&#xff0c;接口自动化测试是其基础。下面就来介绍一…

嵌入式就业怎么样?

嵌入式就业怎么样? 现在的IT行业,嵌入式是大热门&#xff0c;下面也要来给大家介绍下学习嵌入式之后的发展以及就业怎么样。 首先是好找工作。嵌入式人才目前是处于供不应求的状态中&#xff0c;据权威统计机构统计在所有软件开发类人才的需求中&#xff0c;对嵌入式工程师的…

详解树与二叉树的概念,结构,及实现(上篇)

目录 一&#xff0c; 树 1.2 树的相关概念 1.3 树的表示 1.4 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二&#xff0c; 二叉树 2.1二叉树概念 三&#xff0c;特殊的二叉树 1. 满二叉树 2. 完全二叉树 3. 1 二叉树的性质 3. 2 二叉树的存储…

北邮22信通:二叉树层序遍历的两种方法首发模板类交互

北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 目录 一.总纲 二.用队列存储 2.1用模板类实现队列 2.1.1核心思路&#xff1a; …

FL Studio电音编曲软件V21中文完整版 安装下载教程

目前水果软件最版本是FL Studio 21&#xff0c;它让你的计算机就像是全功能的录音室&#xff0c;大混音盘&#xff0c;非常先进的制作工具&#xff0c;让你的音乐突破想象力的限制。喜欢音乐制作的小伙伴千万不要错过这个功能强大&#xff0c;安装便捷的音乐软件哦&#xff01;…

PTA L2-045 堆宝塔 (25 分)

堆宝塔游戏是让小朋友根据抓到的彩虹圈的直径大小&#xff0c;按照从大到小的顺序堆起宝塔。但彩虹圈不一定是按照直径的大小顺序抓到的。聪明宝宝采取的策略如下&#xff1a; 首先准备两根柱子&#xff0c;一根 A 柱串宝塔&#xff0c;一根 B 柱用于临时叠放。把第 1 块彩虹圈…

掌握ChatGPT:全面指南和GPT-3.5与GPT-Plus的对比分析

在人工智能领域&#xff0c;最近的一大重磅炸弹是OpenAI发布了GPT-4架构下的ChatGPT。这款先进的自然语言处理模型已经引起了很多关注&#xff0c;让我们来深入了解怎么使用这个强大的工具&#xff0c;以及比较GPT-3.5与GPT-Plus的差异。 什么是ChatGPT&#xff1f; ChatGPT是…

JavaScript经典教程(三)-- JavaScript -- 基础数据类型详解

183&#xff1a;基础数据类型详解 1、复习 1、全局变量&#xff1a; 依托于window环境下的的变量。 在window大环境下&#xff08;即最外层&#xff09;申明的变量a&#xff0c;即为全局变量。 2、window&#xff1a; window下的变量为全局变量。 window可省略。 3、作用域…

021 - C++ 构造函数

我们继续学习 C 的面向对象编程&#xff0c;本期主要是讲其中的 构造函数。 什么是构造函数呢&#xff1f; 构造函数基本上是一种特殊类型的方法&#xff0c;它在每次实例化对象时运行。 我们直接来看一个例子吧。 例子时间 我们将要通过创建一个 Entity 类来深入了解这个…

vscode python3.6配置pcl点云库 obj3d模型转pcd点云图

配置vscode python3.6的环境我就跳过了,网上都有 1.下载PCL1.9 github:pcl-1.9.1 百度云:PCL-1.9.1-AllInOne-msvc2017-win64提取码adcx 2.安装硬盘任意位置,我是E盘,在安装过程中会弹出openni的安装提示,将它安装路径选择在E:\PCL 1.9.1\3rdParty\OpenNI2,等待安装完成 3.…

.netCHATING 10.4 for NET6-7.0-Crack

.NET 6.0图表支持--dotnetcharting .netCHATING 10.4添加了.NET 6.0图表nuget包和.NET 6.0图表示例包&#xff08;需要Visual Studio 2022&#xff09;&#xff0c;.NET 5是.NET Core 3.1和.NET Framework 4.8的继任者&#xff0c;旨在为.NET开发人员提供新的跨平台开发体验。…

Mysql列的类型定义(字符串类型)

文章目录 一、CHAR 类型和 VARCHAR 类型 1.字符串字符(M)2.实战类型二、TEXT 类型 1.类型表2.特别注意3.实战建议4.实战练习三、ENUM 和 SET 类型 1.ENUM类型2.SET类型总结 一、CHAR 类型和 VARCHAR 类型 CHAR类型和VARCHAR类型都在创建表时指定了最大长度&#xff0c;其基本形…

Java版工程行业管理系统源码-专业的工程管理软件-提供一站式服务

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

对数据结构的初步认识

前言: 牛牛开始更新数据结构的知识了.本专栏后续会分享用c语言实现顺序表,链表,二叉树,栈和队列,排序算法等相关知识,欢迎友友们互相学习,可以私信互相讨论哦! &#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&a…