本文转自 51CTO 的作者「百年求索」——《可变长度子网掩码(VLSM)在子网划分中的应用》。

原文链接: https://blog.51cto.com/mmanong/1945144

  在学习可变长度子网掩码时,必须先熟练掌握二进制与十进制的转化、计算机中数据的单位(字节、位)等知识。

1. 什么是可变长度子网掩码?

  要理解可变长度子网掩码,先要理解子网掩码;要理解子网掩码,先要理解 IP 地址的组成。

  在互联网上,每台计算机必须有一个唯一的 IP 地址作用这台计算机在身份标志,可以将 IP 地址理解成一台计算机的身份证号码。在互联网上不允许出现相同的IP地址(NAT 技术另论,它是一种 IP 地址共享技术,用于解决IP地址资源不足的问题)。身份证的编号要按照一定的规则进行,同样,IP 地址的编号也要按照一定的规则进行。

1.1 一个 IP 地址由 4 个字节组成,采用点分十进制方式表示

  例如,一个4个字节的 IP 地址的二进制形式是:11000000 10101000 11000111 00000001,其点分十进制表示就是将每个字节依次转化为十进制并用点分隔开,即:192.168.199.1。

  在全国计算机等级考试一级中常会出现一道这样的题目:

  判断以下 IP 地址哪个是正确的 IP 地址()?

  (A)192.256.4.4 (B)124.45.2.3.3 (C)45.21.4.3 (D)78.4.5   很明显正确答案是 C。

  A 错在点分十进制表示的 IP 地址中,每个点分隔开的数值不能大于 255,因为一个字节转化为十进制最大为 255;B、D 错在 IP 使用点分十制表示是 4 段(三个点分隔开4个十进制数)。

1.2 IP 地址的分类

类别 第一个字节:二进制 第一个字节:十进制 示例 IP 子网掩码
A 类 0000 0001 ~ 0111 1110 1 ~ 126 12.0.0.1 255.0.0.0
B 类 1000 0000 ~ 1011 1111 128 ~ 191 133.25.0.4 255.255.0.0
C 类 1100 0000 ~ 1101 1111 192 ~ 223 200.18.19.4 255.255.255.0
D 类 1110 0000 ~ 1110 1111 224 ~ 239 - -
E 类 1111 0000 ~ 1111 1110 240 ~ 154 - -
  IP 地址是以第一个字节进行分类的,可分为五类:A、B、C、D、E。D 类地址用于多点广播,E 类地址用于科研、保留(目前找不到具体的应用资料),这两类地址不在本文中讨论。

1.3 各类 IP 地址的特征及判断依据

  A 类地址:第一个字节第一位二进制位为 0,第一个字节十进制值为 [1,126];

  B 类地址:第一个字节前两位二进制位为 10,第一个字节十进制值为 [128,191];

  C 类地址:第一个字节前三位二进制位为 110,第一个字节十进制值为 [192,223];

  D 类地址:第一个字节前四位二进制位为 1110,第一个字节十进制值为 [224,239];

  E 类地址:第一个字节前五位二进制位为 11110,第一个字节十进制值为 [240,254]。

  在全国计算机计算机等级考试一级中,经常给出多个 IP 地址,判断这些 IP 地址所属的类别,判断的方法就是根据第一个字节的前几位二进制值或第一个字节的十进制进行判断的。

1.4 IP 地址由两部分组成:网络号与主机号

  身份证号前两位表示省代码,3、4位表示市代码,5、6位表示区代码。通过每位赋予不同的意义可以分解出身份证的信息。IP 地址也一样,一个 IP 地址包含两部分信息,一部分代表 IP 地址是属于哪个网络的,另一部分代表 IP 地址在这网络中的编号是多少。IP 地址属于哪个网络称之为该 IP 地址的网络号,IP 地址在其网络中的编号称之为该 IP 地址的主机号,而且,网络号在前,主机号在后。(备注:D、E两类地址不区分网络号与主机号)

1.5 通过子网掩码计算网络号与主机号

  子网掩码与 IP 地址的表示类似,也是使用 4 个字节(32bit)表示,也可以用点分十进制表示。只是子网掩码没有网络号、主机号之分了,而且它只有与 IP 地址一起合用,用于计算 IP 地址的网络号与主机号才有意义。

  4 个字节(32位)的子网掩码组成:N 个 1 后面跟着 M 个 0(N + M = 32)。

  A 类地址,子网掩码为 11111111 00000000 00000000 00000000(二进制),即 255.0.0.0。

  B 类地址,子网掩码为 11111111 11111111 00000000 00000000(二进制),即 255.255.0.0。

  C 类地址,子网掩码为 11111111 11111111 11111111 00000000(二进制),即 255.255.255.0。

  通过子网掩码计算网络号与主机号的方法是:将 IP 地址转化为二进制数,再与其对应的子网掩码(二进制数)进行与运算,运算结果是网络号,剩下的是主机号。   例如:

  随便取一个 A 类地址 25.4.5.6,其子网掩码是 255.0.0.0,网络号与主机号的计算方式如下:

    ① 25.4.5.6 的二进制形式为:00011001 00000100 00000101 00000110;     

    ② 子网掩码的二进制形式为:11111111 00000000 00000000 00000000;     

    ③ 将这两个数进行与运算,得到 25.0.0.0;     

    ④ 则该 IP 地址的网络号是 25.0.0.0,主机号是 4.5.6。

  随便取一个 B 类地址 146.100.15.96,其子网掩码是 255.255.0.0,网络号与主机号的计算方式如下:     ① 146.100.15.96 的二进制形式为:10010010 01100100 00001111 01100000;

    ② 子网掩码的二进制形式为:11111111 11111111 00000000 00000000;

    ③ 将这两个数进行与运算,得到 146.100.0.0;

    ④ 则该 IP 地址的网络号是 146.100.0.0,主机号是 15.96。

  随便取一个 C 类地址 198.150.1.6,其子网掩码是 255.255.255.0,网络号与主机号的计算方式如下:     ① 198.150.1.6 的二进制形式为:11000110 10010110 00000001 00000110;

    ② 子网掩码的二进制形式为:11111111 11111111 11111111 00000000;

    ③ 将这两个数进行与运算,得到 198.150.1.0;

    ④ 则该 IP 地址的网络号是 198.150.1.0,主机号是 6。

  备注:将点分十进制的IP地址转化为二进制时,如果转化后不足 8 位,要在前面补 0,补到 8 位满为止。

  通过上面的计算,可以观察到,对于有类地址:A 类 IP 的网络号就是前面一个字节(或者前面 8 个 bit 位),B 类 IP 的网络号就是前面两个字节(或者前面 16 个 bit 位),C 类 IP 的网络号就是前面三个字节(或者前面 18 个 bit 位),剩余部分就是其主机号。

1.6 IP 地址中的保留地址和私有地址

序号 地址 说明
1 0.0.0.0 路由表中默认路由使用
2 255.255.255.255 通常在广播中使用
3 127.0.0.0 ~ 127.255.255.255 保留地址,常用做循环测试用的,也代表本机地址
4 10.0.0.0 ~ 10.255.255.255 A 类私有地址
5 169.254.0.0 ~ 169.254.255.255 保留地址
6 172.16.0.0 ~ 172.31.255.255 B 类私有地址
7 192.168.0.0 ~ 192.168.255.255 C 类私有地址

私有地址:供内部的局域网使用,不能在公网使用。

保留地址:特殊用途。

  每个网络中还有两个地址不能使用:一个是主机位全为 0,用于表示这个网络使用,另一个是主机位全为 1,用于这个网络的广播使用。

  例如:A 类 12.5.4.3/8(通常在 IP 地址后面加上/N用于表示子网掩码的位数),其 IP 地址的二进制表示是 00001100 00000101 00000100 00000011,子网掩码的二进制是 11111111 00000000 00000000 00000000,其网络号 00001100 00000000 00000000 00000000(12.0.0.0),后面三个字节用于表示主机号。

  主机号上的二进制全为 0 时,即 00001100 00000000 00000000 00000000(12.0.0.0),这个地址不能用于表示主机;当主机号全为 1 时,即 00001100 11111111 11111111 11111111(12.255.255.255),这个地址也不能用于表示主机(它用于 12.0.0.0 这个网络的广播使用)。

1.7 三类网络的数量与每个网络的主机数

类别 网络数 表示主机的二进制位数 每个网络中的主机数
A 类 126 后面三个字节共 24 位 $ 2^{24} - 2 = 16777214 $
B 类 约 $ 2^{14} = 16384 $ 后面两个字节共 16 位 $ 2^{16} - 2 = 65534 $
C 类 约 $ 2^{21} = 2097152 $ 后面一个字节共 8 位 $ 2^8 - 2 = 254 $

2. 可变长度子网掩码能干什么?

  在现实中,如果将一个 A 类网络分配给一个组织使用,但是这个组织内部的计算机又没有 16777214 这么多台,这就会造成大量的 IP 地址闲置与浪费。因此,需要有一种更加灵活的方式根据网络规模的大小来划分网络。思路就是将一个网络再划分为更小的多个子网,以供不同组织使用。这种划分网络的方式所使用的技术就是可变长度子网掩码(VLSM)。可变长度子网掩码在公网与企业内部中都可以使用。

  采用可变长度子网掩码,网络的类别已不重要了,网络中主机的数量也不是固定的,而是依据实际情况的需要而确定。为了实现灵活的网络大小规划,在网络号与主机号中间增加了一个概念——子网。子网概念的增加并没有改变 IP 地址的实际长度,而是采用:从表示主机的二进制位的位数中借用一定的位数来表示子网的方法实现(网络中主机数会减少)。同时,子网掩码也不再是 8 位、16、24 位这些 8 的倍数了,它会根据实际需要使用不同的位数来表示网络号。

  例如:146.45.182.6/20。表示 IP 地址是 146.45.182.6,子网掩码是 20 位,即 255.255.240.0。子网掩码的二进制表示形式是:11111111 11111111 11110000 00000000,下划线共标出 20 位。

  该地址如果按类分是个 B 类地址,子网掩码应该是 255.255.0.0,即 16 位,主机数应该可达 65534。而采用可变长度子网掩码后,子网掩码是 255.255.240.0,即 20 位,主机数减少了(用于表示主机的二进制位拿出 4 位,表示子网)。

  该 IP 地址的网络号、主机数的计算方法如下:

  ① 146.45.182.6 的二进制形式为 10010010 00101101 10110110 00000110;

  ② 255.255.240.0 的二进制形式为 11111111 11111111 11110000 00000000;

  ③ 将这两个数进行与运算,得到 10010010 00101101 10110000 00000000;

  ④ 再将结果转为十进制为 146.45.176.0,即为网络号。   

  总共是 32 位,网络位用掉了 20 位,还剩 12 位的主机位。则主机数为 $ 2^{12} - 2 = 4094 $,这里减2是去掉全 0 和全 1 的两个 IP。

  网络中可用的 IP 地址从 10010010 00101101 10110000 00000001(146.45.176.1)到 10010010 00101101 10111111 11111110(146.45.191.254)。

  综上所述,该 IP 地址的网络号为 146.45.176.0,广播地址为 146.45.191.255,子网掩码为 255.255.240.0。

广播地址:指主机号全为 1 的地址。也就是将 10010010 00101101 10110000 00000000 中下划线部分全部置为 1 。

3. 怎么确定可变子网掩码的长度?

  确定可变子网掩码长度的过程其实就是划分子网的过程。

  当从主机位中借 1 位二进制位时,当前网络可划分出 2 个子网,每个子网主机数是原来的 $ \frac{1}{2} - 2 $;当从主机位中借 2 位二进制位时,当前网络可划分出 4 个子网,每个子网主机数是原来的 $ \frac{1}{4} - 2 $ …… 当从主机位中借 N 位二进制位时,当前网络可划分为 $ 2^N $ 个子网,每个子网主机数是原来的 $ 2^{-N} - 2 $。

  例如:192.168.10.0/24 这个 C 类网络要划分出 2 个相等主机数的子网,则:

  1. 网络号与子网掩码转为二进制:

    网络号 192.168.10.0 转换为二进制是

    子网掩码 255.255.255.0 转换为二进制是

  2. 要把一个网络划分成两个相等子网,子网掩码要加 1 位,变成

  3. 网络号从主机位借一位用于子网 11000000 10101000 00001010 XYYYYYYY;X 位代表借入的,用于表示子网号,7 个 Y 代表剩余主机位,X 有两个值 0 和 1。

    ①当 X 为 0 时,即

    若 Y 全为 0,表示划分出的这个子网的网络号为

    其主机可用 IP 地址范围是

    ②当 X 为 1 时,即

    若 Y 全为 0,表示划分出的这个子网的网络号为 11000000 10101000 00001010 10000000

    其主机可用 IP 地址范围是

  综上所述,192.168.10.0/24 要划分成两个相等主机数的子网,子网掩码要改为 25 位,划分出的两个子网情况是:

    子网 1:网络号:192.168.10.0,子网掩码:255.255.255.128,广播地址:192.168.10.127,主机 IP 地址范围:192.168.10.1 至 192.168.10.126。

    子网 2:网络号:192.168.10.128;子网掩码:255.255.255.128;广播地址:192.168.10.255,主机 IP 地址范围:192.168.10.129 至 192.168.10.254。

  在子网划分的实际应用中,制定子网划分的方案,要首先确定子网的规模,即子网包含的主机数是多少,再根据主机数来确定要借用多少主机位用于表示子网。

  例如:某学校有个部门获得一个 C 类网络(地址段)的独立使用权,该网络(网段)为 192.168.20.0。该部门有三间机房和一间办公室,每间机房有 51 台计算机,办公室有 10 台计算机,机房和办公室都需要使用该网络(网段)。请为该部门做一份子网规划方案以满足这个部门的需要,要求每间机房、办公室的主机在各自的一个子网中。

  对一个网络进行子网划分,根据其每个子网需要容纳的主机数来确定需要从主机位中借几位的二进制位用于表示子网。假设一个子网的主机数有 51 台,则主机位最少要使用 6 个二进制位才能满足主机的编号,即 $ 2^{n} - 2 > 51 $(n 就是二进制的位数),也就是说,n 在这里至少取 6 才能满足要求。

  在现实应用中,对 C 类网络划分子网的应用明显比 A、B 两类多得多。对于一个 C 类的网络进行子网划分,可以参照下面总结的这张表:

- 表示没有再划分下去的必要了,即没有用于表示主机的编号了。

借主机位数 可划分子网数 每个子网可容纳下主机 掩码
1 $ 2^1 = 2 $ $ 2^7 - 2 = 126 $ 255.255.255.128
2 $ 2^2 = 4 $ $ 2^6 - 2 = 62 $ 255.255.255.192
3 $ 2^3 = 8 $ $ 2^5 - 2 = 30 $ 255.255.255.224
4 $ 2^4 = 16 $ $ 2^4 - 2 = 14 $ 255.255.255.240
5 $ 2^5 = 32 $ $ 2^3 - 2 = 6 $ 255.255.255.248
6 $ 2^6 = 64 $ $ 2^2 - 2 = 2 $ 255.255.255.252
7 - - -
8 - - -

备注:有些教科书中把划分出的子网再减 2,即借来的二进制位全 0 和全 1 代表的子网不使用,个人实践验证,使用也没有问题。

  通过对上面表格的参照,每间机房 51 台主机,如果加上网关就是 52 个 IP,30 < 52 < 62,为了最大化利用 IP 地址,应采用向主机位借 2 位的。即:

  机房一:子网络为 192.168.20.0,掩码为 255.255.255.192,IP 范围为 192.168.20.1 至 192.168.20.62,广播地址 192.168.20.63;

  机房二:子网络为 192.168.20.64,掩码为 255.255.255.192,IP 范围为 192.168.20.65 至 192.168.20.126,广播地址 192.168.20.127;

  机房三:子网络为 192.168.20.128,掩码为 255.255.255.192,IP 范围为 192.168.20.129 至 192.168.20.190,广播地址 192.168.20.191;

  办公室 10 台,如果加上网关是 11 个 IP,6 < 11 < 14,为了最大化利用 IP 地址,可采用向主机位借 4 位。其中借两位的 00、01、10(二进制代码)的子网已在三个机房中使用,可以从 11 开始再借 2 位。即:子网络为 192.168.20.192,掩码为 255.255.255.240,IP 范围为 192.168.20.193 至 192.168.20.206,广播地址 192.168.20.207。