
上一篇介绍 IPv4 地址时提到:一段地址中有网络部分和主机部分,但仅看 192.168.1.10 这四段数字,并不能知道边界到底在哪里。它可以属于 192.168.1.0/24,也可能处于更大的 192.168.0.0/16 网络中。要做出准确判断,还需要子网掩码或 CIDR 前缀长度。
这一篇继续位于 TCP/IP 五层模型的网络层。我们重点解决几个最实用的问题:掩码中的 1 和 0 各代表什么;怎样从 IP 地址算出网络地址;两台主机怎样判断能否直接通信;CIDR 为什么取代了 A、B、C 类的固定边界。下一篇再在此基础上进行更系统的子网划分练习。
一、为什么光有 IP 地址还不够?
IPv4 地址有 32 位。网络层必须知道其中哪些位表示网络前缀,哪些位表示主机部分,才能回答:
- 这台主机属于哪个网络?
- 目标地址是否就在本地网络?
- 应该直接 ARP 并发给目标,还是交给默认网关?
- 路由表中的一条网络前缀能覆盖哪些目的地址?
早期分类编址用 A、B、C 类的固定规则划分边界,但这种方式不够灵活。现代网络把"边界在哪里"作为与地址配套的独立信息给出,这就是子网掩码 或CIDR 前缀长度。
text
IPv4 地址:192.168.1.10
仅有地址:不知道网络部分到哪里结束
IPv4 地址:192.168.1.10/24
补充前缀:前 24 位是网络前缀,后 8 位是主机部分
因此,讨论"一个 IP 属于哪个网段"时,地址和掩码必须一起出现。
二、子网掩码:用连续的 1 标出网络部分
子网掩码也是一个 32 位数。它的规则很简单:
- 从左到右连续的
1对应网络前缀; - 后面连续的
0对应主机部分。
例如:
text
子网掩码:255.255.255.0
二进制: 11111111.11111111.11111111.00000000
含义: 前 24 位是网络前缀,后 8 位是主机部分
掩码中的 1 必须从左侧连续出现,不能写成中间夹杂 0 和 1 的任意形状。255.255.255.0 是合法掩码;255.0.255.0 则不是正常的 IPv4 子网掩码。
点分掩码与斜线记法
同一个前缀可以用两种常见写法表达:
| 点分十进制掩码 | CIDR 前缀长度 |
|---|---|
255.0.0.0 |
/8 |
255.255.0.0 |
/16 |
255.255.255.0 |
/24 |
255.255.255.128 |
/25 |
255.255.255.192 |
/26 |
/24 的含义不是"地址有 24 位",而是"32 位 IPv4 地址中,左起前 24 位属于网络前缀"。剩余主机位数量就是:
text
主机位数 = 32 - 前缀长度
CIDR 记法简洁、明确,所以在路由表、云网络配置和现代网络文档中更常见。
三、按位与:如何由 IP 和掩码得到网络地址?
要提取网络前缀,可以把 IP 地址与子网掩码进行按位与运算。规则是:
text
任意位 AND 1,结果保留原来的值
任意位 AND 0,结果变为 0
由于掩码在网络部分是 1、主机部分是 0,所以运算结果会保留网络位,并把主机位全部清零。得到的就是网络地址。
例如,计算 192.168.1.10/24 所在网络:
text
IP 地址: 192.168.1.10
子网掩码:255.255.255.0
按位与后:192.168.1.0
因此,192.168.1.0 是该 /24 网络的网络地址。
再看一个边界不落在字节末尾的例子:
text
IP 地址: 172.16.35.200
子网掩码:255.255.240.0
前缀长度:/20
按位与后:172.16.32.0
这里第三个字节的掩码是 240,也就是二进制的 11110000。它保留第三个字节的前 4 位网络信息,并清零后 4 位主机信息,所以网络地址是 172.16.32.0,而不是仅凭外观猜成 172.16.35.0。
四、网络地址、广播地址与可用主机地址
已知一个 IPv4 地址和前缀后,就能确定这个网络范围的两端:
- 网络地址:主机位全部为 0,是这个子网本身的标识;
- 广播地址:主机位全部为 1,是向该子网内所有主机广播的地址;
- 可用主机地址:在传统 IPv4 广播子网中,位于两者之间的地址。
例如,192.168.1.0/24:
| 项目 | 地址 |
|---|---|
| 网络地址 | 192.168.1.0 |
| 广播地址 | 192.168.1.255 |
| 常见可用主机范围 | 192.168.1.1 到 192.168.1.254 |
| 地址块总数 | 256 个 |
这里的地址块总数由主机位数决定:若有 h 位主机位,块内地址总数为 2 的 h 次方。在把地址块直接作为普通 IPv4 广播子网使用时,通常要扣除网络地址和广播地址,常见可用主机数为"总数减 2"。
但要避免一个机械误区:地址能否分配取决于真实前缀,而不取决于它是否以 .0 或 .255 结束。
以 192.168.4.0/22 为例,范围覆盖 192.168.4.0 到 192.168.7.255。在这个 /22 子网中,192.168.5.0 的主机位既不是全 0 也不是全 1,因此可以作为普通接口地址;而 192.168.4.0 和 192.168.7.255 才分别是网络地址与广播地址。
五、怎样判断两台主机是否属于同一子网?
方法只有一句话:分别把两台主机的 IP 地址与同一个子网掩码按位与,比较得到的网络地址。
- 结果相同:两台主机处于同一子网,通常可以在二层直接通信;
- 结果不同:它们处于不同子网,需要把数据报交给路由器或默认网关转发。
例如,掩码均为 /24:
text
主机 A:192.168.10.20/24 -> 网络地址 192.168.10.0
主机 B:192.168.10.200/24 -> 网络地址 192.168.10.0
结果相同:同一子网
主机 C:192.168.11.20/24 -> 网络地址 192.168.11.0
结果不同:与 A、B 不同子网
主机 A 发给 B 时,会对 B 的 IP 地址进行 ARP,取得 B 的 MAC 地址后直接发帧;主机 A 发给 C 时,会对默认网关进行 ARP,把帧先交给路由器,IP 数据报的目的地址仍保持为 C。
这里还隐含一个实际前提:同一子网的接口需要使用一致的掩码或前缀理解。若设备配置了不一致的掩码,双方对"本地网络"的判断不同,可能导致看似奇怪的单向通信或无法通信。
六、CIDR:为什么不再依赖 A、B、C 类?
CIDR 是 Classless Inter-Domain Routing 的缩写,中文常译为无分类域间路由选择。它不再把地址块固定为 A 类 /8、B 类 /16、C 类 /24,而是允许网络前缀长度灵活取值。
这带来两个直接好处:
- **地址分配更贴合需求。**组织可以获得大小合适的地址块,而不必在固定类别间勉强选择。
- **路由聚合更容易。**多个连续小地址块可用一个更短的共同前缀表示,从而减少路由表项。
例如,203.0.113.0/24 表示一个前 24 位相同的地址块;203.0.112.0/23 则表示一个更大的连续块,可以覆盖两个相邻的 /24 块。前缀越短,覆盖范围越大;前缀越长,覆盖范围越小、规则越具体。
CIDR 没有在 32 位地址中专门保留"子网号"字段。它只区分网络前缀和主机部分。一个组织得到大块后,仍然可以使用更长的前缀把它分成许多更小网络;从大块借用主机位形成更长前缀的过程,就是下一篇要实践的子网划分。
CIDR 地址块是什么?
一个 CIDR 地址块是一组网络前缀相同且连续的 IPv4 地址。知道块中一个地址和前缀长度后,就可以推导:
- 网络地址;
- 广播地址(该块作为普通 IPv4 广播子网使用时);
- 地址总数;
- 地址掩码;
- 常见可用主机范围。
例如,198.51.100.64/26 的主机位有 6 位,所以地址块总数是 64 个。它从 198.51.100.64 开始,到 198.51.100.127 结束;若直接作为子网使用,前者是网络地址,后者是广播地址。
路由聚合与最长前缀匹配
路由器可以用一条较短前缀的路由概括多个连续网络,这叫路由聚合或构造超网。它能减少路由表规模。
同时,路由表里可能既有大范围的聚合前缀,也有某个小网络的更精确前缀。一个目的地址同时匹配多条规则时,路由器选择前缀最长的那一条,因为它描述的范围最具体。这就是前文路由器文章中的最长前缀匹配。
七、容易混淆的点
| 常见说法 | 更准确的理解 |
|---|---|
255.255.255.0 是所有网络的掩码 |
它只是 /24 的一种常见掩码,现代网络可使用不同前缀长度 |
| 同网只要前三段相同 | 是否同网取决于按掩码计算出的网络地址 |
.0 一定不能配给主机 |
只有在当前前缀下主机位全 0 时才是网络地址 |
.255 一定是广播地址 |
只有在当前前缀下主机位全 1 时才是广播地址 |
| CIDR 不再有子网 | CIDR 不预留固定子网字段,但大地址块仍可继续划分为更长前缀的小网络 |
| 前缀越长,地址块越大 | 恰好相反:前缀越长,主机位越少,地址块越小 |
| 网络地址与广播地址永远不能出现 | 作为最终 IPv4 广播子网的接口地址时不能分配;作为更大地址池内部的边界,它们可成为更小子网的网络或广播地址 |
八、总结
子网掩码和 CIDR 前缀长度解决的是同一个问题:明确 IPv4 地址中网络前缀与主机部分的边界。通过 IP 地址与掩码按位与,可以得到网络地址;比较网络地址,就能判断两台主机是否属于同一子网。
CIDR 用灵活前缀替代了分类编址的固定边界,让地址分配更精细,也让路由聚合和最长前缀匹配成为可能。掌握网络地址、广播地址、地址范围和可用主机数的计算逻辑后,下一篇就可以进一步练习:如何按真实需求把一个地址块划分为多个子网。
如果这篇文章对你有帮助,欢迎点赞、评论、关注、收藏。你们的支持是我前进的动力!