公式与两个特例
主机位为 k 位时,网段内共 2^k 个地址,其中第一个是网络地址(用作路由条目,不能给主机)、最后一个是定向广播地址(发给全段所有主机),所以经典可用主机数是 2^k - 2。只有两种公认特例:/31 按 RFC 3021 把两个地址都当可用,用于路由器点对点互联;/32 是单主机地址,用于主机路由或环回接口。
为什么必须减 2
网络地址与广播地址不是「浪费」,它们在协议里有明确职责:前者是这台子网在路由表里的标识,后者用于在二层做泛洪送达。把 PING 广播地址当成可用主机地址配置,设备会直接报错或产生不可预期的行为;而在地址规划里按 2^k 而不是 2^k-2 估算容量,就会在最后几台设备上线时才发现地址不够。
基本信息
| 通用公式 | 可用主机 = 2^(32-n) - 2 |
|---|---|
| /31 特例 | RFC 3021:点对点链路 2 个地址都可用 |
| /32 特例 | 单主机地址,常用于主机路由与环回接口 |
| 块大小 | 2^主机位,用于定位子网边界 |
| 判定依据 | RFC 950(子网划分)、RFC 3021 |
典型使用场景
- 按需求反选掩码:先算需要几台,再找满足 2^k-2 ≥ 需求的 k
- 评估现网剩余容量:看某个 /26 里还剩多少个可分配地址
- 规划 DHCP 池边界:池的起止必须是 HostMin 与 HostMax 之间
- 给点对点链路选掩码:两台路由器互联时比较 /30 与 /31 的地址开销
- 写地址规划表时填「可用主机数」列,避免按地址量高估容量
- 考试里判断某主机地址是否有效:落在网络或广播地址上即无效
常见掩码可用主机数
| 掩码 | /24 | /25 | /26 | /27 | /28 | /29 | /30 | /31 | /32 |
|---|---|---|---|---|---|---|---|---|---|
| 主机位 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
| 可用主机 | 254 | 126 | 62 | 30 | 14 | 6 | 2 | 2 | 1 |
| 地址量 | 256 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
速算:先数主机位再减 2
速算:先数主机位再减 2
# 主机位 = 32 - 前缀长度
/26 → 6 位 → 2^6 - 2 = 62
/29 → 3 位 → 2^3 - 2 = 6
/30 → 2 位 → 2^2 - 2 = 2(路由器互联)
/31 → 1 位 → 特例:2 个地址都可用(RFC 3021)反推与校验(Python)
反推与校验(Python)
import ipaddress as ip
def mask_for(hosts):
k = 2
while 2 ** k - 2 < hosts:
k += 1
return 32 - k, 2 ** k - 2
print(mask_for(50)) # (26, 62)
net = ip.ip_network('192.168.1.0/26')
print(net.num_addresses - 2, len(list(net.hosts()))) # 62 62许多云平台与容器网络会额外保留网关、DHCP、保留地址各若干,实际可用数可能比 2^k-2 更少。做容量规划时按云厂商文档再扣减,别只用通用公式。
相邻掩码的数量关系
前缀每减 1,地址量翻倍、可用主机数大约也翻倍再加 2:/27 是 30 台,/26 是 62 台,/25 是 126 台,/24 是 254 台。反过来每加 1 位前缀就少一半地址。记住这条链就能在需求与掩码之间快速跳转,不必每次重算,也能立刻看出「用 /26 装 100 台」这种明显不够的方案。
容易被漏掉的开销
- 网关地址占 1 个:每段至少消耗一个可用地址
- 网络设备管理地址:交换机、AP、防火墙互联口都吃地址
- DHCP 与保留段:池外还要给打印服务器、UPS 等固定设备留号
- 广播域越大泛洪越多:主机数不是越多越好,超过约 500 台建议再切
- 地址浪费与汇总取舍:为对齐汇总边界常常主动放弃一些地址
习惯上先用 2^k-2 算纯可用数,再按「乘 0.8」估算可实配终端数,多出来的部分留给网关、管理地址、保留与临时设备,这样现场装机时很少出现临时补段的返工。
点对点链路的地址取舍
两台设备直连时只需要两个地址,用 /30 会浪费一半地址,于是有了 RFC 3021 的 /31:只有两个地址且都可用,双方各配一个,不需要网络与广播。多数现代路由平台支持 /31,但部分老旧设备或某些三层交换机不支持,落地前先在测试环境验证;不支持时退回 /30,或把互联地址做在环回加静态路由的方案里。
需要 2 个地址时不一定要 /30:两端都是路由器接口时 /31 更省地址;若该段还要接管理设备或未来加设备,反而应选 /29 留出扩展空间。