CIDR 把多条小路由「合成一条大的」,VLSM 把一个网段「切成不同大小的块」。 方向相反,目的一样:别浪费地址、别让路由表膨胀。
4.3.6 讲了掩码,这一节讲掩码的两个用法。 它也是 4.4.2「路由聚合」的前置知识。
一、CIDR:往外并
合并的规则只有一条:相邻、对齐、数量是 2 的幂:
| 前缀 | 相当于几个 /24 | 地址数 |
|---|---|---|
| /24 | 1 | 256 |
| /23 | 2 | 512 |
| /22 | 4 | 1024 |
| /16 | 256 | 65536 |
第二行「两个 /24 合成一个 /23」是最小的合并单位: 条件是「这两段必须相邻,而且第一段能被 2 整除」。 所以 192.168.0.0/24 和 192.168.1.0/24 能合,而 192.168.1.0/24 和 192.168.2.0/24 不行—— 因为合并后的 /23 必须「起点对齐到偶数」。 这个「对齐」规则值得用一句话记住:要合成 /n,起点必须是 2 的(32 减 n)次方的倍数。 所以 /23 的起点必须是 2 的倍数(在第三段),/22 的起点必须是 4 的倍数,依此类推。 这也是「聚合失败」最常见的原因——两段地址看起来相邻,但对齐不对,就合不了。
二、VLSM:往里切
把需求换成前缀,规则是「往上取整」:
| 需要几台 | 给的前缀 | 块大小 | 实际可用 |
|---|---|---|---|
| 100 | /25 | 128 | 126 |
| 60 | /26 | 64 | 62 |
| 30 | /27 | 32 | 30 |
| 2 | /30 | 4 | 2 |
第一行「100 台要 /25」是因为「100 加 2 得 102,而 128 才够」:块大小必须大过「需求加 2」。 如果给 /26(64 个),只能装 62 台,不够。 这套「按需求给大小」的做法叫 VLSM(变长子网掩码),它的价值是「省」: 一个 /24 按需求切成 128+64+32,只用了 224 个,还剩 32。 如果「一律 /24」,那就要三个 /24,浪费得多得多。 但 VLSM 有个代价:网段大小不一,路由表就不能「一条汇总」,而要「几条分别写」。 所以「省地址」和「省路由」是一对矛盾——这也是 4.4.2 要讲的「聚合」要处理的事。
三、两者是一件事的两面
把两个方向放在一起看:
| 做法 | 方向 | 解决什么 |
|---|---|---|
| CIDR | 往大并 | 路由表太大 |
| VLSM | 往小切 | 地址浪费 |
第一行是「运营商关心的事」:骨干路由表有上百万条,不聚合的话设备根本跑不动。 所以「把一片连续的地址合成一条」是运维的刚需。 第二行是「企业关心的事」:一个部门 30 台机器,给它一个 /24 就浪费 224 个地址, 而 10.0.0.0/8 只有 65536 个 /24——大公司很快就会「网段不够分」。 所以两者的关系是「一个管外面、一个管里面」:内部用 VLSM 切得细,对外用 CIDR 报得粗。 而中间那一步「把细的汇总成粗的」,就是路由聚合。 理解了这个链条,整个地址规划就串起来了。
四、动手 Demo:CIDR 和 VLSM,一个往外并、一个往里切
先看几条前缀相当于几个 /24,再按三种需求切一个 /24。 注意最后一行:三块只用 224 个,还剩 32 个。
for p in (24, 23, 22, 20, 16):
print('/%-2d 等于 %3d 个 /24,共 %6d 个地址'
% (p, 2 ** (24 - p), 2 ** (32 - p)))
start = 0
for need in (100, 60, 30):
p = 32
while 2 ** (32 - p) < need + 2:
p -= 1
size = 2 ** (32 - p)
print('%-4d 台 -> /%d 块 %3d 起 192.168.5.%d' % (need, p, size, start))
start += size
实跑输出:
--------------------------------------------------------------------
CIDR 和 VLSM,一个往外并、一个往里切
--------------------------------------------------------------------
**CIDR 是把多条小路由「合成一条大的」,VLSM 是把一个网段「切成不同大小的块」。**
**方向相反,目的一样:别浪费地址。**
**先看 CIDR 的合并**:
前缀 相当于几个 /24 地址数 约
-------------------------------------------------
/24 1 256 0.03 万个
/23 2 512 0.05 万个
/22 4 1024 0.10 万个
/20 16 4096 0.41 万个
/16 256 65536 6.55 万个
**第一行到第二行:两个 /24 合成一个 /23**,
**条件是「它们必须是相邻的一对,而且前一个的起始地址是偶数倍」。**
**所以 192.168.0.0/24 和 192.168.1.0/24 能合成 192.168.0.0/23**,
**但 192.168.1.0/24 和 192.168.2.0/24 不行**——**它们不满足「对齐到 2 的倍数」。**
**再看 VLSM 的切分**:把一个 /24 切成 30、60、100 台三种需求
需求 给的前缀 块大小 起始地址 实际可用
--------------------------------------------------------------
100 台 /25 128 192.168.5.0 126
60 台 /26 64 192.168.5.128 62
30 台 /27 32 192.168.5.192 30
**注意第二列是「往上取整」的结果**:
**100 台要大过 102,所以给 /25(128 个);60 台给 /26(64 个);30 台给 /27(32 个)。**
**三块加起来 224 个地址,还剩 32 个**——**这就是 VLSM 比「一律 /24」省的地方。**
**「按需求给大小」这件事在 IPv4 地址紧张时是刚需**,
**今天在内网规划里依然要用**——**因为「一个部门一个 /24」很快就会把 10.0.0.0/8 用光。**
那个 while 循环就是「往上取整」:从 /32 起把前缀一位一位往回收,直到块大小够用为止。
所以「100 台」会走到 /25(128 ≥ 102),而「60 台」走到 /26(64 ≥ 62)。
「起 192.168.5.0 / .128 / .192」这个排列说明 VLSM 的约束:
每块的起点必须是自己的块大小的倍数,
所以 128 那块是 /26(64 的倍数)、192 那块是 /27(32 的倍数)。
如果顺序换成「先 30 再 100」,排列就会不同——所以「从大到小切」是好习惯,能少浪费。
最后一个术语辨析:「超网」和「CIDR」经常混着用,但严格说不一样。
超网是「把多个类别网络合成一个」,CIDR 是「彻底取消类别、只看前缀」。
日常说话时混用没关系,但看 RFC 时要分清。
30 秒实验
- 算一下:三个 /24(192.168.4.0、5.0、6.0)能合成一条 /22 吗?
- 想一下:为什么 VLSM 会让路由表变多?
- 想一下:为什么「从大到小切」更省地址?
常见误区
- 以为「相邻就能合并」。 还要对齐,起点必须是块大小的倍数。
- 以为「VLSM 只有好处」。 它会让路由表变多,因为网段大小不一、不好汇总。
- 以为「CIDR 就是超网」。 严格说不一样,CIDR 是「取消类别」,超网是「合并类别网络」。
自测三问(点开对答案)
1. 两个 /24 合成 /23 的条件是什么? —— **两段必须相邻,且起点对齐到 2 的倍数**(在第三段上)。 2. 100 台机器要给什么前缀? —— **/25**,因为 128 才够 100 加 2。 3. CIDR 和 VLSM 各解决什么问题? —— **CIDR 解决路由表太大,VLSM 解决地址浪费**。下一节看全局地址和私有地址:为什么要分两种。
- ☐ (本节完,下一节 4.3.8 全局地址与私有地址)