很多小伙伴学习完OSPF中的DR/BDR选取规则以后,感觉很简单,不过在做实验的时候,会发现有的时候选取的DR/BDR并不是自己预期的,又会感觉很迷惑:难道是自己学习的选取规则有问题吗?
其实不是的,DR/BDR的选取,还有一个重要的知识点:DR/BDR是不可抢占的!不过在学习新知识点之前,我们先来复习一下DR/BDR的选择规则!
DR/BDR的选举规则
我们都知道DR/BDR是一个路由器接口的属性,它只能表示某个路由器在某个网段上是什么角色,并不能代表整个路由器,所以DR/BDR的选取是针对某个网段的。
例如在下面的多点接入拓扑中,有四台路由器在同一个网段10.1.1.0/24里,在这个网段上会选取DR、BDR。
四台路由器在初始的情况下,都会认为自己是DR/BDR, 在它们发送的报文中,也会把DR和BDR的标记置位。
当一台路由器收到比自己DR优先级更大的报文时,就会停止申明自己的DR/BDR,转为声明DR优先级更大的路由器为DR/BDR。
根据DR优先级选取
如果一台路由器收到的报文,DR优先级是相同的,就会比较Router ID,如果对方的Router ID比自己更大,也会声明对方是DR/BDR。
根据Router ID选取
上面就是DR/BDR的选择规则:
- 先比较DR优先级,最大的路由器会被选取为DR/BDR;
- 如果DR优先级相同,则会根据Router ID来选取DR/BDR;
DR/BDR选取的不可抢占性
如果事情都按照DR/BDR的选取规则来,则小伙伴就不会有疑问了,整个世界也就清静了。不过在我们查看DR和BDR的角色时,经常会看到成为DR/BDR的路由器并不是我们期望的。例如下图,有3个路由器,初始情况下,R3的DR优先级为30,值最大的,所以它会被选择为这个网段上的DR;R2的优先级次之,它会选择为这个网段上的BDR。
DR/BDR
此时如果在网络上,再添加一台路由器R2,DR优先级是50,这时会有什么反应呢?会不会R2成为新的DR,R3变成BDR呢?
新增一台路由器R2
事实上这时时候,网络上什么都不会变化,R3仍然作为DR存在,R1作为BDR存在!如果此时查看路由器的状态,你就会觉得DR/BDR的选择规则是错误的!
网络没有变化
其实上面所说的DR/BDR的选择规则并没有错误,出现这种情况的原因是DR/BDR的选取还需要遵循另外一个规则:DR/BDR的选取是终身的,不会被抢占!
意思就是说,在一个网段上,选取出DR/BDR以后,那在它Fail之前,就会一直是DR/BDR,不会被后来的高优先级的路由器取代!
为什么要这么做呢?OSPF的这种做法其实是符合实际网络的使用要求:稳定压倒一切。
切换DR/BDR时,需要重新通告LSA,网络会有短暂的流量不通,这在实际工作中,是不允许的。如果有高优先级的路由器加入网络,就切换DR/BDR,会有可能造成网络的震荡。比如新加入的OSPF路由器不稳定,一会UP,一会Down,那整个网络就没有办法使用了。
所以OSPF在设计的时候,就考虑到了这一点,DR/BDR选取以后,就不会发生改变了!
我们在实验室遇到这种情况,不用担心,直接把所有路由器的OSPF进程清除,让它们重新选取就可以了!但在实际网络中,是不能随便清除OSPF进程的!
并且很多时候,我们遇到DR/BDR不是我们期望路由器的情况,是我们的敲命令的动作慢了。初始情况下,一台路由器会等待40秒(默认)的时间,才会选取DR/BDR。如果高DR优先级的路由器在40秒以后才加入网络,就没有机会成为DR/BDR了!
DR优先级为0的路由器,不参与DR/BDR的选取
经过上面的描述,小伙伴应该能够明白了,即使路由器的DR优先级最大,也不一定能成为DR/BDR。而想让一台OSPF路由器永远的成某个为网段的DR/BDR,通过修改DR优先级和Router ID是行不通的。其实想让路由器永远成为DR,有且只有一种方法:将其它OSPF路由器的DR优先级设置为0。
当路由器的DR优先级被设置为0以后,它就不会参与这个网段上DR/BDR的选取了,它的角色永远就是DR Other。
DR优先级设置为0
当然这种做法的风险就是如果DR路由器Fail以后,整个网络就瘫痪了,没有办法转发报文。因为DR Other只能和DR交换路由信息,DR Other之间是不交换路由信息的。
总结
经过上面的描述,各位小伙伴应该对DR/BDR的选取机制和不可抢占的原因了解了吧?我在做一下简单的总结:
- 在同一个网段上,会选择DR优先级最高的路由器作为DR;
- 如果DR优先级相同,则会选取Router ID最大的路由器作为BDR;
- DR/BDR选取以后,就不能被抢占,永久生效,直到路由器Fail。