CIDR 与路由聚合

上一页把一个网络切小,这一页反过来:CIDR 取消了 A、B、C 类的界限,地址块的大小可以任意取 2 的幂;许多相邻的小块在路由表里可以合并成一个大块。

两道同类型的错题(2021 年真题及其原型)都是”已知一个子网,判断哪个不可能是另外几个子网之一”。 这类题用二叉树看最直接:每个地址块是树上的一个节点,几个子网能拼成一个大网络,当且仅当它们互不包含、并且恰好铺满某个节点下面的全部叶子。

机制

无分类编址 CIDR

无分类域间路由选择(Classless Inter-Domain Routing,CIDR)是在变长子网掩码的基础上,提出的一种消除传统 A、B、C 类地址及划分子网的概念的编址方法。例如,若一个单位需要 2000 个地址,则给它分配一个 2048 地址的块,而不是分配一个完全的 B 类地址,因此可更有效地分配 IPv4 的地址空间。

CIDR 使用网络前缀的概念代替网络的概念,与传统分类 IP 地址最大的区别就是,网络前缀的位数不是固定的,可以任意选取。CIDR 的记法是 IP 地址 ::= {<网络前缀>, <主机号>}。

CIDR 还使用斜线记法(或称 CIDR 记法),即记为”IP 地址/网络前缀所占的位数”。网络前缀所占的位数对应网络号的部分,等效于子网掩码中连续 1 的部分。例如,对于 128.14.32.5/20 这个地址,它的掩码是 20 个连续的 1 和后续 12 个连续的 0,通过逐位”与”的方法可得该地址的网络前缀(或直接截取前 20 位):

掩码网络前缀

斜线记法不仅能表示其 IP 地址,还能表示这个地址块的网络前缀有多少位。采用 CIDR 后,斜线及后面的数字一定不能省略,否则仅从斜线左边的 IP 地址无法知道其网络地址(CIDR 地址块的分析 2011、2015、2016、2019、2023 年考过)。

CIDR 地址块

CIDR 将网络前缀都相同的连续 IP 地址组成一个 CIDR 地址块。只要知道 CIDR 地址块中的任何一个地址,就能知道这个地址块的最小地址和最大地址,以及地址块中的地址数。上例的地址 128.14.32.5/20 所在 CIDR 地址块中(地址块的最小地址和最大地址分析 2023 年考过):

  • 最小地址:10000000.00001110.00100000.00000000(128.14.32.0)
  • 最大地址:10000000.00001110.00101111.11111111(128.14.47.255)

主机号全 0 或全 1 的地址一般不使用,通常只使用在这两个特殊地址之间的地址。

CIDR 虽然不使用子网,但仍然使用”掩码”一词。“CIDR 不使用子网”是指 CIDR 并没有在 32 位地址中指明若干位作为子网字段;但分配到一个 CIDR 地址块的单位,仍可在本单位内根据需要划分出一些子网。例如,某单位分配到地址块 /20,就可继续划分为 8 个子网(从主机号中借用 3 位来划分子网),这时每个子网的网络前缀就变成了 23 位。

CIDR 地址块中的地址数一定是 2 的整数次幂,实际可指派的地址数通常为 , 表示主机号的位数,主机号全 0 代表网络号,主机号全 1 为广播地址。网络前缀越短,其地址块包含的地址数就越多。 而在三级结构的 IP 地址中,划分子网使网络前缀变长(子网广播地址与网络地址的分析 2011、2012、2018、2019 年考过)。

路由聚合

一个大的 CIDR 地址块中包含很多小地址块,因此在路由表中就可利用较大的一个 CIDR 地址块来代替许多较小的地址块,这种方法称为路由聚合(也称构成超网)。它使得路由表中的一个项目可以表示原来传统分类地址的多条路由项目,压缩了路由表所占的空间,从而提高了网络性能(路由聚合的分析 2009、2011、2013、2014、2018 年考过)。

例如,路由器 R1 经 R2 到达网络 1(206.1.0.0/17)和网络 2(206.1.128.0/17)。若不使用路由聚合,R1 的路由表中需要分别有到网络 1 和网络 2 的路由表项。两个网络的网络前缀在二进制表示下前 16 位都相同,第 17 位分别是 0 和 1,并且从 R1 到这两个网络的下一跳都是 R2。使用路由聚合后,在 R1 看来,网络 1 和网络 2 可以构成一个更大的地址块 206.1.0.0/16,两条路由聚合成一条到 206.1.0.0/16 的路由。

能聚合的前提有两个:前缀相同的部分正好覆盖这些网络,并且它们的下一跳相同。

最长前缀匹配

使用 CIDR 时,路由表中的表项由”网络前缀”和”下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果,此时应当从匹配结果中选择具有最长网络前缀的路由,因为网络前缀越长,其地址块就越小,因而路由就越具体。这称为最长前缀匹配(也称最佳匹配,路由器分组转发的最长前缀匹配 2013、2015 年考过)。

为了更有效地查找最长前缀匹配,通常将无分类编址的路由表存放在一种层次式数据结构(通常采用二叉线索)中,然后自上而下地按层次进行查找。

CIDR 的优点在于网络前缀长度的灵活性:因为上层网络的前缀长度较短,所以相应的路由表的项目较少;而内部又可采用延长网络前缀的方法来灵活地划分子网。

计算模板

求地址块的最小地址、最大地址、地址数

  1. 前缀长度为 ,主机号位数 ,地址数 。
  2. 把前缀所在的那个字节写成二进制,前缀以后的位全置 0 得最小地址,全置 1 得最大地址。
  3. 可分配地址数 。

路由聚合

  1. 把各网络中第一个不同的字节写成二进制。
  2. 从左往右数出所有网络都相同的位数,加上前面相同的字节位数,得聚合后的前缀长度。
  3. 相同的部分保留、其余位全置 0,得聚合地址。
  4. 检查多余:聚合后的地址块若比原来这几个网络的并集大,就包含了本不属于它们的地址。题目问”聚合后的地址块”时可以不管;问”能否恰好组成一个网络”时必须恰好铺满。

用二叉树判断几个子网能否恰好组成一个大网络

把 /24 看成一棵二叉树的根,前缀每长 1 位就向下一层,左 0 右 1。每个地址块对应一个节点,节点下的全部叶子就是这个块中的地址。

flowchart TB
  R["x.x.x.0/24"] --> A["0/25<br/>(0~127)"]
  R --> B["1/25<br/>(128~255)"]
  A --> A0["00/26<br/>(0~63)"]
  A --> A1["01/26<br/>(64~127)"]
  B --> B0["10/26<br/>(128~191)"]
  B --> B1["11/26<br/>(192~255)"]
  B1 --> B10["110/27<br/>(192~223)"]
  B1 --> B11["111/27<br/>(224~255)"]

几个子网恰好组成一个更大的网络,要同时满足:

  1. 互不重叠:任意两个节点之间没有祖先与后代关系。
  2. 恰好铺满:存在一个节点,这几个节点下的叶子合起来正好就是它下面的全部叶子,一个不多、一个不少。

错题复盘:几个子网能否拼成一个网络,用二叉树看"互不重叠、恰好铺满"

王道 4.2.8 第 40 题:现将一个 IP 网络划分为 4 个子网,若其中一个子网是 192.168.1.130/26,则下列网络中不可能是另外 3 个子网之一的是(A. 192.168.1.0/25 B. 192.168.1.64/26 C. 192.168.1.96/27 D. 192.168.1.224/27)。答案 C。

先把各地址块写成最后一个字节的前缀位(前 24 位相同,省略)。192.168.1.130/26 中的 130 只是子网里的一个地址,它所在的子网是 128/26,前 2 位为 10,记作 10/26;A 为 0/25,B 为 01/26,C 为 011/27,D 为 111/27。逐项检验能否与 10/26 一起,用 4 个子网恰好铺满一个节点:

  • A、D:0/25、10/26、110/27、111/27 恰好铺满 /24。
  • B:00/26、01/26、10/26、11/26 恰好铺满 /24。
  • C:011/27 与 10/26 要拼成更大的网络,至少还需要 00/26、010/27、11/26,共 5 个子网,与题意不符。

第一步最容易出错:不先把 130 还原成 128,就无法在树上定位题中的子网。

错题复盘:原来的网络不一定是 /24,只要求子网互不重叠、原地址空间不遗漏

2021 年统考真题(王道 4.2.8 第 66 题):现将一个 IP 网络划分为 3 个子网,若其中一个子网是 192.168.9.128/26,则下列网络中不可能是另外两个子网之一的是(A. 192.168.9.0/25 B. 192.168.9.0/26 C. 192.168.9.192/26 D. 192.168.9.192/27)。答案 B。

划分子网的原则是要求划分出来的子网的 IP 地址空间互不重叠,且原来的 IP 地址空间不遗漏。题中子网为 10/26;A 为 0/25,B 为 00/26,C 为 11/26,D 为 110/27。

  • A、C:可以组成 0/25、10/26、11/26 这 3 个互不重叠的子网,铺满 /24。
  • D:可以组成 10/26、110/27、111/27 这 3 个互不重叠的子网,铺满 1/25(192.168.9.128/25)。
  • B:00/26 与 10/26 不是兄弟节点,要把包含它们的地址空间划分为互不重叠的子网,3 个不够,至少需要 00/26、01/26、10/26、11/26 这 4 个。

与第 40 题对照:那里 A、D 都凑成了 /24,这里的 D 只能凑成 /25。题目没有说原来的网络是 /24,所以 D 可行。

边界

CIDR 的斜线不能省。 同一个 IP 地址,/20 和 /24 属于完全不同的地址块。

最长前缀匹配是在”所有匹配的表项”里挑最长的,不是在全表里挑最长的。 前缀最长的表项若与目的地址不匹配,根本不参与比较;默认路由 0.0.0.0/0 与任何地址都匹配,所以它总是最后的候选(4.2.4)。

路由聚合压缩的是路由表,不是地址本身。 聚合后每个网络的地址、掩码都不变,只是在远处的路由器看来它们合成了一条路由。

错题复盘:CIDR 的作用是有效分配地址空间、减少路由表项;划分子网是它的结果而不是作用

王道 4.2.8 第 24 题:CIDR 技术的主要作用是(A. 有效分配 IP 地址空间,并减少路由表的数量 B. 把大的网络划分成小的子网 C. 彻底解决 IP 地址资源不足的问题 D. 由多台主机共享同一个网络地址)。答案 A。

CIDR 可以更合理地分配 IP 地址空间,缓解 IP 地址消耗的速度,但无法彻底解决 IP 地址耗尽的问题(C 错)。CIDR 通过路由聚合可减少路由表的项目,从而减少路由器之间的信息交换,提高了网络性能(A 对)。把大的网络划分成小的子网,是 CIDR 划分子网的结果,并不是作用(B 错)。D 描述的是任何一个网络中的主机都共用网络号,与 CIDR 无关。

对照速查

说法对错
CIDR 消除了传统的 A、B、C 类地址的概念✅
CIDR 地址块的网络前缀位数固定❌(任意选取)
采用 CIDR 后斜线记法可以省略❌
网络前缀越长,地址块包含的地址越多❌(越少)
分配到 CIDR 地址块的单位不能再划分子网❌(可以,前缀变长)
路由聚合可以减少路由表的项目✅
CIDR 彻底解决了 IP 地址耗尽的问题❌
多个匹配时应选择网络前缀最长的路由✅

考点

  • CIDR:网络前缀 + 主机号;斜线记法(2011、2015、2016、2019、2023)
  • 地址块最小、最大地址与地址数(2023)
  • 子网广播地址、网络地址(2011、2012、2018、2019)
  • 路由聚合(2009、2011、2013、2014、2018)
  • 最长前缀匹配(2013、2015)

链接