1. 简介

在进行网络设计时,我们常常需要知道一个子网中需要多少IP地址,并确定这个子网的地址范围,以便为每个设备分配地址。

本文将介绍一个简单的方法,根据给定的子网掩码计算出对应的IP地址范围。


2. 问题说明

IPv4地址是一个32位的数字,通常以四个8位的“八位组”(octet)表示,例如 192.168.0.1。子网掩码通常以 /x 的形式表示(如 /24),也可以写成点分十进制形式(如 255.255.255.0)。

我们的目标是:给定一个IP地址和子网掩码,求出该网络中可用的IP地址数量,以及地址范围的起始和结束地址。

例如:192.168.0.1/24 表示有 256 个地址,范围从 192.168.0.0192.168.0.255


3. 算法思路

3.1 地址总数计算

子网掩码长度为 x 时,可用地址数量为:

2^(32 - x)

例如:

  • /242^(32-24) = 256
  • /302^2 = 4
  • /322^0 = 1(仅一个地址)

3.2 子网掩码的二进制表示

子网掩码是前 x 位为 1,其余为 0 的 32 位二进制数。

例如 /24

11111111 11111111 11111111 00000000
= 255.255.255.0

4. 起始地址计算

使用 按位与操作&)将IP地址与子网掩码进行运算,即可得到网络地址(起始地址)。

示例:192.168.0.10/24

IP地址(二进制) 11000000 10101000 00000000 00001010
子网掩码 11111111 11111111 11111111 00000000
按位与结果 11000000 10101000 00000000 00000000
起始地址 192 168 0 0

✅ 得到起始地址为:192.168.0.0


5. 结束地址计算

使用 按位或操作|)将起始地址与子网掩码的按位取反结果进行运算,即可得到结束地址。

继续上例:

子网掩码(二进制) 11111111 11111111 11111111 00000000
按位取反 00000000 00000000 00000000 11111111
起始地址 192 168 0 0
按位或结果 192 168 0 255

✅ 得到结束地址为:192.168.0.255


6. 示例说明

示例一:192.168.0.10/30

名称 十进制表示 二进制表示
IP地址 192.168.0.10 11000000.10101000.00000000.00001010
子网掩码 255.255.255.252 11111111.11111111.11111111.11111100
起始地址 192.168.0.8 11000000.10101000.00000000.00001000
子网掩码取反 0.0.0.3 00000000.00000000.00000000.00000011
结束地址 192.168.0.11 11000000.10101000.00000000.00001011

地址范围:192.168.0.8 ~ 192.168.0.11


示例二:10.0.0.0/20

名称 十进制表示 二进制表示
IP地址 10.0.0.0 00001010.00000000.00000000.00000000
子网掩码 255.255.240.0 11111111.11111111.11110000.00000000
起始地址 10.0.0.0 00001010.00000000.00000000.00000000
子网掩码取反 0.0.15.255 00000000.00000000.00001111.11111111
结束地址 10.0.15.255 00001010.00000000.00001111.11111111

地址范围:10.0.0.0 ~ 10.0.15.255


7. IPv6 地址范围计算

IPv6地址是128位,表示为8个16进制段,例如:

2001:124A:2000:1000::/48

地址数量计算方式与IPv4相同:

2^(128 - x)

其中 x 是子网掩码长度。

示例:2001:124A:2000:1000::/48

名称 十六进制表示
IP地址 2001:124A:2000:1000:0000:0000:0000:0000
子网掩码 FFFF:FFFF:FFFF:0000:0000:0000:0000:0000
起始地址 2001:124A:2000:0000:0000:0000:0000:0000
子网掩码取反 0000:0000:0000:FFFF:FFFF:FFFF:FFFF:FFFF
结束地址 2001:124A:2000:FFFF:FFFF:FFFF:FFFF:FFFF

地址范围:从 2001:124A:2000::2001:124A:2000:FFFF:FFFF:FFFF:FFFF:FFFF

⚠️ IPv6地址支持简写形式,例如:

  • 2001:124A:2000:0000:0000:0000:0000:00002001:124A:2000::
  • 2001:124A:2000:0:0:1234:: → 合法简写
  • 2001::1234:: → ❌ 非法,只能有一个 ::

8. 时间复杂度分析

  • 时间复杂度O(1),因为只需要进行位运算和简单数学计算
  • 空间复杂度O(1),不依赖额外数据结构

9. 小结

本文介绍了如何根据子网掩码快速计算IPv4和IPv6地址的范围。关键点如下:

  • 地址总数 = 2^(32 - x)(IPv4)或 2^(128 - x)(IPv6)
  • 起始地址 = IP & 子网掩码
  • 结束地址 = 起始地址 | (~子网掩码)
  • IPv6地址支持简写,但要小心 :: 只能使用一次

掌握这些基本运算,有助于快速进行网络规划和调试。


原始标题:Calculating the Range of IP Addresses from Subnet Mask