据说今日强冷空气来袭,早上观摩了实时雷达图以及卫星云图,强冷空气前锋徘徊在韶关附近僵持,将近上午11点,深圳下起了细雨,北风稍微加大,虽然尚未降温但此现象说明冷锋已经插入到了暖湿气流之下造成空气抬升,形成降雨,降温也就紧随其后了。侦察兵已经到了,大部队还会远吗?
…
本文以及后面一篇讲DNS的文章纯属两篇闲谈,所谓的闲谈就是不关乎技术细节,尽扯背后发散的思路,所以这两篇并不适合学习之用,如若你已经学过这些方面的内容,不妨展开来与我一起探讨个究竟,然而若你从未接触过这些概念,读下去恐怕会失望吧。
寻址方式
什么是寻址?顾名思义,就是找到或者定位某样东西,这个行为伴随着整个人类文明的发展。
在史前时代,野人们会用树枝或者石块来标记曾经可以找到战利品的位置信息,篇幅原因,这些就不说了,我就直接说结论:
1.规则寻址
典型的例子比如计算机内存寻址,军队的编制等等。
2.不规则寻址(或者叫随机寻址)
典型的比如IP寻址,普通居民居住地定位等等。
给定一个内存地址,你如何定位到它?
非常简单!这就跟你定位“上海市嘉定区墅沟路1号”一样简单!首先盲导到上海市,先不管什么区啊路啊啥的,然后到了上海地界后再导航到嘉定区,依然不管什么路,然后从嘉定区再到墅沟路,最后找1号,整个过程你几乎不用走任何弯路,一气呵成。
我以4位内存地址为例,来展示一下如何定位到内存的一个特定位置:
不管是定位上海嘉定区墅沟路1号还是定位某个内存地址,这里有个前提,那就是编址的连续性和实际位置的连续性是一一对应的,我们姑且管它叫规则寻址,如果没有了这个一一对应关系,那事情就会变得非常麻烦。我先举一个现实中的例子。
试想,如果“上海市嘉定区”不在“上海市”会怎样?!也许你会说,这不可能啊,“上海市嘉定区”这个名称里不已经有了上海市这个限定了吗?其实不然,虽然名称里限定了上海市,但在我的例子里,“上海市嘉定区”连在一起的话,它不在上海市,而在哈尔滨的某个地方。请问,你怎么定位到“上海市嘉定区墅沟路1号”??
是的,基于连续对应规则编址的寻址方案失灵了,因为我不可能先到上海市,然后再跑到哈尔滨,然后再跑到成都,最后在深圳找到了“上海市嘉定区墅沟路1号”
换句话说,在以上这个有点变态的例子中,地址的命名空间和其实际位置的命名空间之间不再是满足连续性和一一对应性这两点了,因此寻址的过程就会变得异常复杂,你不可能像内存寻址那样仅仅解析地址就能找到它的物理位置,取而代之的是,你不得不依赖某种叫做路由表的东西来帮你定位到最终的位置,显然,和路由信息隐藏在地址结构中的规则寻址不同的是,这里的路由表是显式的,因此我把它叫做不规则寻址。
那么什么是路由表?
路由表就是保存了地址和位置之间对应关系的一张信息表。
对于规则寻址而言,路由表自动隐藏在地址和初始位置中,只要有初始位置信息,任何位置都可以从地址中获取,换句话说就是“第几个地址对应的就是第几个位置”;对于不规则寻址而言,便不是这般简单。前面我说的那个在深圳定位到上海市嘉定区墅沟路1号的例子并不是真实的,也不可能是真实的,那么下面我们来看两个真实的不规则寻址的例子。
IP寻址的例子
你以为192.168.0.0/16这个网段都在某台路由的一边吗?不,看看下图你就会明白事实上并非如此:
由于IP地址在分配上的这种随意性,使得很多的IP网段无法按照物理位置来聚集,从而造就了非常庞大的路由表。公网上路由器动辄几十万的路由表项是常有的事!如果IP寻址是规则的,那么事情就会非常简单,就像内存寻址一样。比如位于上海的一台两个端口的路由器,可以很肯定地把IP地址空间分成两个部分,然而每一个部分所在的物理位置对应路由器两个口的某一个,就比如说那种情况下,我能十分肯定地下结论,地球上一定能找出一条本初子午线那样的线,0.0.0.0/1这段地址一定在该线的东边,而128.0.0.0/1则在西边,因此只要两条路由即可,类似的还可以继续找出一系列的物理位置进行同样的二分法分割,最终,每台路由器都只需要两条路由即可搞定IP规则寻址。然而现实不是这样,我们不能说IP地址的这种不规则规划有问题,因为IP地址设计出来就是为了解除地址和位置之间的强关联的,这不是问题,而最终通用于IP寻址的最长前缀匹配算法作为一个创造性的方案完美解决了IP不规则寻址问题。当然,为了使路由表更简单,在规划IP地址的时候,还是要尽可能让地址成为可以按物理位置聚集的为好。
由于IP地址理论上会在地球的任何一个地方飘来飘去,如若想管理好如此复杂的路由信息,必然需要一套机制,在IP网络中,动态路由协议就是干这个的,但这不是本文的主题,感兴趣的话可以自行学习相关资料。
接下来的例子可能更接地气,我们来看一下现实生活中的一个不规则寻址的例子。
普通居民定位
如果有心,你会注意到中国有很多的地名都是以姓氏命名的,比如刘家庄,张家宅,李家屯,陆家嘴,肇家浜,宋家庙,张家港,张家界,张家口…城市的先不说,毕竟人口流动民族融合啥的,名称早就成了代号,我们看下农村,你会发现,刘家庄的人大部分都姓刘,李家屯的人大部分都姓李,但如果说刘家庄的所有人都姓刘,并且除了刘家庄再没有姓刘的人,李家屯的所有人都姓李,外面再没有姓李的人,那想找一个姓刘或者姓李的人就会非常简单,直接去刘家庄或李家屯就是了,这就是一种规则寻址。但和IP寻址一样,事实上并不是这样,人是活的,可以四处走动,这就意味着找人这件事是一个不规则寻址的过程。基于征兵和纳税等考虑,政府必须能快速定位到某个人,那怎么办?需要一张路由表,这个和IP寻址是一样的。
是的,户口本就是干这个的,这个特殊的路由表一直到现在都在中国使用。你可以迁移,只要你改下路由信息即可,一个姓刘的人从刘家庄迁出,迁入了李家屯,那么他就必须把户口信息也进行更改,即把居住地从刘家庄改成李家屯。对于迁入门槛高的地方,现代的居住证起着和户口一样的作用,本质上都一样。
类似于IP网络动态路由协议,国家的民政部门也在做差不多的事情。
不得不提到的一个例子就是军队编制人员的定位。和普通居民的定位不同,它属于规则寻址。以下是我个人的一点想法,没有整理,时间有限,记录于此。
军人一旦编入战斗序列,那么他的位置就是固定的,这个规则几千年前就确立了。这表示军队是一个高度组织化规则化的团体,类似但是偏弱一些的还有政府,学校,公司等,但毫无疑问,所有这一切都起源于军队。
战斗的过程是一个高强度的有组织的集团行为,对效率的要求可能超过其它任何事情(这一点不要质疑,世界在日光之下,生死为大,战争上乎国家存亡,下关个人生死,还有什么事比战争对效率的要求更高!公司倒闭了可以重来,大不了不当老板也还是个人,战争输了,个人阵亡,国人会成为奴隶,哪个重要?!),我之前设计DxRPro(参见这篇文章以DxR算法思想为基准设计出的路由项定位结构图解)的时候就说过,高效来自定位而不是查找!哪怕再有效的查找算法,也比不上直接的定位操作,比如说你再牛掰的HASH算法也比不上Intel的32位处理器虚拟地址向物理地址的解析高效(使用了页表这种定位结构),所以说,对于具有高密集度高效率要求的军队而言,一定要用定位结构而不是查找结构,这就是为什么马其顿方阵在当时可以横扫希腊到波斯的根本原因,同时我们也能看到秦王扫六和的时候也得益于秦军的高度组织性,不光可以将指令快速下达到部队的任何一个个人(虽然有点夸张,但相比未改革的东方六国而言,就是英军和清军的差别了吧,相比东方六国依然大量采用贵族军队而言,秦国的普遍征兵制度以及高效的编制和指挥系统俨然就是当时的新型军队),甚至连武器制造也高度标准化,联合户口登记制度,甚至可以快速定位到任何一把剑是住在哪里的哪个人铸造的,如此高效的系统,试看天下谁能敌!
虽然同样是定位个人,定位普通居民和定位军人完全不同,税收关乎生死,但并不决定生死的瞬间,民间一人漏税可能瘙痒之切肌不足感,然则军中一人溃逃可引发全军覆没,孰轻孰重。
类比回计算机网络专业领域,定位普通居民犹如IP寻址,定位军人则好似内存定位。
后记
我常想,写一篇文章要不要非得画图。要不要呢?
自幼喜欢日本漫画和日本影视剧,发现日本人对于一个问题特别善于使用图解的方式,漫画发达的本身就是此一大体现。金庸洋洋洒洒几卷本纯文字,大抵看来也就跟《七龙珠》异曲同工吧,总之读罢都有一种对主人公“此人多猛”的感慨,每闭目YY,映入眼帘的无论是张无忌还是龙珠孙悟空,给人的感觉是一样的,都是空有绝世神功却性格善良不善进击的主,要问我愿成为谁人,二人随意即可!然而对比看来,《七龙珠》主体使用了图画而文字退化到了对白注解,《倚天屠龙记》则全乎文字,此则表达了作者性情之大不同,背后关乎民族性之大不同(日本AV影视之发达是否得益于此性格,暂不论)。对于欧美发达国家,英国人同样却总是奢望用优雅的文字表达一切而鄙视作图,这奢望还往往成真。哪个是对的?哪个是应该学习的?