工具
指南
本页内容

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 计算器把上述全部内容变成一个输入框就能完成的核对,建议边读边把每个例子跑一遍:

  1. 打开工具,把 172.19.87.203/18 粘进输入框。结果面板随输入即时刷新,应当与上面的块逐字段一致——网络地址、掩码、通配符、广播、首尾主机、总数与可用数,另有旧式地址类别、IP 版本和公网/私网标记。
  2. 重新载入默认示例 192.168.1.130/24,注意前面讨论过的现象:你输入的地址(.130)是块内的主机,而 Network 一栏显示的是推导出的首地址 192.168.1.0。工具把主机位掩掉了,并没有「纠正」你的输入。
  3. 输入 10.0.0.0/31,看可用数返回 2 而不是 0——计算器对点对点链路遵循 RFC 3021,而不是机械套用减二规则。
  4. 输入 10.1.2.3/32 看单主机场景:总数 1、可用 1、不保留广播。
  5. 再试试 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 网段定尺寸时也别忘了那两个保留地址。

延伸阅读#

  • 把本文的每个例子都在 CIDR 计算器里跑一遍——IPv4 与 IPv6、完整子网信息、私网段识别,全部在浏览器本地完成。
  • 掩码的本质是二进制运算;用 进制转换器 可以最快地核对 87 AND 192 这类八位组算术的十进制、二进制与十六进制形式。

← 全部指南