它的正式名字是无分类域间路由选择 CIDR (Classless Inter-Domain Routing)。

网络前缀

  • CIDR 消除了传统的 A 类、B 类和 C 类地址以及划分子网的概念,因而可以更加有效地分配 IPv4 的地址空间。
  • CIDR 使用各种长度的 “网络前缀” ( network-prefix ) 来代替分类地址中的网络号和子网号。
  • IP 地址从三级编址(使用子网掩码)又回到了两级编址。

无分类的两级编址的记法是:

CIDR 使用 “斜线记法” (slash notation),它又称为 CIDR 记法,即在 IP 地址后面加上一个斜线 “/” ,然后写上网络前缀所占的位数(这个数值对应于三级编址中子网掩码中 1 的个数)。

例如: 220.78.168.0 / 24 220.78.168.0/24 220.78.168.0/24

  • CIDR 把网络前缀都相同的连续的 IP 地址组成 “CIDR 地址块”。
  • 128.14.32.0 / 20 128.14.32.0/20 128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 20 20 是网络前缀的位数,所以这个地址的主机号是 12 12 12 位,因为总共是 32 位)。
    • 这个地址块的起始地址是 128.14.32.0
    • 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“/20 地址块”。
    • 128.14.32.0 / 20 128.14.32.0/20 128.14.32.0/20 地址块的最小地址:128.14.32.0
    • 128.14.32.0 / 20 128.14.32.0/20 128.14.32.0/20 地址块的最大地址:128.14.47.255
    • 全 0 和全 1 的主机号地址一般不使用。

128.14.32.0/20 表示的地址( 212 个地址):

路由聚合 (route aggregation)

  • 一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。
  • 路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。
  • 路由聚合也称为构成 超网 (supernetting)。
  • CIDR 虽然不使用子网了,但仍然使用 “掩码” 这一名词(但不叫子网掩码)。
  • 对于 / 20 /20 /20 地址块,它的掩码是 20 个连续的 1。 斜线记法中的数字就是掩码中 1 的个数

CIDR 记法的其他形式:

  • 10.0.0.0/10 可简写为 10/10,也就是把点分十进制中低位连续的 0 省略。
  • 10.0.0.0/10 隐含地指出 IP 地址 10.0.0.0 的掩码是 255.192.0.0。此掩码可表示为 ( 10代表掩码中1的个数 ) :

  • 网络前缀的后面加一个星号 * 的表示方法,如 00001010 00*,在星号 * 之前是网络前缀,而星号 * 表示 IP 地址中的主机号,可以是任意值。

常用的 CIDR 地址块:

  • 前缀长度不超过 23 位的 CIDR 地址块都包含了多个 C 类地址。
  • 这些 C 类地址合起来就构成了超网。
  • CIDR 地址块中的地址数一定是 2 的整数次幂。
  • 网络前缀越短,其地址块所包含的地址数就越多。而在三级结构的IP地址中,划分子网是使网络前缀变长。
  • CIDR 的一个好处是:可以更加有效地分配 IPv4 的地址空间,可根据客户的需要分配适当大小的 CIDR 地址块。

来看一个例子:

ISP 首先向互联网申请了一个 CIDR 地址块,然后某大学又向 ISP 申请了一个 CIDR 地址块,现在该大学要向他下面的几个系进行分配 ip ,一系有 400 台主机,二系有 200 台主机,三系和四系各有 100 台主机,要求给出如何分配才能使得 ip 刚好够用又不浪费。

我写的解题过程,可能有点模糊 🙈

  • 这个 ISP 共有 64 个 C 类网络。如果不采用 CIDR 技术,则在与该 ISP 的路由器交换路由信息的每一个路由器的路由表中,就需要有 64 个项目。但采用地址聚合后,只需用路由聚合后的 1 个项目 206.0.64.0 / 18 206.0.64.0/18 206.0.64.0/18 就能找到该 ISP。


其实到这里都是很好理解的,细心看一下就能看懂。

最长前缀匹配

  • 使用 CIDR 时,路由表中的每个项目由“网络前缀”和“下一跳地址”组成。在查找路由表时可能会得到不止一个匹配结果。
  • 应当从匹配结果中选择具有最长网络前缀的路由:最长前缀匹配 (longest-prefix matching)。
  • 网络前缀越长,其地址块就越小,因而路由就越具体 (more specific) 。
  • 最长前缀匹配又称为最长匹配或最佳匹配。

还是举个例子有助于理解:

假设收到的分组的目的地址 D = 206.0.71.130

路由表中的项目:

地址块 接口
206.0.68.0/22 1
206.0.71.128/25 2

现在查找路由表中的第 1 个项目:

发现第 1 个项目 206.0.68.0/22 的掩码 M 有 22 个连续的 1。

M = 11111111 11111111 11111100 00000000

因此只需把 D 的第 3 个字节转换成二进制。


再查找路由表中的第 2 个项目:

第 2 个项目 206.0.71.128/25 的掩码 M 有 25 个连续的 1。

M = 11111111 11111111 11111100 00000000

因此只需把 D 的第 4 个字节转换成二进制。


比较一下二者:

明显第二个地址更具体一点,所以我们选择第二个地址,也称为最长前缀地址

使用二叉线索查找路由表

  • 当路由表的项目数很大时,怎样设法减小路由表的查找时间就成为一个非常重要的问题。
  • 为了进行更加有效的查找,通常是将无分类编址的路由表存放在一种层次的数据结构中,然后自上而下地按层次进行查找。这里最常用的就是二叉线索 (binary trie)。
  • IP 地址中从左到右的比特值决定了从根结点逐层向下层延伸的路径,而二叉线索中的各个路径就代表路由表中存放的各个地址。
  • 为了提高二叉线索的查找速度,广泛使用了各种压缩技术。

如果你稍微懂一点数据结构和算法的话,理解起来会非常轻松。

从二叉线索的根节点自顶向下的深度最多有32层,每一层对应于IP地址中的一位。一个IP地址存入二叉线索的规则很简单。先检查IP地址左边的第一位,如为 0,则第一层的节点就在根节点的左下方;如为 1,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。