Subnet Mask
这篇文章介绍一下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 |
但是这样划分子网的话就很难搞,因为一个子网必须满足两个条件:
-
每个子网必须有一个独立的标识符(network number)
-
每个子网节点必须有一个独立的地址(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
。
以上。