题干与思路
题目:172.16.32.0/24 到 172.16.63.0/24 共 32 条连续路由,求最小汇总前缀。思路是先数块数,32 = 2^5,说明要向前吃掉 5 位,汇总前缀 = 24 − 5 = 19;再验证起点对齐,32 是 32 的倍数,因此汇总为 172.16.32.0/19,恰好覆盖 172.16.32.0 到 172.16.63.255。
基本信息
| 连续块数 | 32 条 /24(32 到 63) |
|---|---|
| 指数换算 | 32 = 2^5,借 5 位 |
| 汇总前缀 | 24 − 5 = /19 |
| 汇总结果 | 172.16.32.0/19,掩码 255.255.224.0 |
| 覆盖范围 | 172.16.32.0 – 172.16.63.255,共 8192 个地址 |
| 起点对齐 | 32 ÷ 32 = 1,对齐成立 |
解题步骤
解题步骤
① 数连续块数:63 - 32 + 1 = 32
② 取 2 的幂:32 = 2^5 → 汇总前缀 = 24 - 5 = /19
③ 验证对齐:起点 32 是 2^5 = 32 的倍数 ✓
④ 输出汇总:172.16.32.0/19
⑤ 反向验算:/19 覆盖 32 个 /24,正好是 32 到 63程序验算
程序验算
python -c "import ipaddress as ip; nets=[ip.ip_network(f'172.16.{x}.0/24') for x in range(32,64)]; print(list(ip.collapse_addresses(nets)))"
# [IPv4Network('172.16.32.0/19')]
# 若返回多条,说明区间不连续或起点未对齐常见汇总对照
| 块数 | 汇总前缀 | 示例 |
|---|---|---|
| 2 个 /24 | /23 | 172.16.4.0/23 覆盖 4.0–5.255 |
| 4 个 /24 | /22 | 192.168.16.0/22 覆盖 16.0–19.255 |
| 8 个 /24 | /21 | 192.168.8.0/21 覆盖 8.0–15.255 |
| 32 个 /24 | /19 | 172.16.32.0/19 覆盖 32.0–63.255 |
落地建议
- 先确认这 32 个 /24 是否真的连续可用,缺号的路由如果已分给别人,汇总会把别人的流量引到自己这里
- 汇总后检查是否与其他既有汇总路由重叠,重叠部分会形成更具体与更笼统两条路径并存,转发结果取决于最长匹配
- 在边界设备上只通告汇总前缀,内部保留明细路由,这样单条链路抖动不会引起整块路由翻动
- 规划阶段就按 2 的幂预留连续段,例如给一个大部门直接留 /19 或 /20,避免日后 32 条明细凑不出整齐的汇总
- 验证手段固定为两条:明细条数是否等于 2 的幂,以及汇总前缀覆盖范围是否恰好等于明细集合
同一题的变形:若给出 172.16.32.0/24 至 172.16.47.0/24 共 16 条,则 16 = 2^4,汇总前缀为 24 − 4 = /20,结果是 172.16.32.0/20,做法完全一致。
| 反向验证 | /19 覆盖的 /24 数量 = 2^(24−19) = 32,与明细条数一致 |
|---|---|
| 边界验证 | 首个 /24 是 172.16.32.0,末个是 172.16.63.0,全部落在汇总范围内 |
| 常见变形 | 16 条明细对应 /20,8 条对应 /21,4 条对应 /22,2 条对应 /23 |
| 失败信号 | collapse_addresses 返回多条结果,说明区间不连续或起点不对齐 |
汇总的前提是“连续 + 起点对齐”。若 32 条路由里缺了中间某几条,强行汇总会把未使用的网段一起通告出去,需要评估是否可接受。