题目与分析过程
题干给出两条相邻的二十四位路由,问能否一步合并成一条更长前缀覆盖它们。判断方法不是看地址看起来挨着,而是看合并后的前缀长度与起点是否同时成立:两条二十四位要合成二十三位,起点必须能被二整除;要合成二十二位,起点必须能被四整除。
结论为什么是不能
这两条分别是第三段一和二,它们能合成的最小父块是二十二位,覆盖第三段的零到三共四块。直接按父块下发会顺带覆盖零与三两块并未规划使用的地址,外部访问这些地址时会形成黑洞,因此不能合并。正确做法是保留两条,或者把零到三整段重新规划后再用一条汇总。
基本信息
| 两条路由 | 第三段一与第三段二,均为二十四位 |
|---|---|
| 最小公共父块 | 二十二位,覆盖第三段零到三 |
| 能否合并 | 不能,会引入未规划地址 |
| 正确条件 | 两条前缀需构成二的幂块且起点对齐 |
| 可行做法 | 保留原两条,或重新规划后汇总 |
典型使用场景
- 路由汇总评审:骨干设备上做前缀汇总前,先验证是否引入未使用的地址,避免黑洞
- 方案设计:规划时按二的幂块分配连续地址,为将来的汇总留出对齐条件
- 排障分析:部分地址不通而相邻地址正常时,检查是否存在过度汇总产生的黑洞
- 培训与考试:这是汇总类题目的经典反例,考的是对齐条件而不是算术
- 配置清理:冗余路由合并前逐条验证,合并失败就保留原状,不要为了条目数强行合并
- 工具使用:用地址库的合并函数做验证,返回原样说明无法合并
分析过程
分析过程
两条路由:第三段一 与 第三段二,均为二十四位
最小公共父块:二十二位,覆盖第三段的零、一、二、三
# 直接汇总会把零与三一并纳入,这两块未规划使用,形成黑洞
# 结论:分别保留;或把零到三整段重新规划后再用一条二十二位汇总验证:合并函数返回原样
验证:合并函数返回原样
python -c "import ipaddress as ip; print(list(ip.collapse_addresses([ip.ip_network('192.168.1.0/24'), ip.ip_network('192.168.2.0/24')])))"
# [IPv4Network('192.168.1.0/24'), IPv4Network('192.168.2.0/24')]
# 两条原样返回,说明无法合并
# 换成第三段零与一:python 会返回一条二十三位前缀可合并与不可合并对照
| 两条前缀 | 能否合并 | 合并结果 | 原因 |
|---|---|---|---|
| 第三段零与一 | 能 | 二十三位 | 起点为零,可被二整除 |
| 第三段二与三 | 能 | 二十三位 | 起点为二,可被二整除 |
| 第三段一与二 | 不能 | 无 | 最小父块会括入未规划地址 |
| 第三段零到三 | 能 | 二十二位 | 起点为零,可被四整除 |
判断口诀是先定合并后的前缀长度、再验起点能否被对应的块大小整除。两条相邻前缀只要不构成二的幂块,就一定无法一步合并,任何强行合并都会包含额外地址。
强行缩小前缀来减少路由条目,会把未使用地址一并引入,形成指向空地址的转发路径,表现为部分地址不通且难以定位,属于典型的高危操作。