📚 第四章 IP协议
📄 一句话概括

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 秒实验

  1. 算一下:三个 /24(192.168.4.0、5.0、6.0)能合成一条 /22 吗?
  2. 想一下:为什么 VLSM 会让路由表变多?
  3. 想一下:为什么「从大到小切」更省地址?

常见误区

  1. 以为「相邻就能合并」。 还要对齐,起点必须是块大小的倍数。
  2. 以为「VLSM 只有好处」。 它会让路由表变多,因为网段大小不一、不好汇总。
  3. 以为「CIDR 就是超网」。 严格说不一样,CIDR 是「取消类别」,超网是「合并类别网络」。
自测三问(点开对答案) 1. 两个 /24 合成 /23 的条件是什么? —— **两段必须相邻,且起点对齐到 2 的倍数**(在第三段上)。 2. 100 台机器要给什么前缀? —— **/25**,因为 128 才够 100 加 2。 3. CIDR 和 VLSM 各解决什么问题? —— **CIDR 解决路由表太大,VLSM 解决地址浪费**。

下一节看全局地址和私有地址:为什么要分两种。

相关笔记