这篇文章介绍一下IPV4地址的分类,以及子网掩码相关的知识。

IPV4 地址由4个Byte组成,格式如下:

byte1.byte2.byte3.byte4

如192.168.2.3。

其中,byte1非常重要,它可以用来给IP地址进行分类。 IP地址的分类如下图所示:

class 差值 example network number #network number host number #host number
A: 1 ~ 127 127 24.0.0.0 byte1 127 byte2 ~ byte4 256^3 - 2 = 16777
B: 128 ~ 191 64 150.18.0.0 byte1 ~ byte2 64 * 256 = 16384 byte3 ~ byte4 256^2 - 2 = 65534
C: 192 ~ 223 32 193.23.210.0 byte1 ~ byte3 32 * 256^2 = 2097152 byte4 256 - 2 = 254
D: 224 ~ 239 16 224.0.0.10 - Multicast - -
E: 240 ~ 255 16 reserved - - - -

表中“差值”这一列是我自己添加的,意思是每一类地址byte1上下限之间的差值,目的是 可以快速判别IP地址的类别。只要记住A类IP地址是从1~127,剩下的就可以由A类IP地址 上下限加上差值就可以算出范围。比如对于IP地址222.3.4.2,因为1+127+64 <= 222 <= 127+64+32, 所以是C类。

A,B,C类IP地址的4个byte会被分为“network number”(网络号)和“host number”(主机号)两部分,我们可以想象一根线,线的 左边是“network number”,右边是“host number”:

network number | host number

表中的“#network number”和“#host number”两列,说明的是每一类IP地址可以表示的网络号和主机号的个数。 值得一提的是,“#host number”一列的表达式中都有一个“-2”部分,意思是要减去两个特殊的地址, 一个是子网地址,对应主机号全二进制0;一个是广播地址,对应主机号全二进制1。

好,在说完了IP地址相关知识后,我们来说说子网掩码(Subnet Mask)。

要说子网掩码与默认网络掩码(Default Network Mask)相对,它解决了后者存在的问题。 我们先来说这个默认网络掩码及它存在的问题,然后再来看看子网掩码是如何解决这些问题的。

我们知道掩码是为了从一个IP地址中得到它的网络号(Network Number),那么默认网络掩码就是 把A~C类IP地址的network number全变成255(二进制1),host number全变成0(二进制0),如下表所示:

class Default Network Mask
A: 1 ~ 127 255.0.0.0
B: 128 ~ 191 255.255.0.0
C: 192 ~ 223 255.255.255.0

但是这样划分子网的话就很难搞,因为一个子网必须满足两个条件:

  1. 每个子网必须有一个独立的标识符(network number)

  2. 每个子网节点必须有一个独立的地址(host number)

所以要是按照默认子网掩码的话,每一类IP地址就最多只能划分一个子网,这显然不符合现实的需求。 所以,为了解决这个问题,我们可以把分割线往左移,使得网络号多几位,主机号少几位。这样得到的 掩码,就是子网掩码。

举个例子解释一下:对于网络号为172.16.0.0 /16,要分57个子网,那么它们的子网掩码是多少?

解决这个问题,我们先判断这个IP地址的类别,一看是B类,那么我们就知道它的分割线在正中间, 后面两个byte是主机号。然后要分57个子网,因为 2^5 < 57 < 2^6,所以我们应该把线往右移6位, 第三个byte就变成了这个样子:

network number  host number
     |          |
     V          V
0 0 0 0 0 0 | 0 0

然后,我们根据掩码规则:网络号全二进制1,主机号全二进制0,得到它的子网掩码为: 255.255.252.0

Easy, right?

BTW: 172.16.0.0 /16中的/16代表的是网络号的位数,此时是16位,也就是前两个byte。在划分完57个子网后, 网络号多了6位,所以/16应该变成/22

以上。