MA网络上要同时选举DR和BDR,MA网络上路由器都要与DR和 BDR形成FULL的邻接关系。其中,DR与BDR之间也是FULL的邻接关系,DRother 与 DRother之间则只存在邻居关系,状态为2-Way。
MA网络可以没有BDR,但不能没有DR。
DR的选举依靠Hello报文,在 two-way之后,交互Hello报文完成DR/BDR的选举。每台路由器根据收到的所有邻居的Hello报文,构建自己接口的数据结构,并按照算法,计算出DR和BDR。
选举DR/BDR算法
(1)路由器接口数据结构中维持三个集合,分别是:
DR集合:通过Hello学习到的所有DR路由器;
BDR集合:通过Hello学习到的所有BDR路由器;
DRother集合:没有被选举为DR/BDR的路由器(优先级不为0)。
(2)算法工作时,在 DR集合中选择最好的路由器,使其成为DR。在 BDR集合中选择最好的路由器,使其成为BDR。
OSPF 路由器在DR/BDR未选举出来之前,Hello报文中关于DR和 BDR的字段为全0,即为0.0.0.0。选举完成后,DR和 BDR 的字段记录已知的DR和BDR的RouterID。
路由器接口根据听到的Hello报文,生成邻居表并在接口维持三个集合:
DR集合
BDR集合
DRother(非 DR非 BDR但是有资格成为DR和 BDR的路由器)集合
过程如下。
当OSPF接口开启后,在Hello报文中设置DR/BDR字域为全0,此时 DR/BDR未知。同时,Wait timer启动,时长为4倍的Hello间隔。
如果收到的Hello报文中 DR及 BDR字域为非空,则 Wait计时器停止,接受当前DR/BDR的选择。
如果在Wait计时器超时后,仍未学习到DR/BDR,则开始DR/BDR选举。如果 BDR集合为空,则从 DRother集合选举BDR;如果 DR集合为空,则从BDR集合选举DR。
据此,如果在没有DR/BDR的网络上,Wait计时器超时后,网络上的每台路由器都会先从DRother集合选择BDR,再把BDR提升为DR;再重新从 DRother集合选择 BD