题目与思路
题干:在 192.168.100.0/24 内为四个部门(100、50、25、10 台)与两条点对点链路分配网段。做法是变长子网划分(VLSM):先按需求从大到小排序,为每个需求算出最小可用掩码,再沿着地址空间从低到高依次落位,每一步都停在块大小的整数倍上。
为什么必须先大后小
大需求要求块大小必须是 64 或 128 这类较大的 2 的幂,而 128 的块只能从 .0 或 .128 开始。如果先把 10 台的小段放在低位,剩下的空间会被切碎,100 台就再也放不进一个连续 /25。先大后小、从低地址开始分配,是 VLSM 能成立的前提。
基本信息
| 地址池 | 192.168.100.0/24(共 256 个地址) |
|---|---|
| 需求 | 100 / 50 / 25 / 10 台 + 2 条点对点链路 |
| 分配顺序 | 100 → 50 → 25 → 10 → 链路 1 → 链路 2 |
| 口令 | 大块放低位、小块放高位、每块起点按块大小对齐 |
解题步骤
- 把需求降序排列,点对点链路按 2 个地址参与排序
- 逐项求最小掩码:100→/25、50→/26、25→/27、10→/28、链路→/30
- 从池首地址开始按块大小递推,每块记录网络地址与广播地址
- 写出每块的可用范围,确认没有重叠也没有漏块
- 统计剩余空间并登记,留作扩容
分配方案
分配方案
100 台 → /25 → 192.168.100.0/25 可用 .1 - .126
50 台 → /26 → 192.168.100.128/26 可用 .129 - .190
25 台 → /27 → 192.168.100.192/27 可用 .193 - .222
10 台 → /28 → 192.168.100.224/28 可用 .225 - .238
链路 1 → /30 → 192.168.100.240/30 可用 .241 - .242
链路 2 → /30 → 192.168.100.244/30 可用 .245 - .246
剩余 → /30 → 192.168.100.248/30 与 /30 → 192.168.100.252/30验算:不重叠 + 剩余清单
验算:不重叠 + 剩余清单
import ipaddress as ip
base = ip.ip_network('192.168.100.0/24')
used = [ip.ip_network(x) for x in ['192.168.100.0/25','192.168.100.128/26','192.168.100.192/27','192.168.100.224/28','192.168.100.240/30','192.168.100.244/30']]
print('overlap:', any(a.overlaps(b) for i, a in enumerate(used) for b in used[i+1:]))
free = [base]
for u in used:
for f in list(free):
if u.subnet_of(f):
free.remove(f); free.extend(f.address_exclude(u))
print('free:', free)
print('used:', sum(n.num_addresses for n in used)) # 248需求到掩码的换算
| 需求 | 最小掩码 | 块大小 | 可用地址 |
|---|---|---|---|
| 100 台 | /25 | 128 | 126 |
| 50 台 | /26 | 64 | 62 |
| 25 台 | /27 | 32 | 30 |
| 10 台 | /28 | 16 | 14 |
| 点对点链路 | /30 | 4 | 2 |
六个需求共占用 248 个地址,剩余两个 /30(.248 与 .252)共 8 个地址。如果链路平台支持 /31,两条链路可以各用 /31,能再省出 4 个地址,但可读性略差,实际项目里两种做法都常见。
利用率与扩展
本方案把 256 个地址用掉 248 个,利用率约 97%,这在 VLSM 题里属理想结果;但生产网络通常不会配到这么满,因为蜂窝之间需要保留扩展余量。务实做法是把 /24 只用到八成,剩余块明确登记为预留,新部门或新链路直接取用,不必回头重划。
分配完成后一定要做重叠检查:/28 与紧随其后的 /30 之间是最容易算错的位置(.239 是 /28 的广播、.243 是第一个 /30 的广播),一旦错位,两块地址会互相覆盖。