借位算法
从原前缀借 n 位当子网位,结果是:子网数变成 2^n,新前缀是原前缀加 n,每个子网的主机位变成 32 减新前缀,可用主机是 2 的主机位次方再减 2。这条链是子网划分的核心换算,题目的需求无论是「要几个子网」还是「每网要多少台」,都能在这条链上双向推导。
两个方向的推导
正向:已知要划 m 个子网,取最小的 n 使 2^n ≥ m,新前缀就是原前缀加 n;例如 /24 要 6 个子网,n=3(得到 8 个),新前缀 /27,每网 30 台。反向:已知每网要 H 台,取最小的 k 使 2^k-2 ≥ H,新前缀等于 32 减 k;例如要 50 台,k=6,新前缀 /26。
特例与边界
借位有两个特例需要单独处理:借到 /31 时按 RFC 3021 两个地址都可用,不再减 2;借满变成 /32 时只有一个地址,用于主机路由。另外借位不能跨出原网段边界,切出的每一块起点都必须落在原网段内并按新块大小对齐,否则会与相邻网段冲突。
基本信息
| 借 n 位 | 子网数 2^n,新前缀 = 原前缀 + n |
|---|---|
| 主机位 | 32 - 新前缀 |
| 可用主机 | 2^主机位 - 2(/31、/32 例外) |
| 例 | /24 借 3 位 → 8 个 /27,每段 30 台 |
| 对齐要求 | 每块起点必须是新块大小的整数倍 |
典型使用场景
- 按部门数量规划子网:5 个部门借 3 位得到 8 块
- 为未来扩展预留:需求 6 块时按 8 块规划
- 考试题中由需求反推掩码与每段主机数
- 把已有 /24 重新切分,配合 DHCP 与网关改造
- 为容器或监控等专用网络单独切块
借位对照(从 /24 出发)
借位对照(从 /24 出发)
借 1 位 → 2 个 /25,每网 126 台
借 2 位 → 4 个 /26,每网 62 台
借 3 位 → 8 个 /27,每网 30 台
借 4 位 → 16 个 /28,每网 14 台
借 5 位 → 32 个 /29,每网 6 台
借 6 位 → 64 个 /30,每网 2 台(点对点)Python 枚举验证
Python 枚举验证
python -c "import ipaddress as ip; n=ip.ip_network('192.168.1.0/24'); print(len(list(n.subnets(new_prefix=27)))); print([str(x) for x in list(n.subnets(new_prefix=27))[:4]])"
# 8
# ['192.168.1.0/27', '192.168.1.32/27', '192.168.1.64/27', '192.168.1.96/27']需求到借位数
| 需要子网数 | 借位 n | 实得子网数 | 新前缀(原 /24) | 每网可用 |
|---|---|---|---|---|
| 2 | 1 | 2 | /25 | 126 |
| 3–4 | 2 | 4 | /26 | 62 |
| 5–8 | 3 | 8 | /27 | 30 |
| 9–16 | 4 | 16 | /28 | 14 |
| 17–32 | 5 | 32 | /29 | 6 |
借位与聚合互逆:借位把一条前缀拆成 2^n 条更长的前缀,聚合把连续前缀合成一条更短的前缀。规划时先想清楚最终要对外通告哪一条汇总路由,再决定借多少位,能省掉不少返工。
借位后仍按 2^主机位 计算可用地址是常见错误:每个子网都要扣掉网络地址与广播地址。例如 /30 只有 2 个可用,而不是 4 个;/31 才是唯一不减 2 的例外。