无类别域间路由

无类别域间路由（Classless Inter-Domain Routing，简称CIDRˈ）是一个用于给用户分配IP地址以及在互联网上有效地路由IP数据包的对IP地址进行归类的方法。

在域名系统出现之后的第一个十年里，基于分类网络进行地址分配和路由IP数据包的设计就已明显显得可扩充性不足（参见RFC 1517）。为了解决这个问题，互联网工程工作小组在1993年发布了一新系列的标准——RFC 1518和RFC 1519——以定义新的分配IP地址块和路由IPv4数据包的方法。

无类别域间路由是基于可变长子网掩码（VLSM）来进行任意长度的前缀的分配的。在RFC 950（1985）中有关于可变长子网掩码的说明。CIDR包括：

- 指定任意长度的前缀的可变长子网掩码技术。遵从CIDR规则的地址有一个后缀说明前缀的位数，例如：192.168.0.0/16。这使得对日益缺乏的IPv4地址的使用更加有效。
- 将多个连续的前缀聚合成超网；在互联网中，只要有可能，就显示为一个聚合的网络，因此在总体上可以减少路由表的表项数目。聚合使得互联网的路由表不用分为多级，并通过VLSM逆转“划分子网”的过程。
- 根据机构的实际需要和短期预期需要而不是分类网络中所限定的过大或过小的地址块来管理IP地址的分配的过程。

## 历史背景

IP地址最初被描述为包含两部分：网络地址和主机地址。这种区分用于IP网络之间的流量路由。

在历史上，IP地址空间被分为三个分类网络，这些类别有着固定长度的网络地址。一个网络的类别以及网络地址，还有该网络上的主机数目都可以从地址的最高位得出。由于分类路由协议不指定子网的掩码或前缀长度，路由器必须使用路由通告中的地址类别去得出子网掩码以建立路由表。

在分类网络中，IP地址的分配把IP地址的32位按每8位为一段分开。这使得前缀必须为8，16或者24位。因此，可分配的最小的地址块有256（24位前缀，8位主机地址，28=256）个地址，而这对大多数企业来说太少了。大一点的地址块包含65536（16位前缀，16位主机，216=65536）个地址，而这对大公司来说都太多了。这导致不能充分使用IP地址和在路由上的不便，因为大量的需要单独路由的小型网络（C类网络）因在地域上分得很开而很难进行聚合路由，于是给路由设备增加了很多负担。

随着原为实验性的TCP/IP网络在80年代转变为互联网，对更灵活的寻址方法的需求日益迫切。这就导致了子网和CIDR的相继发展。因为原来的类别已被忽略，所以现在的系统被叫做无类别路由。它为当今的路由协议所支持，例如RIP-2，EIGRP，IS-IS和OSPF等，而相对的，原来的系统被叫做分类路由。

1993年，互联网工程任务组发布了一套新的标准和，以定义分配IP地址区块和路由IPv4资料包的新原则。更新版本于2006年发布。

## CIDR块

<image>

CIDR主要是一个按位的、基于前缀的，用于解释IP地址的标准。它通过把多个地址块组合到一个路由表表项而使得路由更加方便。这些地址块叫做CIDR地址块、CIDR块、CIDR区块或IP段。当用二进制表示这些地址时，它们有着在开头部分的一系列相同的位。IPv4的CIDR地址块的表示方法和IPv4地址的表示方法是相似的：由四部分组成的点分十进制地址，后跟一个斜线，最后是范围在0到32之间的一个数字：A.B.C.D/N。点分十进制的部分和IPv4地址一样是一个被分成四个八位位组的32位二进制数。斜线后面的数字就是前缀长度，也就是从左到右，被地址块里的地址所共享的位的数目。当只需说明大概时，十进制部分有时会被省略，因此，/20就表示一个前缀长度是20的CIDR地址块。如果一个IP地址的前N位与一个CIDR地址块的前缀是相同的话，那么就说这个地址属于这个CIDR地址块，也可以说是与CIDR地址块的前缀匹配。所以，要理解CIDR，就要把地址写成二进制的形式。因为IPv4地址的长度总是32位，N位长的CIDR前缀就意味着地址里前N位匹配，后$32-N$位不匹配。这些位有$2^{(32-N)}$种不同的组合，即$2^{(32-N)}$个IPv4地址与CIDR地址块的前缀匹配。前缀越短就能匹配越多的地址，越长就匹配得越少。一个地址可能与多个长度不同的CIDR前缀匹配。CIDR也用在IPv6中。因为位数的非常多，所以在IPv6中，前缀长度的范围是从0到128。这里也用同样的方法来表示一个地址：前缀写作一个IPv6的地址，后跟一个斜线，最后是前缀的位数。

## CIDR块的分配

互联网地址指派机构（IANA）向区域互联网注册管理机构（RIRs）分配数量多，前缀短的CIDR地址块。例如，包含有一千六百多万个地址的地址块由RIPE NCC（欧洲的RIR）管理。这些RIR各自负责管理一个单一区域（例如欧洲或者北美），然后它们把这些地址块分成小一些的地址块再分配给公众。这个细分的操作可能会由不同层次的团体进行多次。大型网络服务供应商（ISP）一般会从RIR申请CIDR地址块，然后再向根据它们客户的网络大小而分配更小的地址块。互联网工程工作小组鼓励由单一ISP服务的网络直接向ISP申请地址。而由多个ISP提供服务的，则经常会向适当的RIR申请独立的CIDR地址块。

<image>

例如，在90年代末，IP地址是被 www.freesoft.org 使用的。后来，分配发生了变化。这个包含两百万地址的块被ARIN（北美的RIR）分配给了MCI通信。MCI又将分配给了从MCI租用互联网连接的Automation Research Systems。ARS则用了这个地址块，其中就包含这个地址。这些CIDR前缀会在不同的地方使用。在MCI的网络之外，这个前缀会用于路由MCI的数据流。这些数据流不仅会去到，也会去到其他那些前11位相同的近两百万的地址里。在MCI的网络里，则会被用于路由到属于ARS租用的连接。最后，只有在ARS自己的网络内这个前缀才会被使用。

## 子网掩码

可变长子网掩码（VLSM）和CIDR并非相同的概念。1985年8月，RFC 950首次提及VLSM，当时仍然采用分类网络。最早期的网络是“两层架构”，顶层是互联网整体，底层是个别网络。VLSM容许企业自行建立子网，扩展为“三层架构”。

子网掩码把前缀编成一种与IP地址相似的形式的掩码。网络遮罩在950中曾允许指定非连续的位元，直到规定遮罩必须从左侧开始连续排列。在CIDR标记法中，前缀位元（prefix bits）总是连续的。有鉴于此限制，子网络遮罩和CIDR标记法的功能现在完全相同。

虽然CIDR和VLSM的表达方式相同，但目的和功能相反。CIDR把多个小网络合并成一个大网络（超网），VLSM则把一个大网络分割成多个小网络（子网）。

## 前缀聚合

CIDR的另一个好处就是可以进行前缀路由聚合。例如，16个原来的C类（/24）网络现在可以聚合在一起，对外显示了一个/20的网络了（如果这些网络的的地址前20位都相同）。两个对齐的/20网络又可进一步聚合为/19，依此类推。这有效地减少了要对外显示的网络数，防止了路由表爆炸，也遏制了互联网进一步扩大。

IP/CIDR｜Δ 与最后一个地址的差值｜掩码｜主机数 (、)｜类别｜备注

a.b.c.d/32｜+0.0.0.0｜255.255.255.255｜1｜1/256 C

a.b.c.d/31｜+0.0.0.1｜255.255.255.254｜2｜1/128 C｜d = 0 ... (2n) ... 254

a.b.c.d/30｜+0.0.0.3｜255.255.255.252｜4｜1/64 C｜d = 0 ... (4n) ... 252

a.b.c.d/29｜+0.0.0.7｜255.255.255.248｜8｜1/32 C｜d = 0 ... (8n) ... 248

a.b.c.d/28｜+0.0.0.15｜255.255.255.240｜16｜1/16 C｜d = 0 ... (16n) ... 240

a.b.c.d/27｜+0.0.0.31｜255.255.255.224｜32｜1/8 C｜d = 0 ... (32n) ... 224

a.b.c.d/26｜+0.0.0.63｜255.255.255.192｜64｜1/4 C｜d = 0, 64, 128, 192

a.b.c.d/25｜+0.0.0.127｜255.255.255.128｜128｜1/2 C｜d = 0, 128

a.b.c.0/24｜+0.0.0.255｜255.255.255.000｜256｜1 C

a.b.c.0/23｜+0.0.1.255｜255.255.254.000｜512｜2 C｜c = 0 ... (2n) ... 254

a.b.c.0/22｜+0.0.3.255｜255.255.252.000｜1,024｜4 C｜c = 0 ... (4n) ... 252

a.b.c.0/21｜+0.0.7.255｜255.255.248.000｜2,048｜8 C｜c = 0 ... (8n) ... 248

a.b.c.0/20｜+0.0.15.255｜255.255.240.000｜4,096｜16 C｜c = 0 ... (16n) ... 240

a.b.c.0/19｜+0.0.31.255｜255.255.224.000｜8,192｜32 C｜c = 0 ... (32n) ... 224

a.b.c.0/18｜+0.0.63.255｜255.255.192.000｜16,384｜64 C｜c = 0, 64, 128, 192

a.b.c.0/17｜+0.0.127.255｜255.255.128.000｜32,768｜128 C｜c = 0, 128

a.b.0.0/16｜+0.0.255.255｜255.255.000.000｜65,536｜256 C = 1 B

a.b.0.0/15｜+0.1.255.255｜255.254.000.000｜131,072｜2 B｜b = 0 ... (2n) ... 254

a.b.0.0/14｜+0.3.255.255｜255.252.000.000｜262,144｜4 B｜b = 0 ... (4n) ... 252

a.b.0.0/13｜+0.7.255.255｜255.248.000.000｜524,288｜8 B｜b = 0 ... (8n) ... 248

a.b.0.0/12｜+0.15.255.255｜255.240.000.000｜1,048,576｜16 B｜b = 0 ... (16n) ... 240

a.b.0.0/11｜+0.31.255.255｜255.224.000.000｜2,097,152｜32 B｜b = 0 ... (32n) ... 224

a.b.0.0/10｜+0.63.255.255｜255.192.000.000｜4,194,304｜64 B｜b = 0, 64, 128, 192

a.b.0.0/9｜+0.127.255.255｜255.128.000.000｜8,388,608｜128 B｜b = 0, 128

a.0.0.0/8｜+0.255.255.255｜255.000.000.000｜16,777,216｜256 B = 1 A

a.0.0.0/7｜+1.255.255.255｜254.000.000.000｜33,554,432｜2 A｜a = 0 ... (2n) ... 254

a.0.0.0/6｜+3.255.255.255｜252.000.000.000｜67,108,864｜4 A｜a = 0 ... (4n) ... 252

a.0.0.0/5｜+7.255.255.255｜248.000.000.000｜134,217,728｜8 A｜a = 0 ... (8n) ... 248

a.0.0.0/4｜+15.255.255.255｜240.000.000.000｜268,435,456｜16 A｜a = 0 ... (16n) ... 240

a.0.0.0/3｜+31.255.255.255｜224.000.000.000｜536,870,912｜32 A｜a = 0 ... (32n) ... 224

a.0.0.0/2｜+63.255.255.255｜192.000.000.000｜1,073,741,824｜64 A｜a = 0, 64, 128, 192

a.0.0.0/1｜+127.255.255.255｜128.000.000.000｜2,147,483,648｜128 A｜a = 0, 128

0.0.0.0/0｜+255.255.255.255｜000.000.000.000｜4,294,967,296｜256 A

通常来说，子网中的第一个地址（主机标识符中的所有二进制零的地址）都保留用于引用网络本身，而最后一个地址用作广播地址用于网络；这样可以将可用于主机的地址数量减少2个。在/30子网可提供的4个地址中，可用的主机地址只有2个。主机标识符只有1位元长度的网络变成没有可用的主机地址。

创建了一个例外，将网络仅有的2个地址直接分配到2台主机，以供点对点链接使用。地址（单主机网络）必须通过明确的路由规则访问，因为在这种网络中没有网关的空间。

在大于或的子网中，可用的主机地址数目通常减少2个，即保留作为广播地址的最大地址和标识网络本身的最小地址。

## IPv6的CIDR块

<image>

IPv6中使用的地址大小允许在每个站点实现全球路由摘要并能保证足够的地址池。IPv6网络的标准子网大小是一个块，这是运行静态地址的自动配置所必需的。

最初，IETF在中提出建议，所有终端站点都应得到一个地址分配。但对实际需要和做法的批评和重新评价导致在中提出了更灵活的分配建议，即建议一些站点的分配要小得多，例如用于家庭网络的块。

不同类型的网络线路可能需要不同的子网大小。子网掩码将网络标识符前缀的位数与接口标识符的位数分开。如果选择较小的前缀，所覆盖的网络数量就会减少，但每个网络中的地址会变的更多。

```
2001:0db8:0123:4567:89ab:cdef:1234:5678
|||| |||| |||| |||| |||| |||| |||| ||||
|||| |||| |||| |||| |||| |||| |||| |||128     单端口和[[回环]]
|||| |||| |||| |||| |||| |||| |||| |||127   路由器间点对点链接
|||| |||| |||| |||| |||| |||| |||| ||124
|||| |||| |||| |||| |||| |||| |||| |120
|||| |||| |||| |||| |||| |||| |||| 116
|||| |||| |||| |||| |||| |||| |||112
|||| |||| |||| |||| |||| |||| ||108
|||| |||| |||| |||| |||| |||| |104
|||| |||| |||| |||| |||| |||| 100
|||| |||| |||| |||| |||| |||96
|||| |||| |||| |||| |||| ||92
|||| |||| |||| |||| |||| |88
|||| |||| |||| |||| |||| 84
|||| |||| |||| |||| |||80
|||| |||| |||| |||| ||76
|||| |||| |||| |||| |72
|||| |||| |||| |||| 68
|||| |||| |||| |||64   单个LAN；[[SLAAC]]的默认前缀大小
|||| |||| |||| ||60   非常有限的[[6rd]]部署(/60 = 16 /64块)
|||| |||| |||| |56   最小的端口分配<ref name="RFC 6177"/>：例如家庭网络(/56 = 256 /64块)
|||| |||| |||| 52   /52 = 4096 /64块
|||| |||| |||48   大型地址分配池的典型分配(/48 =65536 /64块)
|||| |||| ||44
|||| |||| |40
|||| |||| 36   未来可能的[[区域互联网注册管理机构|本地互联网注册]]的 (LIR) 超小分配
|||| |||32    LIR最小分配
|||| ||28   LTR典型分配
|||| |24   LTR大型分配
|||| 20   LTR额外分配
|||16
||12   IANA额外分配给区域因特网登记册表<ref></ref>
|8
4
```

## 外部链接

- RFC 1518 - An Architecture for IP Address Allocation with CIDR
- RFC 4632 - Classless Inter-domain Routing (CIDR): The Internet Address Assignment and