32位的IP地址空间总计有40多亿个可用IP地址,如果你是互联网创建之初的设计者,你会怎么分配这些IP?你可能会说一个一个地分吧,请求一个给一个。这不失为是一个方案,但是面对这么多的IP地址,这种“扁平”的管理方式真的有效吗?如果是给一个组织甚至国家批量分配P呢?就像是在一个文件夹下管理40多亿个文件一样,这种处理方式真的明智吗?显然,当时的设计者并没有采取这种简单直白的做法,而是像我们管理大多数信息一样对信息进行了“分门别类”,同样是40多亿个文件,如果按照某种规则或特征把它们分散放置到多个文件夹或子文件夹下一定会极大地方便管理。
于是问题来了:怎么分?
如果把IP地址看作是一个家庭住址,那么在家庭住址中自然有省、市、街道、小区这样的层级划分,逐级缩小范围后定位到一个门牌号上。如果我们给省、市、街道都编好号,再和门牌号拼在一起,我们得到的这样一长串数字就可以唯一地标识一个家庭住址,同样,IP地址有32位的长度,如此之长的一个编码,为什么不可以取出前几位作为一个“区域”的地址,把剩余的几位作为它在这个区域下的”相对“地址呢?这样一个IP地址就可以视作两部分,前面是它的“区域“地址,后面是它在这个”区域“内的”相对“地址,是的,这正是子网掩码所要解决的问题,按照规范的叫法,通过子网掩码标识出的所谓的“区域“地址就网络地址,也叫网络标识,网络ID或子网地址,而所谓的“相对“地址就主机地址。
这样看上去好了很多,但是不知道你有没有敏锐地察觉到子网掩码对IP地址的划分与我们举例的家庭住址的划分有一个明显的不同,那就是前者只能划分两级:网络地址和主机地址,而后者则是多级划分。子网掩码只能实现两级划分带来了一个问题,那就是同样一个IP:67.101.121.131,它的子网掩码有可能是255.0.0.0,也可能是255.255.0.0,也可能是别的什么值,于是,对于一个给定的IP,特别是公网的IP,在不知道子网掩码的时候会导致对该IP有多种不同的解读,就像上面的例子,67.101.121.131可能是子网67.0.0.0下的一个主机,也可能是子网67.101下的一个主机,很显然,这种歧义性导致这个IP还是不可用,是的,我们还是漏了点什么,让这套描述机制暂时无法工作,我们需要找到问题的原因并堵上这个窟窿。
这最后一个需要解决漏洞可以描述为:由于子网掩码只具有”两级“(网络地址和主机地址)划分能力,而它的切分粒度又可变(即如果切出的子网少,则子网可以容纳的机器数量就多,如果子网多,则可以容纳的机器数量就小)这种不确定的划分方式必然会导致IP含义的不确定性,所以要解决这个问题就必须要规定好:以哪些值为开头的IP它的子网掩码默认是255.0.0.0,以哪些值为开头的IP它的子网掩码默认是255.255.0.0,以此类推。这实际上就是IP地址分类。
补上地址分类的概念之后,我们再来重新比较一个IP地址空间的划分与我们举例使用的家庭住址这类具有典型层级关系的信息划分之间有什么不同。如前面所述,最大的不同在于IP地址空间只能划分两个层级,为了能够适应不同规模(粒度)的IP分配要求,IP地址空间必需要划分出多种不同规模(粒度)的子空间,并且规定好哪些是大规模(粒度)的子空间,哪些是小规模(粒度)的子空间。然后,再结合IP地址和子网掩码就可以准确地定位了。可以说IP地址、子网掩码和地址分类这三个要素一起实现了对IP地址空间的划分与寻址,三者任何一个元素的缺失都会带来逻辑上的漏洞。
最后一个问题:同样的,在一个局域网里,理论上我们也有需要切分出大小不等的子网的需求,这也需要对IP地址进行分类,比如在10.0.0.0/8的网路里划分10.0.0.0/16 ~ 10.127.0.0/16和10.128.0.0/24 ~10.191.255.0/24 等等 至于是否可行以及如何操作待有机会和网络管理员请教一下。