子网掩码 (Subnet Mask) 是一个 32 位的二进制数字,它与 IP 地址一起使用,用于标识一个 IP 地址的哪一部分是网络地址 (Network Address),哪一部分是主机地址 (Host Address)。简单来说,它就像一个“模板”,帮助计算机理解一个 IP 地址属于哪个网络,以及在这个网络中,它具体是哪一台主机。

子网掩码的规则非常简单:

  • 网络位 (Network Portion):在子网掩码中,所有用于标识网络的位都设置为 1

  • 主机位 (Host Portion):在子网掩码中,所有用于标识主机的位都设置为 0

因此,子网掩码的二进制表示形式总是由一串连续的 1 和一串连续的 0 组成,且 1 总是出现在 0 的前面。

为什么需要子网掩码?

IP 地址的设计是为了在全球范围内唯一标识设备。最初,IP 地址被简单地划分为 A、B、C 三类,每类地址都有固定的网络位和主机位。然而,这种简单的划分方式存在一些问题:

  • IP 地址浪费:例如,一个 B 类地址有 65534 个主机位,如果一个组织只需要几百台主机,那么剩下的 IP 地址就会被浪费。

  • 广播风暴:在一个大型网络中,所有的设备都处于同一个广播域。当一台设备发送广播消息时,所有设备都会收到,这会消耗大量的网络带宽和设备资源,导致“广播风暴”。

  • 网络管理困难:大型扁平网络难以管理和维护。

为了解决这些问题,引入了 子网划分 (Subnetting) 的概念,而子网掩码正是实现子网划分的关键。通过子网掩码,我们可以将一个大的网络进一步细分为更小的、更易于管理的子网。

子网掩码的表示方式

子网掩码通常有两种表示方式:

  1. 点分十进制表示法 (Dotted-Decimal Notation):这是最常见的表示方式,与 IP 地址类似,将 32 位二进制数字分成四组,每组 8 位,然后将每组转换为十进制数,并用点分隔。

    • 例如:255.255.255.0

  2. CIDR (Classless Inter-Domain Routing) 表示法:这种表示法在 IP 地址后面加上一个斜杠 / 和一个数字,表示子网掩码中连续的 1 的位数 (即网络位的位数)。

    • 例如:192.168.1.0/24 表示网络位有 24 位,对应的子网掩码是 255.255.255.0

子网掩码的计算

子网掩码的计算主要是根据网络的需求,从主机位中“借用”一部分作为子网位。

计算步骤:

  1. 确定原始 IP 地址类别和默认子网掩码:

    • A 类地址1.0.0.0126.255.255.255。默认子网掩码:255.0.0.0 (/8)

    • B 类地址128.0.0.0191.255.255.255。默认子网掩码:255.255.0.0 (/16)

    • C 类地址192.0.0.0223.255.255.255。默认子网掩码:255.255.255.0 (/24)

  2. 确定需要划分的子网数量或每个子网所需的主机数量:

    • 如果已知子网数量:使用公式 2^n >= 需要的子网数,计算出需要从主机位中借用的位数 n

    • 如果已知每个子网所需主机数量:使用公式 2^m - 2 >= 需要的主机数,计算出每个子网需要保留的主机位数 m。然后,从原始主机位数中减去 m,得到借用的位数 n

  3. 计算新的子网掩码:

    • 将默认子网掩码中对应的 n 个主机位从 0 变为 1。

    • 将新的二进制子网掩码转换为点分十进制形式。

示例:将 C 类网络 192.168.1.0 划分为 8 个子网。

  1. 原始信息:

    • IP 地址类别:C 类

    • 默认子网掩码:255.255.255.0 (二进制 11111111.11111111.11111111.00000000)

    • 原始网络位:24 位

    • 原始主机位:8 位

  2. 计算借用位数:

    • 需要 8 个子网。

    • 2^n >= 8。当 n = 3 时,2^3 = 8,所以需要借用 3 位主机位作为子网位。

  3. 计算新的子网掩码:

    • 新的网络位 = 原始网络位 + 借用位数 = 24 + 3 = 27 位。

    • 新的子网掩码的二进制表示:前 27 位为 1,后 5 位为 0。 11111111.11111111.11111111.11100000

    • 转换为点分十进制:255.255.255.224

子网掩码与子网数、主机数的关系

子网掩码是连接子网数和主机数的桥梁。理解它们之间的关系对于网络规划至关重要。

假设:

  • N:子网掩码中 1 的位数 (网络位)。

  • H:子网掩码中 0 的位数 (主机位)。

  • O_H:原始 IP 地址类别中的主机位数 (例如,C 类是 8 位,B 类是 16 位)。

  • n:从原始主机位中借用的位数,用于创建子网 (即子网位)。 n = N - (默认网络位)

  • m:每个子网中剩余的主机位数。 m = O_H - nm = H

  1. 子网数 (Number of Subnets):

    • 公式: 2^n

    • n 是从原始主机位中借用的位数(子网位)。这些位用于区分不同的子网。

    • 解释: 每多借用一位,理论上就可以将网络划分成两倍数量的子网。

  2. 每个子网的主机数 (Number of Hosts per Subnet):

    • 公式: 2^m - 2

    • m 是每个子网中剩余的主机位数。

    • 解释: 减去 2 是因为每个子网都有两个不能分配给设备的特殊地址:

      • 网络地址 (Network Address):所有主机位为 0 的地址。它代表整个子网。

      • 广播地址 (Broadcast Address):所有主机位为 1 的地址。它用于向子网内的所有设备发送消息。

继续上面的例子 (192.168.1.0/27):

  • 原始主机位 (O_H):8 位 (C 类地址)

  • 子网掩码网络位 (N):27 位

  • 默认网络位:24 位

  • 借用位数 (n)27 - 24 = 3

  • 子网数: 2^n = 2^3 = 8 个子网。

  • 剩余主机位 (m)O_H - n = 8 - 3 = 5 位。

    • 或者直接看新的子网掩码中 0 的位数:32 - 27 = 5 位。

  • 每个子网的主机数: 2^m - 2 = 2^5 - 2 = 32 - 2 = 30 台主机。

总结表格:

概念

与子网掩码的关系

计算公式

网络位 (N)

子网掩码中 1 的数量

主机位 (H)

子网掩码中 0 的数量

32 - N

子网位 (n)

借用的主机位,从默认子网掩码的主机位中分离出来,成为新的网络位的一部分

N - (默认网络位)

每个子网的主机位 (m)

剩余的主机位,用于分配给子网中的设备

H(原始主机位) - n

子网数

借用的子网位 n 决定了可以划分多少个子网

$2^n$

每个子网可用主机数

剩余的主机位 m 决定了每个子网可以有多少台设备

$2^m - 2$ (减去网络地址和广播地址)

理解这些概念对于网络管理员进行 IP 地址规划、网络设计和故障排除至关重要。通过有效地进行子网划分,可以构建更高效、更安全和更易于管理的企业网络。