蛮荆

网络基础: 公网/子网 地址是如何分类的?

2017-09-10

概念

在计算机网络中,子网(Subnet)是将一个大的 IP 地址空间划分成若干个较小的网络单元的过程。每个子网都有一个唯一的子网标识符(Subnet ID)和一个子网掩码(Subnet Mask),用于确定子网的范围和边界。

IP 地址组成

IP 地址 = 网络号 + 主机号

网络号 表示主机 (或路由设备) 所连接到的网络,网络地址表示其属于互联网的哪个网络。

主机号 表示主机 (或路由设备) 属于该网络中的哪一台主机。

例如 IP 地址 192.168.1.100/24 中,前 24 位表示 (192.168.1) 网络部分,后 8 位 (100) 表示主机部分。

子网掩码

子网掩码表示网络号与主机号之间的边界。

子网掩码和 IP 地址一样分成 4 个部分、由十进制表示,例如网络部分的长度为 24 位,子网掩码则为 255.255.255.0。但是和 IP 地址不同的是,当使用二进制表示时,子网掩码一定是以连续的 1 开始,以连续的 0 结束。

子网范围

由于 IPv4 中地址枯竭的问题,RFC 专门定义了只在内部网络中使用的 IP 地址,也就是子网 (内网) 地址,每个地址分类提供了不同的子网地址范围, 网络部分相同的 IPv4 地址可以认为它们归属同一子网

IP 私有地址并没有什么特别的结构,只不过是将公有地址中没有被分配的一部分拿出来,规定这部分地址只能在内网使用而已。

CIDR

CIDR(Classless Inter-Domain Routing,无类别域间路由)基于可变长子网掩码进行任意长度的 IP 地址前缀,也就是说,主机部分也可以是任意长度。

表示方法:

$$ 前缀地址/前缀长度 $$

例如:192.168.1.0/24, 前缀地址是 IP 地址的开头部分,前缀长度是一个从 0 到 32 的整数,表示网络前缀的位数。

子网掩码:前缀长度是 24,所以子网掩码是 255.255.255.0

网络地址:192.168.1.0

广播地址:将主机对应的比特位全置为 1,即 192.168.1.255

可用主机地址范围:从 192.168.1.1 到 192.168.1.254(减去网络地址和广播地址),也就是 254 个主机地址


三类地址

IPv4 地址中前三类 (A, B, C) 公网地址网络部分与主机部分都是已经分配好的。

A 类

  • 地址范围: 1.0.0.0 ~ 126.255.255.255
  • 网络部分: 8 位
  • 主机部分: 24 位
  • 子网范围: 10.0.0.0 ~ 10.255.255.255 (10.0.0.0/8 或者 10/8)
  • 子网掩码: 255.0.0.0
  • 应用场景: 大规模网络

最大网络数量:

$$ 2^7 - 2 = 126 $$

每个网络最大主机数量:

$$ 2^24 - 2 = 16,777,214 $$

为什么网络数量是 126 ?

A 类地址的特征: 第一个字节的最高位(即最左边的位)始终为 0 (用于标记 A 类),后面的 7 位用于网络号。

但是有两个特殊的网络:

  • 0.0.0.0 表示默认路由或未知地址
  • 127.0.0.1 表示本地环回地址

所以 A 类地址的网络地址有效范围就等于: 01000000 (1) 到 01111110(126)。

为什么主机数量要减去 2 ?

因为 1.0.0.0 表示当前的网络地址,126.255.255.255 表示该网络的广播地址。

网络地址是该子网的第一个地址,表示网络本身,而广播地址是该子网的最后一个地址,用于向该子网中的所有设备发送广播消息,所以在该子网中,这两个地址不能被分配给任何设备使用。

B 类

  • 地址范围: 128.0.0.0 ~ 191.255.255.255
  • 网络部分: 16 位
  • 主机部分: 16 位
  • 子网范围: 172.16.0.0 ~ 172.31.255.255 (172.16.0.0/12 或者 172.16/12)
  • 子网掩码: 255.255.0.0
  • 应用场景: 中等规模网络

最大网络数量:

$$ 2^14 - 1 = 16383 $$

每个网络最大主机数量:

$$ 2^16 - 2 = 65534 $$

为什么网络数量是 16383 ?

B 类地址的特征: 第一个字节的最高前两位(即最左边的两位)始终为 10 (用于标记 B 类),后面的 14 位用于网络号。

所以 B 类地址的网络地址有效范围就等于: 10000000 (128) 到 10111111(191)。

但是实际上地址 128.0.0.0 不做分配,实际分配的是 128.1.0.0, 第一个可用网络地址为 128.1, 所以网络数量要在 2^14 的基础上再减去 1, 也就是 16383。

为什么主机数量要减去 2 ?

因为 128.0.0.0 表示当前的网络地址,191.255.255.255 表示该网络的广播地址。

C 类

  • 地址范围: 192.0.0.0 ~ 223.255.255.255
  • 网络部分: 24 位
  • 主机部分: 8 位
  • 子网范围: 192.168.0.0 ~ 192.168.255.255 (192.168.0.0/16 或者 192.168/16)
  • 子网掩码: 255.255.255.0
  • 应用场景: 小型规模网络

最大网络数量:

$$ 2^21 - 1 = 2,097,151 $$

每个网络最大主机数量:

$$ 2^8 - 2 = 254 $$

为什么网络数量是 2,097,151 ?

C 类地址的特征: 第一个字节的最高前三位(即最左边的前三位)始终为 110 (用于标记 C 类),后面的 21 位用于网络号。

所以 C 类地址的网络地址有效范围就等于: 11000000 (192) 到 11011111(223)。

但是实际上地址 192.0.0.0 不做分配,实际分配的是 192.0.1.0, 第一个可用网络地址为 192.0.1, 所以网络数量要在 2^21 的基础上再减去 1, 也就是 2,097,151。

为什么主机数量要减去 2 ?

因为 192.0.0.0 表示当前的网络地址,223.255.255.255 表示该网络的广播地址。

D 类地址

  • 地址范围: 224.0.0.0 ~ 239.255.255.255
  • 应用场景: 多播

D 类地址没有传统意义上的网络号和主机号的概念,因为它们不用于传统的单播通信,同时,D 类地址也没有子网掩码,因为其不涉及子网划分,多播用来标识一个多播组,而不是特定的网络和主机。

E 类地址

  • 地址范围: 240.0.0.0 ~ 255.255.255.255
  • 应用场景: 实验和未来用途,没有在常规通信中使用

E 类地址也没有传统的网络号和主机号的概念,因为它们是保留的,不用于实际网络通信。


特殊地址

主机号部分的比特全部为 0 时表示整个子网。

主机号部分的比特全部为 1 时表示向子网中的所有设备发送广播。

图片来源: 网络是怎样连接的(户根勤)

0.0.0.0

有的教材上注明: A 类地址的范围是 0.0.0.0 ~ 127.255.255.255,但是 0.0.0.0 用于表示默认路由或未知地址 (一般表示当前主机),不属于有效的 A 类地址范围。

在 Linux 中使用 ping 0.0.0.0 时,地址会被解析到本地环回地址 127.0.0.1, 所以实际的应答就是 127.0.0.1。

# 测试环境: Ubuntu 18.04
$ ping 0.0.0.0        

PING 0.0.0.0 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.026 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.021 ms
^C
--- 0.0.0.0 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2077ms
rtt min/avg/max/mdev = 0.021/0.026/0.032/0.006 ms

那么,0.0.0.0 用于表示默认路由,又该如何理解呢?

简单来说,如果主机需要通信的目标设备 IP 地址和自己不在同一网段,就可以使用这条默认路由 (网关),让网关将自己的数据包转发出去。例如一个家庭中所有网络设备的网关都是其连接的路由器 (光猫)。

127.0.0.1

本地环回地址 (保留地址),一般作为本地开发测试使用。

255.255.255.255

255.255.255.255 表示当前子网的广播地址。

子网掩码 255.255.255.255

如果给主机分配的子网掩码为 255.255.255.255, 说明当前网络中只有这一个主机,没有任何其它 IP 地址。

例如:192.168.1.100/32


如何判断哪些 IP 位于同一子网中?

下面哪些 IP 地址位于同一子网中?

  1. 192.168.78.36/29
  2. 192.168.78.42/29
  3. 192.168.78.41/29
  4. 192.168.78.45/29
  5. 192.168.78.48/29

当前子网掩码长度为 29, 最长掩码长度为 32, 所以每个子网中的主机数量 (IP 地址) 为:

$$ 2^{(32-29)} = 2^3 = 8 $$

将上面 5 个 IP 地址的主机位 (最后 1 位) 除以 8,即可得到该 IP 地址对应的子网网段。

  1. 36 / 8 = 4
  2. 42 / 8 = 5
  3. 41 / 8 = 5
  4. 45 / 8 = 5
  5. 48 / 8 = 6

所以第 2, 3, 4 个 IP 地址位于同一子网。


如何判断两个内网 IP 地址是否位于同一子网中?

通常需要使用 IP 地址和子网掩码进行逻辑与运算,然后比较结果是否相同。如果结果相同,说明两个 IP 地址在同一子网内。

  • 将 IP 地址和子网掩码转换为二进制形式
  • 对 IP 地址和子网掩码分别进行逻辑与运算
  • 比较运算结果是否相同

如下两个 IP 地址位于同一子网:

192.168.1.10/24
192.168.1.20/24
子网掩码: 255.255.255.0

如下两个 IP 地址不在同一子网:

192.168.1.10/24
192.168.2.20/24
子网掩码: 255.255.255.0

为什么需要子网?

子网(Subnet)的存在主要是为了更有效地管理和使用 IP 地址。

  1. IP 地址管理: 子网允许网络管理员将一个大的 IP 地址空间划分为若干个小的子网,每个子网包含一定数量的 IP 地址。这样可以更灵活地分配 IP 地址,提高地址的利用率,并且方便对 IP 地址进行管理和维护。
  2. 隔离和安全: 子网可以根据网络拓扑、安全策略等需求进行划分,不同子网之间可以进行隔离,提高网络的安全性。例如,内部子网和外部子网可以根据防火墙规则进行访问控制,限制不同网络之间的通信。
  3. 性能优化: 合理划分子网可以减少广播域的大小,降低广播和多播的传播范围,减少网络拥塞和冲突,提高网络性能。
  4. 灵活性和可扩展性: 子网划分可以根据实际需求进行调整和扩展,灵活适应不同规模和需求的网络环境。新增设备或子网时,可以通过调整子网划分来满足新的需求,而无需更改整个网络结构。

虚拟专用网 VPN

由于 IP 地址的短缺,一个机构能申请到的 IP 地址数量往往远小于本机构所拥有的主机数量,并且一个机构并不需要把所有的主机接入到公网中,机构内的计算机可以使用仅在本机构有效的 IP 地址(专用地址)。

VPN 使用公网作为内部专网之间的通信载体。

下图中,场所 A 和 B 的通信经过互联网,如果场所 A 的主机 X 要和另一个场所 B 的主机 Y 通信,IP 数据报的源地址是 10.1.0.1,目标地址是 10.2.0.3。

数据报先发送到与公网相连的路由器 R1,R1 对内部数据进行加密,然后重新加上数据报的首部,源地址是路由器 R1 的公网地址 125.1.2.3,目标地址是路由器 R2 的公网地址 194.4.5.6。

路由器 R2 收到数据报后将数据部分进行解密,恢复原来的数据报,此时目标地址为 10.2.0.3,就交付给 Y。

虚拟专用网 VPN 通信示例


扩展阅读

转载申请

本作品采用 知识共享署名 4.0 国际许可协议 进行许可,转载时请注明原文链接,图片在使用时请保留全部内容,商业转载请联系作者获得授权。