无类别域间路由CIDR

标准IP路由只理解A/B/C三类网络地址,在这些网络内部,子网划分可以提供更好的收敛。然而,没有方法来定义多个C类地址相关。这导致了一个被称为路由表爆炸的问题。比如一个有3000个主机的B类网络在主干网络上需要一条路由表记录,而同样主机数量的多个C类地址需要12条路由表记录(3000/254 = 11.8 ≈ 12)。互联网中有200多万个C类IP地址,如果每个C类IP地址在主干网中都有一条路由表记录,那路由表肯定得爆炸。不光是存储压力,查询这些路由表也需要消耗大量的时间,导致路由性能很差。

为了缓解路由表爆炸的问题,专家组提出了无类别域间路由(Classless Inter-Domain Routing,简称CIDR)的概念。

CIDR

CIDR不根据IP地址网络编号(也就是IP类型)来路由,它仅根据IP地址的高比特位来路由,这些比特位又被称为IP前缀。这种技术又被叫做可变长子网掩码(VLSM),一般来说,VLSM和CIDR是可以互相替换使用。

每个CIDR路由表包含32位IP地址和32位网络掩码,通过它们可以计算出IP地址的位数和前缀。如果一组连续的地址它们拥有相同的IP地址前缀,则它们可以被看成同一个网络。比如:

1
2
3
4
5
6
7
8
9
11000000 00100000 10001000 00000000 = 192.32.136.0 (C类IP地址)
11111111 11111111 1111---- -------- = 255.255.248.0 (网络掩码)
=================================================== 逻辑与
11000000 00100000 1001---- -------- = 192.132.136 (IP前缀)

11000000 00100000 10001111 00000000 = 192.32.143.0 (C类IP地址)
11111111 11111111 1111---- -------- = 255.255.248.0 (网络掩码)
=================================================== 逻辑与
11000000 00100000 1001---- -------- = 192.132.136 (IP前缀)

上述计算表明,C类IP地址段192.32.136.0-192.32.143.0拥有相同的IP地址前缀192.32.136.0,IP前缀共有20个比特位。

把多个网络地址合并成一个网络又被叫做超网,超网通过比自然网络掩码更短的网络掩码来路由,它和子网划分正好相反,子网划分使用比自然网络掩码更长的子网掩码来划分网络。通过不断合并网络到更短的网络前缀,可以极大减少主干网路由器中的路由记录数量。同时,申请到A/B类网络地址的机构进行对网络地址细分,分给更多的组织和机构,更加充分的利用IP地址资源。

比如,阿里云上的服务器的公网IP地址很多是以8或47开头的A类IP地址,这类地址在互联网发展的早期就被机构分配了,阿里云应该是拿到了这些A类地址通过IP前缀分割之后的若干个网段。

随着互联网早期的爆炸式发展,分类路由的局限性很快就暴露出来了,所以目前互联网中已经使用CIDR替换了分类路由,分类路由应该早就不存在了吧。

分类路由的局限性在于IP地址中不记录掩码长度,它必须要根据网络地址的类型,得出子网掩码是8位、16还是24位。在IPV6中吸取了这个教训,在IP地址中记录了掩码长度。