合法掩码的判定
子网掩码本质上是前缀长度的等价写法:从最高位开始必须是连续的 1,后面接连续的 0。因此 255.255.254.0 合法,255.0.255.0 与 255.255.254.1 这类“夹心”或中间夹 0 的值非法,配置到设备上会被直接拒绝。掌握这条规则,任何掩码都能在几秒内判断是否合法。
基本信息
| 合法示例 | 255.255.254.0(/23)、255.255.192.0(/18) |
|---|---|
| 非法示例 | 255.0.255.0、255.255.254.1、255.255.255.127 |
| 根本原因 | 掩码是前缀长度的等价写法,1 必须连续 |
| 判定方法 | 把掩码写成二进制,检查 0 与 1 是否只出现一次分界 |
| 设备行为 | 拒绝该配置或提示掩码非法 |
| 例外说明 | ACL 的通配符掩码没有连续要求,两者不可混淆 |
二进制判定示例
二进制判定示例
255.255.254.0
11111111.11111111.11111110.00000000
1 连续 → 合法,对应 /23
255.0.255.0
11111111.00000000.11111111.00000000
中间夹 0 → 非法
255.255.255.127
11111111.11111111.11111111.01111111
低位夹 0 → 非法程序校验
程序校验
import ipaddress
for m in ['255.255.254.0', '255.0.255.0', '255.255.254.1']:
try:
ipaddress.ip_network('10.0.0.0/' + m, strict=False)
print(m, '合法')
except ValueError as e:
print(m, '非法:', e)
# 仅第一个合法,后两个抛出掩码非法异常易混案例
| 值 | 是否合法 | 说明 |
|---|---|---|
| 255.255.254.0 | 合法 | 对应 /23 |
| 255.255.252.0 | 合法 | 对应 /22 |
| 255.0.255.0 | 非法 | 中间出现 0 后又出现 1 |
| 255.255.255.127 | 非法 | 低位不连续 |
| 0.0.3.255 | 非法作掩码 | 这是通配符掩码的形态 |
典型使用场景
- 配置设备前自查掩码是否连续,避免下发后被拒绝或静默归位
- 读取工具输出时判断掩码是否被误改,尤其是手工转录配置的场景
- 代码里用库函数校验用户输入,避免非法掩码进入系统
- 排查“配置成功但网段不对”:可能是设备把非法掩码归位成了另一个合法值
- 教学与考试:作为区分“掩码”与“通配符掩码”的基本题型
ACL 的通配符掩码没有连续要求,0.1.0.255 这类值在访问控制列表里合法;不要用子网掩码的连续性规则去判断 ACL。
自查流程
- 第一步把掩码写成 32 位二进制,逐位检查是否只有一次从 1 到 0 的变化
- 第二步数一下 1 的个数,得到前缀长度,与预期规划比对
- 第三步用程序或计算工具复核一次,尤其是手工转录的配置
- 第四步回读设备生效配置,确认设备没有对输入做归位或截断