Subnetting 详解

发布: (2026年2月25日 GMT+8 01:22)
8 分钟阅读
原文: Dev.to

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.1192.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块大小
/25128
/2664
/2732
/2816
/298
/304

这些数值几乎出现在所有的子网划分题目中。

Source:

逐步解决子网问题

6 步法

  1. 从题目中确定前缀长度(/x)。
  2. 找出“感兴趣的八位字节”。
  3. 计算块大小。
  4. 列出子网范围。
  5. 确定给定主机地址所在的范围。
  6. 读取网络 ID、广播地址以及可用主机范围。

示例 1 — /26 子网

问题: 给定 IP 地址 192.168.1.70/26,求网络 ID、广播地址和可用主机范围。

步骤操作
1前缀 = /26
2感兴趣的八位字节 = 第 4 个八位字节(掩码 192
3块大小 = 256 − 192 = 64
4子网范围:0‑6364‑127128‑191192‑255
570 落在 64‑127 范围内
6网络 ID: 192.168.1.64
广播地址: 192.168.1.127
可用主机: 192.168.1.65192.168.1.126

示例 2 — /22 子网

问题: 给定 IP 地址 10.205.79.90/22,求网络 ID、广播地址和主机范围。

步骤操作
1前缀 = /22
2感兴趣的八位字节 = 第 3 个八位字节(掩码 252
3块大小 = 256 − 252 = 4
4第 3 个八位字节的子网范围:0‑34‑78‑11、…、76‑7980‑83、…
5第 3 个八位字节 79 落在 76‑79 范围内
6网络 ID: 10.205.76.0
广播地址: 10.205.79.255
可用主机: 10.205.76.110.205.79.254

当感兴趣的八位字节不是最后一个(如 /22)时,完整的主机范围会跨越多个最后一个八位字节的取值。网络起始于 (块起始).0,结束于 (块结束).255

示例 3 — 将 /24 划分为子网

问题: 某公司拥有网络 192.168.1.0/24,需要至少 3 个子网。

步骤操作
1确定需要借用的位数:需要 ≥3 个子网 → 借用 2 位(2² = 4 个子网)
2新掩码:/26255.255.255.192
3列出可用子网:192.168.1.0/26192.168.1.64/26192.168.1.128/26192.168.1.192/26

结果:得到 4 个子网(多出一个备用),每个子网支持 62 台可用主机。将其中三个分配给各部门,保留一个作为备用。

CIDR 表示法

192.168.1.0/24 表示 24 位网络位8 位主机位

CIDR(无类域间路由)在各处都有使用——路由表、防火墙规则、云安全组以及 IP 分配。理解 /x 表示法可以立即告诉你任何子网的块大小和主机容量。

快速参考表

CIDRSubnet MaskBlock SizeTotal IPsUsable Hosts
/24255.255.255.0256256254
/25255.255.255.128128128126
/26255.255.255.192646462
/27255.255.255.224323230
/28255.255.255.240161614
/29255.255.255.248886
/30255.255.255.252442

关键要点

  • 子网划分通过 借用主机位 将一个网络拆分为多个子网——子网越多,每个子网的主机数越少。
  • 设备使用 按位与 来确定自己的子网:IP AND 掩码 = 网络 ID
  • 网络 ID(所有主机位为 0)和 广播地址(所有主机位为 1)始终保留,不能分配给主机。
  • 块大小 = 256 − 掩码八位字节值 —— 查找子网范围的最快工具。
  • 可用主机数 = 2^H − 2,其中 H 为主机位数。
  • CIDR /x 表示网络位的数量,剩余的位都是主机位。
  • 设计子网时,优先考虑 网络数量,然后再考虑 每个网络的主机数
0 浏览
Back to Blog

相关文章

阅读更多 »

没人想负责的 Systemd Bug

TL;DR:存在一个命名空间 bug,影响 Ubuntu 20.04、22.04 和 24.04 服务器,导致随机服务故障。自 2021 年起已在系统中报告……