1.CIDR是什么
无类域间路由(CIDR)编址方案
摒弃传统的基于类的地址分配方式,允许使用任意长度的地址前缀,有效提高地址空间的利用率。
就是一个ip加一个网络掩码,不过这个掩码不是之前只有3个值(A类:8,B类:16,C类:24),而是0-32随意的一个值。
例如:
208.12.128.0/17
2.如何理解CIDR格式
上图
可以理解为一个从0到(2^32-1)长的线段.
掩码32表示n个ip的点,数量n是2^32.
掩码31表示n个小线段1,每个线段1包含2(2^(32-31))个ip点,数量n是2^31.
掩码30表示n个小线段2,每个线段2包含4(2^(32-30))个ip点,2个小线段1(2^(31-30)),数量n是2^30.
以此类推,可以形象的理解成"刻度尺".
3.每个CIDR之间的关系
1.相离
见上图
208.12.16/24
208.12.21/24
2.相近
见上图
208.12.16/24
208.12.17/24
3.包含
如图
208.12.21/24
208.12.16/20
为什么2个CIDR不能相交?
2个CIDR假设为ip1/mask1,ip2/mask2.
mask3 = (mask1 > mask2) ? mask2:mask1;
ip1/(mask3) 和ip2/(mask3)只有相等和不相等2种情况。
不相等:相离或相近
相等:包含
形象的可以想象下“刻度尺”,其中就没有相交的情况。
4.ip最长地址前缀匹配
1.穷举法
已知一个ip假设为208.12.16.188
查找hash表,key为(ip & mask)
其中mask从32递减到0
最坏时间复杂度=O(32)*hash查找
2.最长前缀匹配
ip地址就是一个32bit的数,构建一个bit前缀树进行最长前缀匹配。
最坏时间复杂度=O(32)
3.线性表的2分查找
算出每一个CIDR的(ip & mask)值,按此值排序(从小到大)
当要查询一个ip地址时,假设为ip1,找出>ip1的第一个值,此值的左面的值假设为(ip2 & mask2)
判断一下 ip1 & mask2 是否=ip2(根据需要要可以判断一下此ip段的超集,构建线性表时,超集关系就可以得出)。
最坏时间复杂度=O(lg(n)),n为CIDR的数量。