最近在重读TCP/IP协议。记得大学时候这门课是挂了科的,而且补考又挂,结果是不得不在下学年重修一次这门课。单单从当时的考试来看,主要原因是两次考试都有一道40分的设计子网划分案例的大题答不上,结果当然是铁定挂了。不过,也从此让我心里对TCP/IP这玩意儿有了心理阴影,觉得这是个很难的学问,因此自从毕业以后就再也没怎么碰过它了。
当然,生活往往是你想逃避什么的时候,它总会时不时的出现在你面前,挥之不去。由于工作需要,最近不得不把这看着犯怵的东西又翻出来看一遍。这也才有了今天这篇学习感悟。
起因:为什么TCP/IP协议中同时设计了MAC地址和IP地址?
对于计算机行业从业人员的我来说,MAC地址和IP地址是再熟悉不过的了。但是,这个问题又恰恰在看TCP/IP时候突然冒出来,却又回答不上。是啊,粗略的看,MAC地址和IP地址二者有其一不就可以完成定位一个计算机设备位置的目的了吗?那干嘛还要同时设计两个地址出来呢?
找答案当然是上网搜索一下了。下面就是在知乎上大家对这个问题的回答:
https://www.zhihu.com/question/21546408 【有了 IP 地址,为什么还要用 MAC 地址?】
从网友的回答来看,真的是可以想到很多这样设计的理由和好处。
不过让我感受最深的还是下面这个解释:
作者:八里土人
链接:https://www.zhihu.com/question/21546408/answer/85252619
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
问题的核心在于网络上的分层概念。IP地址是不区分传播介质的,他的作用是在internet网中能够投递到边界。在网络边界的局域网,有可能使用不同的层二网络,以太、wifi、ppp、3g、wimax等等。在这个局域网中,才出现了与介质相关的终端标识。mac地址用于以太网,imsi用于3g网,线路号用于拨号上网。internet边界路由器可以在这个特定的介质网中找到特定终端。如果没有IP地址,那么3g网络用户无法和以太网用户通信,因为没办法去做这么复杂的协议让几十种协议两两对通。即使做了,发起方也需要方法去知道对端用的是什么层二网。因此,所有网络协议都用IP,只在两头网关上做转换,就是一种设计很先进的奇妙方法。反过来,为什么全球只要mac地址不能用于全球通信?问题在于mac地址和IP地址的汇聚性。mac地址是出厂就决定的,不是上网的时候决定的。也就是说intel设备或使用intel芯片的mac地址前面多少位是相同的,然后intel在给芯片分地址的时候保证所有的芯片没有重号的,这样才能保证随便哪个终端接入到同一个局域网中没有重复的。这样问题就来了:网络上希望路由器的转发规则尽量简单,所以一般要用ip地址前多少位而不是整个IP地址去做转发。mac地址显然没法汇聚,前面已经讲过,工厂决定的。给每个用户分配一个只由路由器网关决定的地址,每个网关上附着一个段,例如100.200.x.x,也就是所有以100.200开头的ip都送到这个网关上来,就可以保证internet转发规则的简单化。而且,一个用户从一个局域网离开,换到另一个局域网中,mac地址不需要变,只需要换个ip地址就行。
上面的回答我从中看到了两个设计思想:
一是通过分层的设计来解决不同方面的问题,例如上面回答中的利用网络模型的二层来适配各种网络介质类型(以太、wifi、3g、wimax),利用三层来对网络寻址、处理路由。这种分层解决的方法,广泛的存在于计算机行业和我们生活的世界中。比如,软件架构中的数据访问层可以适配不同的数据库(mysq、oracle)并对上层提供统一不变的接口,有点类似前面的二层网络的作用。另外,神经网络中的每一层也用于识别不同的模式,然后一层一层往上最终识别出图像中的物体。
而另一个就是对地址这玩意儿又有了一次深刻的感受。
关于地址
从上面的知乎回答中,可以看到网络中数据包的投递策略是这样一个过程:先找到目标机器的大位置,也就是在哪个网络中,然后再到这个网络中具体的找这一台机器。
很明显,这中寻址方式采用了一种按范围逐步缩小定位的模式。从整个目标对象空间中,先确定一个较大的局部范围,然后逐层缩小,最终精确定位到一个具体的目标。而在计算机行业中,有很多地方都采用了这种模式,例如二分查找法。其他的还可以举出下面的例子。
数据库索引
数据库中的索引技术也用到了这样一种按层次逐级定位记录的方式。例如下面的B-树
这里可以看到树有三层。最上面的根节点相当于划分了5个范围,即指向第二层三个节点的P1、P2、P3指针,以及17、35这两个具体的值。如果我们查找的是29这个目标树,那么根节点指示我们29的处在范围为17-35之间的一个段内,要通过P2的指针到下一层去找,也就是第二层的中间那个块。类似的,到了第二层后,范围又缩小到了26 - 30这个区间,又进一步到第三层区找,最终可以找到29的位置。
硬盘上的数据定位
有一种磁盘数据定位的方式采用了柱面cylinder + 磁头head + 扇区sector 三维定位的方式。如图可以看到有三个磁盘面,一个磁盘面有上下两个磁头,总共6个磁头。每个圆盘面上的一个圆圈叫磁道,三个圆盘的相同半径的三个圆圈构成了柱面。而每个圆圈又分成了多个扇区。因此通过柱面、磁头、扇区三个维度就可以唯一找到一个数据块在磁盘的物理位置。虽然这个例子中,没有一个具体的树状层次,更像一个立体三维的坐标系。不过它仍然符合逐步按范围缩小的模式。例如,在寻址的时候,先确定是6个磁头中的哪一个。再在这个磁头所处的盘面上,确定是哪一个磁道(也就是柱面)。最后在磁道上找到具体的扇区。
推而广之
不仅计算机世界采用了这种地址设计和寻找方式,现实生活中各行各业也有很多这种层次化、范围式的地址设计。比如我们真实世界的地址系统就是按国家、省份、市县、区、街道这样一层一层设计的。当快递公司要送一个包裹时,先根据包裹上的省份地址知道要往哪个大方向发货,然后当包裹到了这个省之后,再按市、区、街道一层一层的分发下去。又比如电话号码,也是有国家号(中国的+86)、市号(北京的010)一级一级的构成。其他还有档案馆中文档位置的编号系统等等,数不胜数。
表象不一样,甚至具体的细节也千差万别,但是它们的本质却都是一样的,并且原理是简单的。掌握了这种基本原理,我们可以将它应用到各种不同的行业和场景,也算是做到所谓的举一反三了吧。