Subnetting 详解
Source: Dev.to
什么是子网划分?
把它想象成把一栋大型公寓楼分成不同的楼层。每个楼层(子网)都有自己的编号单元(主机),而大楼的地址(network ID)标识你所在的楼层。
IPv4 地址结构
示例地址:192.168.1.10
每个 IPv4 地址被划分为两个逻辑部分:
- 网络部分 – 由子网掩码决定。
- 主机部分 – 剩余的位。
/24 掩码表示前 24 位是网络部分,后 8 位用于主机。
IP: 192.168.1.10
子网掩码
255.255.255.0 = /24
设备使用子网掩码来判断目标 IP 是否在同一局域网(直接发送)或在不同网络(发送至网关路由器)。
设备如何使用 AND 运算
规则很简单:
1 AND 1 = 1- 任意数
AND 0 = 0
AND 运算的结果就是 网络 ID。
Source IP: 192.168.1.10
Binary: 11000000.10101000.00000001.00001010
Mask: 11111111.11111111.11111111.00000000
Result: 11000000.10101000.00000001.00000000 → 192.168.1.0 (Network ID)
设备会对 源 IP 和目标 IP 都执行此 AND 运算。
- 如果两个结果相同,说明设备在同一子网,可以直接通信。
- 如果结果不同,则将数据包发送到默认网关。
此逻辑在硬件中以线速对每个数据包执行。
网络 ID 和广播地址
- 网络 ID – 所有主机位为
0。 - 广播地址 – 所有主机位为
1(子网中的最后一个地址)。
可用主机地址
Usable Hosts = 2^H − 2
其中 H 是子网划分后剩余的主机位数。
/24 示例
- H = 8 →
2^8 − 2 = 254可用主机(地址192.168.1.1–192.168.1.254)。
子网划分公式
- 所需子网数量:
2^N,其中 N = 从主机部分借用的位数。 - 每个子网的主机数:
2^H − 2,其中 H = 剩余的主机位数。
您从原始掩码的主机部分借用 N 位,这会使前缀长度增加 N。剩余的 H 位决定每个子网可以容纳的主机数量。
借用位 — 实际含义
Original network: 192.168.1.0/24
Borrow 2 bits:
11111111.11111111.11111111.11000000
- 借用 2 位可得到
2² = 4个子网。 - 每个子网有
2^6 − 2 = 62个可用主机。
更多子网 → 每个子网的主机更少。这是根本的权衡。
块大小 — 最实用的技巧
Block Size = 256 − (interesting octet value)
interesting octet 是指子网掩码既不是 255(全部网络位)也不是 0(全部主机位)的那个八位字节。
示例:/26
- 掩码:
255.255.255.192 - interesting octet 值:
192 - 块大小:
256 − 192 = 64
子网起始地址:0, 64, 128, 192
记住常用块大小
| CIDR | 块大小 |
|---|---|
| /25 | 128 |
| /26 | 64 |
| /27 | 32 |
| /28 | 16 |
| /29 | 8 |
| /30 | 4 |
这些数值几乎出现在所有的子网划分题目中。
Source: …
逐步解决子网问题
6 步法
- 从题目中确定前缀长度(
/x)。 - 找出“感兴趣的八位字节”。
- 计算块大小。
- 列出子网范围。
- 确定给定主机地址所在的范围。
- 读取网络 ID、广播地址以及可用主机范围。
示例 1 — /26 子网
问题: 给定 IP 地址 192.168.1.70/26,求网络 ID、广播地址和可用主机范围。
| 步骤 | 操作 |
|---|---|
| 1 | 前缀 = /26 |
| 2 | 感兴趣的八位字节 = 第 4 个八位字节(掩码 192) |
| 3 | 块大小 = 256 − 192 = 64 |
| 4 | 子网范围:0‑63、64‑127、128‑191、192‑255 |
| 5 | 70 落在 64‑127 范围内 |
| 6 | 网络 ID: 192.168.1.64广播地址: 192.168.1.127可用主机: 192.168.1.65 – 192.168.1.126 |
示例 2 — /22 子网
问题: 给定 IP 地址 10.205.79.90/22,求网络 ID、广播地址和主机范围。
| 步骤 | 操作 |
|---|---|
| 1 | 前缀 = /22 |
| 2 | 感兴趣的八位字节 = 第 3 个八位字节(掩码 252) |
| 3 | 块大小 = 256 − 252 = 4 |
| 4 | 第 3 个八位字节的子网范围:0‑3、4‑7、8‑11、…、76‑79、80‑83、… |
| 5 | 第 3 个八位字节 79 落在 76‑79 范围内 |
| 6 | 网络 ID: 10.205.76.0广播地址: 10.205.79.255可用主机: 10.205.76.1 – 10.205.79.254 |
当感兴趣的八位字节不是最后一个(如
/22)时,完整的主机范围会跨越多个最后一个八位字节的取值。网络起始于(块起始).0,结束于(块结束).255。
示例 3 — 将 /24 划分为子网
问题: 某公司拥有网络 192.168.1.0/24,需要至少 3 个子网。
| 步骤 | 操作 |
|---|---|
| 1 | 确定需要借用的位数:需要 ≥3 个子网 → 借用 2 位(2² = 4 个子网) |
| 2 | 新掩码:/26 → 255.255.255.192 |
| 3 | 列出可用子网:192.168.1.0/26、192.168.1.64/26、192.168.1.128/26、192.168.1.192/26 |
结果:得到 4 个子网(多出一个备用),每个子网支持 62 台可用主机。将其中三个分配给各部门,保留一个作为备用。
CIDR 表示法
192.168.1.0/24 表示 24 位网络位 和 8 位主机位。
CIDR(无类域间路由)在各处都有使用——路由表、防火墙规则、云安全组以及 IP 分配。理解 /x 表示法可以立即告诉你任何子网的块大小和主机容量。
快速参考表
| CIDR | Subnet Mask | Block Size | Total IPs | Usable Hosts |
|---|---|---|---|---|
| /24 | 255.255.255.0 | 256 | 256 | 254 |
| /25 | 255.255.255.128 | 128 | 128 | 126 |
| /26 | 255.255.255.192 | 64 | 64 | 62 |
| /27 | 255.255.255.224 | 32 | 32 | 30 |
| /28 | 255.255.255.240 | 16 | 16 | 14 |
| /29 | 255.255.255.248 | 8 | 8 | 6 |
| /30 | 255.255.255.252 | 4 | 4 | 2 |
关键要点
- 子网划分通过 借用主机位 将一个网络拆分为多个子网——子网越多,每个子网的主机数越少。
- 设备使用 按位与 来确定自己的子网:
IP AND 掩码 = 网络 ID。 - 网络 ID(所有主机位为
0)和 广播地址(所有主机位为1)始终保留,不能分配给主机。 - 块大小 =
256 − 掩码八位字节值—— 查找子网范围的最快工具。 - 可用主机数 =
2^H − 2,其中 H 为主机位数。 - CIDR
/x表示网络位的数量,剩余的位都是主机位。 - 设计子网时,优先考虑 网络数量,然后再考虑 每个网络的主机数。