在域名系统出现之后的第一个十年里,基于分类网络进行地址分配和路由IP数据包的设计就已明显显得可扩充性不足(参见RFC 1517)。为了解决这个问题,互联网工程工作小组在1993年发布了一新系列的标准——RFC 1518和RFC 1519——以定义新的分配IP地址块和路由IPv4数据包的方法。
一个IP地址包含两部分:标识网络的前缀和紧接着的在这个网络内的主机地址。在之前的分类网络中,IP地址的分配把IP地址的32位按每8位为一段分开。这使得前缀必须为8,16或者24位。因此,可分配的最小的地址块有256(24位前缀,8位主机地址,28=256)个地址,而这对大多数企业来说太少了。大一点的地址块包含65536(16位前缀,16位主机,216=65536)个地址,而这对大公司来说又太多了。这导致不能充分使用IP地址和在路由上的不便,因为大量的需要单独路由的小型网络(C类网络)因在地域上分得很开而很难进行聚合路由,于是给路由设备增加了很多负担。于是出现了无分类编址CIDR。
1. CIDR
无分类编址CIDR的全名是无分类域间路由选择CIDR(Classless Inter-Domain Routing)。
无类别域间路由是基于可变长子网掩码(VLSM)来进行任意长度的前缀的分配的。在RFC 950(1985)中有关于可变长子网掩码的说明。CIDR包括:
- 指定任意长度的前缀的可变长子网掩码技术。遵从CIDR规则的地址有一个后缀说明前缀的位数,例如:192.168.0.0/16。这使得对日益缺乏的IPv4地址的使用更加有效。
- 将多个连续的前缀聚合成超网,以及,在互联网中,只要有可能,就显示为一个聚合的网络,因此在总体上可以减少路由表的表项数目。聚合使得互联网的路由表不用分为多级,并通过VLSM逆转“划分子网”的过程。
- 根据机构的实际需要和短期预期需要而不是分类网络中所限定的过大或过小的地址块来管理IP地址的分配的过程。
CIDR主要是一个按位的、基于前缀的,用于解释IP地址的标准,是一种编址方法。
2. 网络前缀
CIDR把网络号改成为“网络前缀”(network-prefix)(或简称为“前缀”),用来指明网络,剩下的部分仍然是主机号,用来指明主机。
CIDR的记法: IP地址 ::= {<网络前缀>,<主机号>}
其和分类地址不同的地方在于网络前缀的位数n不是固定的数,而是可以在0~32之间选取任意的值(见下图)。
CIDR使用“斜线记法”(slash notation),或称为CIDR记法,即在IP地址后面加上斜线"/",斜线后面是网络前缀所占的位数。
例如:使用CIDR表示一个IP地址128.14.35.7/20
,二进制IP地址的前20位是网络前缀,剩下的12位是主机号。
注:网络前缀相当于分类地址法的网络号。
3. 地址块
3.1 CIDR地址块
CIDR把网络前缀都相同的所有连续IP地址组成一个“CIDR地址块”,一个CIDR地址块包含的IP地址数目取决于网络前缀的位数。也就是说,只要知道CIDR地址块中的任何一个地址,就可以知道这个地址块的最小地址和最大地址,以及地址块中的地址数。
例如:已知IP地址128.14.35.7/20
是某个CIDR地址块中的一个地址块,用二进制表示如下:
128.14.35.7/20 = 10000000 00001110 00100011 00000111
其中前20位是网络前缀(加粗),后面12(32-20)位是主机号。
最小地址 | 最大地址 |
---|---|
128.14.32.0 | 128.14.47.255 |
10000000 00001110 00100000 00000000 | 10000000 00001110 00101111 11111111 |
可以由主机号的位数知道,这个地址块的IP地址共有212个,去掉主机号为全0和全1的地址(最小地址和最大地址)后,可指派的地址数是212-2个。
我们常用地址块中的最小地址和网络前缀的位数指明一个地址块(不必每次都减2算出可指派的地址数),如128.14.32.0/20表示上面的地址块,其二进制代码的简写形式为:10000000 00001110 0010*
,“*”代表了主机号字段的所有0。
在不需要指明网络地址时,可以把这样的地址块简称为"/20地址块"。
注:
128.14.32.7
是IP地址,但未指明网络前缀长度,故不知道网络地址是什么。
128.14.32.7/20
也是IP地址,其指明了网络前缀为20位,所以可得知其网络地址。
128.14.32.0/20
是包含多个IP地址的地址块或网络前缀(前缀),也可以简写为128.14.32/20
。
3.2 常用地址块
下表是常用的CIDR地址块:
CIDR前缀长度 | 点十分进制 | 包含地址数 | 相当于包含分类的网络数 |
---|---|---|---|
/13 | 255.248.0.0 | 512K | 8个B类或2048个C类 |
/14 | 255.252.0.0 | 256K | 4个B类或1024个C类 |
/15 | 255.254.0.0 | 128K | 2个B类或512个C类 |
/16 | 255.255.0.0 | 64K | 1个B类或256个C类 |
/17 | 255.255.128.0 | 32K | 128个C类 |
/18 | 255.255.192.0 | 16K | 64个C类 |
/19 | 255.255.224.0 | 8K | 32个C类 |
/20 | 255.255.240.0 | 4K | 16个C类 |
/21 | 255.255.248.0 | 2K | 8个C类 |
/22 | 255.255.252.0 | 1K | 4个C类 |
/23 | 255.255.254.0 | 512 | 2个C类 |
/24 | 255.255.255.0 | 256 | 1个C类 |
/25 | 255.255.255.128 | 128 | 1/2个C类 |
/26 | 255.255.255.192 | 64 | 1/4个C类 |
/27 | 255.255.255.224 | 32 | 1/8个C类 |
说明:表中K表示210即1024,网络前缀长度在13到27之间是最常用的。
3.3 特殊地址块
CIDR地址中还有三个特殊地址块,即:
(1)前缀n=32,即32位IP地址都是前缀,没有主机号,这其实就是一个IP地址,用于主机路由。
(2)前缀n=31,这个地址块中只有两个IP地址,主机号分别为0和1,用于点对点链路。
(3)前缀n=0,同时IP地址也全是0,即0.0.0.0/0,用于默认路由。
4. 地址掩码(子网掩码)
地址掩码(简称掩码)由一连串1和接着的一连串0组成,1的个数就是网络前缀的长度,地址掩码又称为子网掩码。在CIDR记法中,斜线后面的数字就是地址掩码中1的个数。
例如:/20地址块的地址掩码是 11111111 11111111 11110000 00000000
(20个1和12个0),这个掩码用CIDR记法表示就是255.255.240.0/20
。
对于分类IP地址,其地址掩码是固定的,如下:
地址类型 | 地址掩码 |
---|---|
A类地址 | 255.0.0.0或255.0.0.0/8 |
B类地址 | 255.255.0.0或255.255.0.0/16 |
C类地址 | 255.255.255.0或255.255.255.0/24 |
CIDR使用斜线记法可以让我们知道网络前缀的数值,但是计算机是看不见斜线记法的,而在二进制格式下,使用32位的地址掩码(address mask)和IP地址进行按位AND运算(逻辑乘法运算)从而得出网络地址。
例如:计算IP地址是128.14.35.7/20的网络地址
128 · 14 · 35 · 7
二进制IP地址 10000000 00001110 00100011 00000111
地址掩码 11111111 11111111 11110000 00000000
按位AND运算 100000000 00001110 00100000 00000000
网络地址 128 · 14 · 32 · 0 /20
由上面的运算可知,IP地址128.14.35.7/20所在的网络地址是128.14.32.0/20。
5. 构造超网
将多个连续的前缀网络聚合成一个网络,就称为超网。
例如,有这样两个地址块:206.0.71.0/25
206.0.71.128/25
,这两个地址块就可以构造一个超网206.0.70.0/24
。点十分进制看起来可能不太明显,让我们换成二进制表示,如下表:
地址块代号 | 地址块 | 二进制表示的地址块 |
---|---|---|
A | 206.0.70.0/24 | 11001110 00000000 01000110 * |
B | 206.0.71.0/25 | 11001110 00000000 01000110 0* |
C | 206.0.71.128/25 | 11001110 00000000 01000110 1* |
表中*是一种常用的简写方式,表示星号后面的二进制主机号都省略了。
可以看到二进制表示的地址块,B和C的第25位分别为0和1,是当掩码为24位时第25位的所有组合,所以B和C可以整合为一个掩码位24为的一个超网。
这样做的好处可以减小路由表上的条目数。
所以从另一个方面称之为路由聚合。
路由聚合:一个大的CIDR地址块中往往包含很多小地址块,所以在路由器的转发表中就利用较大的地址块来代替许多较小的地址块,由较大地址块再向下转发,这就是路由聚合。
路由聚合使得转发表中只用一个项目就可以表示原来传统分类地址的很多个路由项目,大大压缩了转发表所占的空间,减少了查找转发表所需的时间。