最近要跟一些小白讲授网络知识,在这里打个草稿。
很多计算机网络的课程,上来就讲网络分为多少多少层,每一层都是实现什么样功能等等。一大堆专业术语铺面而来,初学者往往云里雾里,不知所云。然后就开始讲网络参数的配置,什么IP、子网掩码的一顿计算,初学者到这里可能就放弃了。
这样教学不行。我们得先搞明白,网络为什么要这样设计,才能加深对网络技术的理解。而“为什么这样设计”,这个话题并不需要什么专业术语就能讲得清楚。因为网络设计遇到的难题,往往和我们日常生活中遇到的困难本质是相似的,不需要专业的技术背景,只要一个人有常规的生活经验,他就能够理解。
例如,为什么现在网络要分层?一台机器要发送一条消息给另一台机器,为什么要把数据一层层的传递到网卡,然后再沿着路由器一跳一跳的传递到对方网卡,再一层层的恢复数据呢?为什么不直接把数据原封不动的发给对方呢?
其实,只需要思考一下,你在网上买一双鞋,为什么需要打包装箱送至转运站,然后大货车从一个转运站送到另一个转运站,有的包裹还能乘坐飞机或者轮船,再由快递小哥骑着小三轮给你放在驿站或者送到你手里。最后,在你的满怀期待下,鞋子从层层包裹中取出。为什么不是店家直接把鞋子递到你手里?古时的确存在这种以物易物的形式,但交易效率低下。想明白了物流体系面临的困难和演进,就能够理解网络设计面临的挑战和解决方案。所以,一个网络优化专家,如果让他去搞物流优化,也一定是个好手。
在学习网络知识的道路上,这种迁移式思考比比皆是,往往能让思考者体验到开悟的乐趣,此时的知识才算是融会贯通。举一个例子,我们都知道IP是计算机在网络上的身份标识,我刚学计算机网络的时候就有疑惑,计算机网卡的MAC地址也是唯一的啊,为什么有了MAC地址还要IP呢,这不是多此一举吗?后来,我类比到现实生活中,人的身份证也是唯一的,为什么我们还需要手机号呢?再畅想下去,倘若没有手机号,每个人联系另一个人,就拨打他的身份证号,这会出现什么问题呢?这个问题,在计算机网络里对应怎样的问题呢。随着对应关系一点点的建立,相关的网络知识就彻底被吸收消化了。
而且现代脑科学表明,这种不同领域间对应关系的建立,是生理层面的“打通经络”,你的脑神经元会形成新的通路。也就是说,你的思维方式跟之前相比,已经发生了变化。恭喜你,你完成了一次真正的认知升级!
再举一个例子。好多初学者碰到子网掩码都头疼,为什么要有子网掩码这个设定?
我们再来类比一下。日常生活中,管理汽车靠车牌号。一看车牌前两位是辽A
,就知道是沈阳的车。从 辽A00000
到 辽AZZZZZ
大概有三千万个车牌,所以目前是足够用的。
那我们假想一下,假如沈阳变得特别宜居,全辽宁四千二百多万人,有四千万人都搬到沈阳定居了,人人都有小汽车。现有的三千多万车牌号不够分的了,在不允许增加车牌号个数(仍然是7位)和增加可用字符(仍然是0~9和英文字母)的条件下,我们怎么划分车牌号呢?
计算机网络世界面临的就是这个情况。IP资源很紧张,但是网络终端大小分布不均匀,很多局域网内可能就几十台终端,而若干网内有上百万台终端,就像我们假想中的辽宁人口分布一样。人口分布不均衡时,我们就需要一种灵活的车牌号划分方式。
例如:本来前两位是辽B
的车代表属于大连,现在用三位“辽B0
”开头的车表示属地为大连,腾出来的“辽B1
” ~ "辽BZ
"开头的车牌都可以分配给沈阳。如果一个极端的情况下,一个城市只有不到20辆车,我们甚至可以用前六位“辽Z0000
”来代表这个城市,剩下一位0 ~ Z,也足够分配给这20辆车了。所以,我们需要一个额外的信息来表征“前几位用来代表城市”,这个信息可以用一个1~7的整数M
来表示就行。
例如,辽A99993/6
代表这是城市“辽A9999
”的第“3
”号车;辽A99993/2
代表城市“辽A
”的第“99993
”号车…… 人口多的城市M
就小,人口少的城市M
就大,从而实现了可用车牌数的灵活分配。
如果上面的内容,你听明白了,那么子网掩码就很容易理解了。
上面的城市
对应的是网络号
;第几号车
代表的是主机号
。而M
就是子网掩码,用来表征“前多少位是网络号
”。我们IP地址是32位的二进制数,所以M
的取值就是1~32.
由于计算机擅长处理二进制,实际中常使用的是M
的另一种等价表达方式。
例如M
=5,就代表前五位是“1
”,后面都是 0
的32位二进制数来表示,也就是 11111000 00000000 00000000 00000000
,为了书写方便,又会把上面的二进制转换成十进制,也就变成了248.0.0.0
。