2026年8月9日
CIDR 与子网划分详解:前缀长度、子网掩码与 VLSM
随便拆开一条防火墙规则、一张路由表、一个云安全组或者一份 DNS 白名单,里面几乎都有形如 192.168.1.0/24、10.0.0.0/8、172.19.87.203/18 的字符串。这套写法就是 CIDR(Classless Inter-Domain Routing,无类别域间路由)——当网络想表达「一段 IP 地址块」时说的就是它。能不能读懂它,直接决定了你能否判断一条规则到底匹配了哪些流量、两台主机是否在同一网段、一个网络还剩多少扩展余地。这是所有碰基础设施的人都绕不开的基本功。
这篇文章从零开始把这项能力补齐:斜杠后面的数字是什么含义、前缀长度和子网掩码怎么互换、网络地址与广播地址如何手工推算,以及怎么用 VLSM 把一个地址块切成大小刚好的多个子网。文中每个例子都可以在 CIDR 计算器里现场验证——它完全在浏览器里运算,你可以把自己的真实地址贴进去,和文章里手算的过程逐项对照。
斜杠后面的数字到底是什么#
IPv4 地址是 32 个比特,写成 4 个 8 位的八位组。192.168.1.130 的真身是:
11000000 . 10101000 . 00000001 . 10000010
192 . 168 . 1 . 130
CIDR 记法 a.b.c.d/n 的意思是:前 n 位是固定的网络部分,剩下的 32 − n 位是自由的主机位,用来区分块内的各个地址。/24 把前 24 位钉死——也就是 192.168.1 这一段——最后一个八位组随便取值,于是恰好有 2^8 = 256 个地址:经典的家庭网络网段。/25 多钉死一位,块对半砍成 128 个。前缀每加减 1,地址块就翻倍或减半,没有中间档位。
这套记法的出现,是为了取代一个极其僵化的旧体系。上世纪 80 年代的「有类别」地址只有三档:A 类(可用主机约 1677 万)、B 类(65534)、C 类(254)。一个需要 300 个地址的机构只能去申请一个 B 类,然后把 6.5 万个地址闲置在那里。CIDR 在 1993 年由 RFC 1519 标准化,用一条规则取代了三档尺寸——任意 2 的幂次大小的块、落在 2 的幂次边界上——几乎可以肯定,正是它让 IPv4 地址空间的枯竭推迟了好几年。
有一个细节很容易踩坑:斜杠前面的地址不必是块的首地址。192.168.1.130/24 是完全合法的写法,含义是「首地址为 192.168.1.0 的那个块里的主机 .130」。网络地址是靠掩码算出来的,不是你打的那串字。防火墙和路由器的惯例是在配置里写首地址,但只要前缀定了,块内任何一个地址描述的都是同一个块。
前缀、掩码、通配符掩码:三种方言,一个意思#
同一个子网,在不同的系统里会遇到三种写法。
子网掩码(netmask)把前缀写成点分十进制:n 个 1 后跟 32 − n 个 0。/18 的掩码是 11111111.11111111.11000000.00000000,读出来就是 255.255.192.0。这个结构决定了掩码的每个八位组只可能出现九种值——0、128、192、224、240、248、252、254、255——而且模式永远是「从左往右连续的 1」。如果有人给你看 255.0.255.0 这样的掩码,那不是合法的子网掩码。
通配符掩码(wildcard mask,也叫反掩码)是子网掩码按位取反:/18 对应 0.0.63.255。Cisco 风格的访问列表用的就是它——permit ip any 192.168.1.0 0.0.0.255 的意思是「前 24 位与 192.168.1 一致的全部 256 个地址」。通配符里为 1 的位表示「这一位随便」。
前缀长度 /n 是现代速记法,也是唯一能干净地延伸到 IPv6 的形式。
读掩码有个心算技巧:掩码最后一个非零八位组里,256 − 掩码值 就是块在该八位组上的步长。255.255.255.192 → 256 − 192 = 64,所以子网依次落在 .0、.64、.128、.192。255.255.240.0 → 256 − 240 = 16,第三个八位组按 0、16、32、48 步进。就凭这一招,你就能枚举出一个较大块里某种掩码的所有可能子网。
下面这张对照表值得背下来:
前缀 子网掩码 地址数 可用主机数
/30 255.255.255.252 4 2
/29 255.255.255.248 8 6
/28 255.255.255.240 16 14
/27 255.255.255.224 32 30
/26 255.255.255.192 64 62
/25 255.255.255.128 128 126
/24 255.255.255.0 256 254
/23 255.255.254.0 512 510
/22 255.255.252.0 1,024 1,022
/20 255.255.240.0 4,096 4,094
/16 255.255.0.0 65,536 65,534
网络地址、广播地址与「减二」规则#
IPv4 每个子网里有两个保留地址,子网运算的一切规矩都源于它们。
网络地址等于「地址 AND 掩码」——主机位全部清零。它代表子网本身。广播地址是网络地址的主机位全部置一(网络 OR 通配符);发往它的流量会到达子网内的所有主机。因为这两个地址被占用,从 /1 到 /30 的任何前缀,真正能分配给接口的地址数都是 2^(32−n) − 2。
小前缀端有两个例外。/32 就是单个地址——一台主机,没有保留,所以路由表里的主机路由都写成 /32。/31 包含两个地址,按老规则可用数为零;RFC 3021 重新定义了它,专用于两台路由器之间的点对点链路——这种场景下广播毫无意义,因此两个地址都可用,不作任何保留。现代设备都实现了这一条,但 2000 年之前的老设备可能不认。
实例演算:像路由器一样读一个 /18#
我们完全手工算一个真实子网,然后再验证它。取 172.19.87.203/18。
第一步,掩码。/18 表示 18 个 1:前两个八位组全被掩住(255.255),第三个八位组被掩住最高两位(11000000 = 192),第四个完全自由。掩码 255.255.192.0;通配符 0.0.63.255。
第二步,网络地址。只有第三个八位组同时含有固定位和自由位,注意力放它身上。87 的二进制是 01010111,掩码八位组是 11000000。按位 AND:01010111 AND 11000000 = 01010000,即 64。所以网络地址是 172.19.64.0——这个块不是从 .87 开始的,而是从 .64 开始,因为 64 是小于等于 87 的、步长(64)的最大整数倍。
第三步,末端。主机部分横跨第三个八位组的低 6 位和整个第四个八位组。把主机位全部置一:第三八位组 64 + 63 = 127,第四八位组 255,广播地址 172.19.127.255。可分配范围就是两者之间:第一个可用主机 172.19.64.1,最后一个 172.19.127.254。
第四步,清点数量。总地址数 2^(32−18) = 2^14 = 16,384;可用 16,384 − 2 = 16,382。完整图景:
Network: 172.19.64.0
Netmask: 255.255.192.0
Wildcard: 0.0.63.255
Broadcast: 172.19.127.255
First host: 172.19.64.1
Last host: 172.19.127.254
Total: 16,384
Usable: 16,382
还有一点值得留意:172.19.0.0 到 172.31.255.255 落在 RFC 1918 保留的私网段 172.16.0.0/12 之内,所以这个块在公网上不可路由——在对外的服务上线之前,这类信息值得先确认一遍。
用 CIDR 计算器现场验证#
CIDR 计算器把上述全部内容变成一个输入框就能完成的核对,建议边读边把每个例子跑一遍:
- 打开工具,把
172.19.87.203/18粘进输入框。结果面板随输入即时刷新,应当与上面的块逐字段一致——网络地址、掩码、通配符、广播、首尾主机、总数与可用数,另有旧式地址类别、IP 版本和公网/私网标记。 - 重新载入默认示例
192.168.1.130/24,注意前面讨论过的现象:你输入的地址(.130)是块内的主机,而 Network 一栏显示的是推导出的首地址192.168.1.0。工具把主机位掩掉了,并没有「纠正」你的输入。 - 输入
10.0.0.0/31,看可用数返回 2 而不是 0——计算器对点对点链路遵循 RFC 3021,而不是机械套用减二规则。 - 输入
10.1.2.3/32看单主机场景:总数 1、可用 1、不保留广播。 - 再试试
2001:db8::/64体会 IPv6 的一面——地址总数(2^64,即 18,446,744,073,709,551,616)是精确计算的,因为运算用的是任意精度整数而非浮点数。
由于一切都在页面本地完成,把你所在网络的真实地址贴进去,不会有任何数据外泄。
VLSM:把一个 /24 切成大小合适的子网#
真实的网络很少需要一张巨大的扁平子网。可变长子网掩码(VLSM,Variable Length Subnet Masking)允许不同的网段从同一个父块里取不同长度的前缀——这正是当年抛弃有类别寻址的全部意义所在。
定尺寸的规则是:要容纳 N 台主机,取满足 2^k − 2 ≥ N 的最小 k,前缀长度即 32 − k。分配时从最大的块开始,从父块的低地址向上依次排。
实例场景:给你 192.168.10.0/24,需要三个局域网——分别 100 台、50 台、25 台主机——外加两条路由器对路由器的链路(各 2 台)。
- 局域网 A,100 台:
2^7 − 2 = 126 ≥ 100→ 7 个主机位 →/25→192.168.10.0/25,主机.1–.126,广播.127。 - 局域网 B,50 台:
2^6 − 2 = 62 ≥ 50→/26→192.168.10.128/26,主机.129–.190,广播.191。 - 局域网 C,25 台:
2^5 − 2 = 30 ≥ 25→/27→192.168.10.192/27,主机.193–.222,广播.223。 - 链路 1:
/30→192.168.10.224/30,主机.225–.226。 - 链路 2:
/30→192.168.10.228/30,主机.229–.230。
网段 需求 前缀 子网 可用 范围
局域网A 100 /25 192.168.10.0/25 126 .1 – .126
局域网B 50 /26 192.168.10.128/26 62 .129 – .190
局域网C 25 /27 192.168.10.192/27 30 .193 – .222
链路1 2 /30 192.168.10.224/30 2 .225 – .226
链路2 2 /30 192.168.10.228/30 2 .229 – .230
剩余 — 3 × /29 192.168.10.232 – .255 24 空闲
全部塞进了一个 /24,还剩 24 个地址备用。「从大到小」并不是风格偏好——它是让各块保持边界对齐的关键。/25 在父块内只能从 128 的整数倍开始,/26 从 64 的整数倍,/27 从 32 的整数倍。如果先给局域网 C 在 .0–.31 切了个 /27,局域网 A 的 /25 就只能从 .128 开始,整个范围会被切碎成剩下的网段装不下的碎片。先大后小、先低后高,对齐自然就对了。
日常子网划分还有最后一问:*这个地址属于哪个网段?*拿 192.168.10.200 来说。用它 AND 上 /27 掩码 255.255.255.224:200 AND 224 = 192,所以它落在 192.168.10.192/27——局域网 C。把 192.168.10.200/27 输进计算器,显示的正是这个网络:首主机 .193,末主机 .222。
IPv6:同一套思想,更大的数字#
上面的一切都能平移到 IPv6,只是前缀范围延伸到了 /128。变的是惯例,不是算术。/64 是 IPv6 局域网的标准尺寸——以 IPv4 的眼光看大得离谱(2^64 个地址)——这么定是为了让无状态自动配置有完整的接口标识符可用。一个站点通常从运营商那里拿到一个 /48,于是可以开出 65,536 个独立的 /64 网络,完全不用再申请。
IPv6 子网有两处简化:没有广播地址,也没有旧式类别——因此没有减二规则,可用数就等于总数。顺带一个工程提醒,如果你自己实现这类计算:JavaScript 的普通 Number 类型在超过 2^53 后会静默丢失精度,而 IPv6 地址运算立刻就会超过这条线,要得到精确结果必须用任意精度整数。(本站计算器的全部 IPv6 运算都跑在 BigInt 上,原因就在这里。)
地址压缩遵循 RFC 5952:最长的一段连续零组折叠成 ::,十六进制字母用小写,前导零省略。2001:0db8:0000:0000:0000:0000:0000:0001 于是写成 2001:db8::1——这是防火墙和路由器期望见到的规范形式。
常见问题#
为什么 /24 是 254 个可用主机而不是 256?#
地址确实有 256 个,但从 /1 到 /30 的每个 IPv4 子网都有两个保留地址:网络地址(主机位全零)代表子网本身,广播地址(主机位全一)用于一次触达全部主机。256 − 2 = 254。仅有的例外是 /31(RFC 3021 点对点链路:两个地址都可用)和 /32(单主机:一个地址,没有可保留的)。
我输入的 IP 和显示的网络地址不一样,哪个对?#
两个都对,只是描述的对象不同。192.168.1.130/24 指的是块内的主机 .130;而该块的网络地址是 192.168.1.0,由掩掉主机位推导而来。如果你想要的确实是从 .128 开始的块,应写作 192.168.1.128/25。同时把两者都显示给你的工具,做的才是正确的事。
/31 看起来可用主机是 0,它有什么用?#
按减二规则它确实一文不值——所以才会有 RFC 3021。在恰好连接两台路由器的点对点链路上,广播给谁听?因此两个地址都可分配,也不再保留广播。现代网络里 /31 链路是路由器互联的标准做法。只有大约 2000 年之前的旧设备可能仍要求用 /30。
要容纳 N 台主机,前缀怎么选?#
找满足 2^k − 2 ≥ N 的最小 k,前缀就是 32 − k。以 50 台为例:2^6 − 2 = 62 ≥ 50,而 2^5 − 2 = 30 不够,所以 k = 6、前缀 /26。然后记得留余量——利用率 100% 的网段一台新设备都进不来,而这种事总在最不巧的时候被发现。地址空间允许的话,按不超过一半来设计;给 IPv4 网段定尺寸时也别忘了那两个保留地址。