路由汇总,是将多条路由汇总成一条路由,通过俗点说,就是把多个IP地址汇聚成一个可以表示它们所有IP地址的IP地址。
举个例子,有如下路由:
192.168.1.0 192.168.2.0 192.168.3.0......192.168.255.0
汇总路由为:192.168.0.0
下面解释如何计算汇总路由:
现有明确路由:
172.16.1.0/24 172.16.2.0/24 172.16.3.0/24...........172.16.31.0/24
我们只看这些IP地址的第三个八位,就可以确定它们的不同的地方
172.16.1.0:00000001
172.16.2.0:00000010
172.16.3.0:00000011
.................
172.16.30.0:00011110
172.16.31.0:00011111
对比其前三位,相同。后五位,不同。因此确定其掩码位数为8+8+3=19
将后五位(不同位)全部相与(与运算),则可得出172.16.0.0
因此,通过这种计算我们可以得出其精确的路由汇总为:172.16.0.0/19
我在查看有关华为eNSP的书籍的时候,发现了以下路由:10.0.1.1/32与10.0.3.0/24汇聚路由是多少?
当时看到书上的实验命令是这么写的:rule deny source 10.0.1.0 0.0.254.255//注意0.0.254.255为通配符掩码,在我之前配置ACL的实验中可以看到详细解释,这里不再赘述:
把10.0.1.1/32和10.0.3.0/24做路由汇聚:
只看第三个八位(不解释,前面写的很清楚了)
10.0.1.1/32:00000001
10.0.3.0/24:00000011
好,一眼看出前六位相同,后两位不同。得出掩码位数:8+8+6=22
后两位全相与,得出路由汇聚的精确路由为:10.0.1.0/22
结果我当时错算成10.0.3.0/22,然后开始和同学讨论,为什么算出来的和书上的不一样?(其实就是算错了,当时没想那么多),然后我就误以为10.0.1.0/22包含了10.0.3.0/22,所以实验能做对。
这便引出了一个新的问题:
如何判断IP地址的包含于被包含的关系呢?
很简单,我们都知道如何判断两个IP地址是否属于同一网段,将IP地址与子网掩码进行与运算,得出的网络地址进行对比,即可得出结论,详细的解释请看我之前的一篇文章:
我们只看第三和第四个八位
10.0.1.0/22:00000001
11111111 11111111 11111100 00000000
10.0.3.0/22:00000011
11111111 11111111 11111100 00000000
与运算,得出结果:00000000
两者属于同一网段!
同理......................................
接下来讨论“真包含”这种情况。
很显然,只可能是宽的IP区间段去包含窄的IP区间段。(根据最长匹配原则判断)(最长匹配是指存在多条目的网段相同的路由时,匹配掩码最长的那一条。 因为掩码越长,表示的网段就越小,匹配也就越精确。 )
我们知道,子网掩码位数越大则IP区间段越窄,所以,在子网掩码位数不相等的情况下,我们所要解决的问题实际上就转换成了:
子网掩码位数较大的那个IP地址,是否属于子网掩码位数较小的那个IP地址段?
这个问题那就好办多了……
不妨令:
子网掩码位数较大的那个IP地址段的IP地址为ipAddr1;
子网掩码位数较小的那个IP地址段的IP地址为ipAddr2,子网掩码为mask2。
那么:
只要
(ipAddr1 & mask2) == (ipAddr2 & mask2)
成立,就说明包含关系成立!
证毕。
PS:不管对于IPv4地址还是IPv6地址,上面的思路都适用!