如图一所示(假定没有所有非骨干区域都必须与骨干区域相连这条规则):
1、R6上有一个loopback接口,地址为:6.6.6.6/32,宣告进了Area 4.
2、R6会产生关于6.6.6.6的1类lsa,类型为stub,并传递给R2。
3、因为R2位于区域边界,连接两个不同的区域,所以会把1类lsa中描述路由信息的stub转换为3类lsa,并在其它区域传递。
4、在图一中,R1;R3;R4也都位于区域边界,所以当R1收到这份3类lsa时,会传递给R3,R3此时又传递给R7,R7传递给R4,R4同理也会传递给R2。
5、此时R2会认为去往6.6.6.6这个网段有两条路径可达,一条是直接走R6,另一条是走R4,如果R2选择了R4去往6.6.6.6,那就产生了R2-R4-R7-R3-R1-R2这个环路。
总结:因为有了以上环路的风险,所以开发者在设计OSPF时必须解决这个问题,也就有了规则一(所有非骨干区域都必须与骨干区域相连),那协议的设计者是如何保证规则一不被打破的呢?
要明白这个问题,首先需要明白一个非常重要的概念:ABR(区域边界路由器),需要满足以下三个条件才能成为一台真正意义上的ABR:
1、至少连接两个区域
2、连接的区域中有一个是区域零(骨干区域)
3、在区域零中至少有一个活跃的邻居
而定义ABR的作用就在于:只有ABR才能产生3类lsa,如图一所示,R3与R4都连接了两个区域,但他们却都不是ABR(不满足第2第3条),也就是说当R1这台ABR把描述6.6.6.6这条路由的3类LSA传递给R3时,因为R3不是ABR,所以不会把该条3类LSA传递给R7,R4在区域3中也就收不到这份3类lsa,同理R2也不会从区域2中收到关于6.6.6.6网段的3类LSA,也就防止了环路的产生。
接下来我们来研究一下第二个规则的必要性:
[color=rgba(0, 0, 0, 0.9)]
如图二所示:(假定骨干区域能被分割)
1、R2上有一个loopback接口,地址为2.2.2.2/32,宣告进了区域3。
2、R2作为区域2的ABR,所以会向区域2内产生关于2.2.2.2网段的3类LSA 3、R4从区域2中学习到此条3类LSA,因为R4也是一台ABR,所以R4也会向区域0中产生关于2.2.2.2网段的3类LSA。
4、R3从区域0中学习到此条3类LSA,因为R3也是一台ABR,所以R3也会向区域1中产生关于2.2.2.2网段的3类LSA。
5、R1从区域1中学习到此条3类LSA,因为R1也是一台ABR,所以R1也会向区域0中产生关于2.2.2.2网段的3类LSA。
6、此时R2学习到了两条关于2.2.2.2的路由,一条是自己产生的,另一条是R1发过来的,当R2自己产生的2.2.2.2不可达时,就会优选从R1过来的路由,所以就会导致R2访问2.2.2.2时出现R2-R1-R3-R4-R2这样一条环路。
总结:有了环路,一定要想办法规避,所以针对图二的环路问题,协议开发者制定了规则二(骨干区域不能被分割),为了保证规则二不会被打破,OSPF规定:从非骨干区域收到的3类LSA,ABR能接收但不会使用这条3类LSA(此条规定也可以称为OSPF的水平分割原则)。所以在上述的第三步中,R4作为一台ABR,从非骨干区域(Area 2)中收到一条3类LSA,R4是不会处理的(不会参与路由计算,不会泛洪),在上图中R4与R3都无法访问2.2.2.2网段,从而避免了环路。