网络基础: 公网/子网 地址是如何分类的?
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 地址位于同一子网中?
- 192.168.78.36/29
- 192.168.78.42/29
- 192.168.78.41/29
- 192.168.78.45/29
- 192.168.78.48/29
当前子网掩码长度为 29, 最长掩码长度为 32, 所以每个子网中的主机数量 (IP 地址) 为:
$$ 2^{(32-29)} = 2^3 = 8 $$
将上面 5 个 IP 地址的主机位 (最后 1 位) 除以 8,即可得到该 IP 地址对应的子网网段。
- 36 / 8 = 4
- 42 / 8 = 5
- 41 / 8 = 5
- 45 / 8 = 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 地址。
- IP 地址管理: 子网允许网络管理员将一个大的 IP 地址空间划分为若干个小的子网,每个子网包含一定数量的 IP 地址。这样可以更灵活地分配 IP 地址,提高地址的利用率,并且方便对 IP 地址进行管理和维护。
- 隔离和安全: 子网可以根据网络拓扑、安全策略等需求进行划分,不同子网之间可以进行隔离,提高网络的安全性。例如,内部子网和外部子网可以根据防火墙规则进行访问控制,限制不同网络之间的通信。
- 性能优化: 合理划分子网可以减少广播域的大小,降低广播和多播的传播范围,减少网络拥塞和冲突,提高网络性能。
- 灵活性和可扩展性: 子网划分可以根据实际需求进行调整和扩展,灵活适应不同规模和需求的网络环境。新增设备或子网时,可以通过调整子网划分来满足新的需求,而无需更改整个网络结构。
虚拟专用网 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。