漫谈分组交换网

这是一篇散文,不讲技术讲历史的。为什么写这么一篇在绝大多数同行看来毫无意义的文科手笔呢,其实正是想讽刺这些人。互联网和电话网的差异就是 分组交换电路交换 吗?教科书上就是这么讲的,但这就够了吗?

远远不够,所以我补充下缺失的部分。


19世纪电话的发明是人类通信史上的创举。

电话的意义不在电话本身,而在于越来越多的电话构成的越来越复杂的网络,而这张网络正是现代互联网的前身。

如果这张网络一开始就是完美的,便谈不上进化了,幸运的是,它离完美太远,缺陷太多。

我们先看下原始的电话网是如何工作的:
漫谈分组交换网

电话之所以能彼此接通,其核心就是那个 接线员 所做的工作,把from线缆和to线缆接通,这便是 switch 的真实含义,直到今天,我们依然把互联网的转发节点叫做 switch

接线员把两部电话所连接的线缆接通,这件事叫做 线路接通 ,然后握着两部电话的人就可以开始说话了,直到他们中的一方挂断电话,这条线路一直被这两部电话占据,如果再有人给其中一方打电话(beat electric discource),接线员就会告诉他目前 占线

这种工作机制同时带来两个问题:

  • 随着电话越来越多,接线员的工作会越来越繁忙。
  • 随着电话越来越多,占着线路沉默不说话带来的浪费越来越挑战等待打电话的人的耐心。

20世纪10年代,一战期间,电话已经不再是纯人工switch的了,有更多的机器参与进来,这让电话网络显得有点自动化了,终于可以让机器做点人力做不到的事了。

这个时候,人们提出过 动态线路分配, 简单来讲就是,一次打电话过程会被中间的沉默分开,即 只有在真的讲话的时候才分配线路。 其理由是:

  • 在统计意义上,动态线路分配性价比更高,资源浪费更少。 (统计复用的雏形有没有…)

这意味着什么?

这意味着每一句编码过的话音都要携带目标电话号码,这样switch(不管是人工的还是自动的)就能查看来来往往的编码话音的 目标地址 来正确接通线路了(分组交换的雏形有没有…),这个方法解决了线路浪费的问题:

  • 自动化的switch替代人工完成复杂的频繁接线工作完成动态线路分配!

如果故事在此完结,可能因为在不正确的阶段过于早熟,就没有后来的互联网了。幸运的是,它遭到了抵制!!

动态线路分配大概因为以下的原因被抵制:

  • 它太不经济了,无论是支付高薪工人的工资还是设计复杂的自动设备。
  • 由于人们说话持续时间不同,动态线路分配带来的不可控等待时延让打电话的人无法忍受。
  • 电话网的规模还没有大到能让动态线路分配体现收益的程度。
  • …(我觉得上面三个应该就够了…)

一战过去了40年,二战也过去了,现在到了冷战时期。

战争是科技的引擎。

一战后电话网铺开盖地,但动态线路分配的理念生不逢时,实际并未成熟。二战后,计算机科学与技术获得了巨大发展,人们开始有需求让两台计算机像打电话那样传输数据。这个用电话网肯定可以胜任。如果没有更进一步的需求,也不会有现代互联网。

从电话网的机制可以看出,它工作的实质就是 接通一条完整的线路 ,这必然导致电话网是一种 中心控制的网络 ,一个电话公司必然是巨大的,必然是拥有自己线路和控制局的,它必然需要有一个全局视图才能完成 在自己的网络中频繁接通任意两部电话

然而,美国在1960年代的冷战当时害怕下面这些玩意儿啊:
漫谈分组交换网
当时的难题是, 如何设计一张就算被上面这些玩儿轰一阵子也依然能工作的通信网络。

牛逼的东西都不是从头设计的,分组交换网的前身正是前面谈到的动态线路分配。

由于1960年代考虑的通信网络不再局限于话音,人们对延迟问题更加宽容,分组交换网就是在这种背景下被提出的。和动态线路分配不同的是,分组交换指的是,需要被传输的数据被分割成大小相等的小片,每一个小片都携带源地址和目标地址,这些小片独立通过网络。这些小片的名字叫packet

计算机技术前来助力!

存储-执行的计算机模型 让switch作为 存储-转发设备 成为可能,这样一来, 更小的大小相等的packet而不是一句长度不等的话音 得以快速通过switch,不会带来额外的延时,同时switch的存储功能可以用来平滑统计突发流量,这是真正的统计复用!

我们来看这些技术是如何应对核打击的,这才是经理的需求!经理是不care什么存储转发,统计复用的,经理只care能否扛住核打击。

由于一整块数据被分割成了一个个的packet,这些packet均携带了目标地址,那么它们便可以独立通过网络而不再必须背靠背同行了,这很类似古代镖局的分批押运,走不同的路径到达目的地,分担风险。这让mesh网络成为可能:
漫谈分组交换网

每一对节点之间都有非常多的路径可达,只要还有一条路径存在,通信就不会被破坏,在全美构建这么一张网络,足够应对任何强度的核打击,意思是说,只要美国还在,这张网就在。

这种分布式的网络不允许存在总控局,这是完全 去中心化的 ,问题是,分散独立的switch节点在没有全局视图的前提下如何正确路由packet。

为了避免去中心化策略带来额外的延时,packet必须沿着 最短路径 到达目的地,在这一路上的每一个switch中,packet必须被 最快速度转发到下一个switch

  • 最短路径就是BGP,OSPF,RIP等现代路由协议的雏形。
  • 最快速度接力转发就是“热土豆”的雏形。

只要每一个switch可以将packet继续往更接近目的地的地方接力传递即可。这可以做到吗?没有全局视图的约束下完成一个全局最短路径的收敛,这是如何做到的?

很多人可能又要摆算法了,这些都是构想之后写paper前做的事,事实上一开始的想法总是来自于生活中的实例。邮递员分拣信件或者邮政速递员送信。

这里给一个实例,看看分布式节点在全局无知的约束下如何学习到最短路径的:
漫谈分组交换网
这简直就是RIP协议嘛。上图来自:
https://www.rand.org/pubs/research_memoranda/RM3420.html
“The Postman Analogy” 开始阅读。

这种 分布式的,去中心化的,统计复用的分组交换网 除了抵抗核打击之外,还有一个明显的副作用,那就是 公平性

  • 每一个packet足够小,占用线路的时间足够短,这提供了细粒度的公平性基础。

但是,这张网不是为效率而生的,它只是依靠最短路径和热土豆保证了效率而已。我们一定要记住它的设计初衷:

  • 抗核打击!
  • 抗核打击!
  • 抗核打击!

分组交换网满足这个目标显得很轻松,显得毫无阻力,人们似乎一瞬间就接受了,Why?经理为什么不问下面的问题:

  • 你把数据分成packet之后,谁来把它们再次合成原始数据呢?

经理当然问了,若不是计算机技术再次助力,经理显然是不会同意部署这张分组交换网的。

40年前,经理由于拒绝switch的无收益的复杂化而拒绝了电话网的动态线路分配。

40年后,去中心化的新网络让switch变简单了,工作量是守恒的,繁重的工作必然留给了终端,如果经理再次拒绝终端的复杂化呢?

事实上,事情发生了变化。电话网时代,终端是简单的,复杂化必在网络核心,经理由于经济原因拒绝网络核心的复杂化,那事情就根本无法进展,事实上事情确实没有进展,动态线路分配没有被接受。然而在计算机时代,计算机终端本来就是用来做复杂工作的,数据的分割,重组全部都在计算机终端来完成,且计算机终端轻松胜任!网络的核心保持简单。

这就是 端到端原则 。关于这个端到端原则,以及内涵的网络中立原则,有一篇精彩的辩论,大家可以抽个周末的下午欣赏:
https://itif.org/files/2009-designed-for-change.pdf

在这张网上铺盖一个叫做TCP/IP的协议栈,就是我们现在的互联网了。

写在最后,我想务个虚,说个方法论相关的。

其实,分组交换网和电话网比较,千万不要用教科书上上讲的那种分组交换和电路交换的视角,那种相当于什么都没说,死记硬背,应付面试,毫无意义。

你把做事情的顺序和每件事的元素对调一下,事情就成了。

假设这里有3个电话要打,我们把打完3个电话作为完成这件事的标志,那么做这件事情显然有两种方法:

  • 一个电话一个电话打,打完一个才能接着打另一个。
  • 一句话一句话说,一通电话说完一句话后换另一通电话。

关键看你用什么粒度,这个是任务调度的根本,不信你去读读操作系统的教科书,里面就是这么讲的,但问题是为什么讲到网络就不这么讲了呢?本质上来讲,网络传输也是任务调度的子集啊!

我自诩自己这个方法论玩得很好,我曾经用它预处理优化过4万条iptables规则:

  • 你是老老实实一条一条遍历执行iptables规则呢,还是将每一条规则的matches作为一个维度按match匹配呢?

详情我这里不赘述,看看nf-HiPAC就知道了,就是这个思路。

对了,还有,Nginx和Apache之间貌似也有这种关联,还有pipeline…

正确的事情,很多地方都是一致的,我最讨厌的说法就是 “X和Y没关系”


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

上一篇:Packet Trace学习五


下一篇:OpenCMS 11 (一)安装配置