它的正式名字是无分类域间路由选择 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
- CIDR 把网络前缀都相同的连续的 IP 地址组成 “CIDR 地址块”。
- 128.14.32.0/20 表示的地址块共有 212 个地址(因为斜线后面的 20 是网络前缀的位数,所以这个地址的主机号是 12 位,因为总共是 32 位)。
- 这个地址块的起始地址是
128.14.32.0
。 - 在不需要指出地址块的起始地址时,也可将这样的地址块简称为“
/20
地址块”。 - 128.14.32.0/20 地址块的最小地址:
128.14.32.0
- 128.14.32.0/20 地址块的最大地址:
128.14.47.255
- 全 0 和全 1 的主机号地址一般不使用。
- 这个地址块的起始地址是
128.14.32.0/20 表示的地址( 212 个地址):
路由聚合 (route aggregation)
- 一个 CIDR 地址块可以表示很多地址,这种地址的聚合常称为路由聚合,它使得路由表中的一个项目可以表示很多个(例如上千个)原来传统分类地址的路由。
- 路由聚合有利于减少路由器之间的路由选择信息的交换,从而提高了整个互联网的性能。
- 路由聚合也称为构成 超网 (supernetting)。
- CIDR 虽然不使用子网了,但仍然使用 “掩码” 这一名词(但不叫子网掩码)。
- 对于 /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 就能找到该 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,则在右下方。然后再检查地址的第二位,构造出第二层的节点。依此类推,直到唯一前缀的最后一位。