DR选举和BDR选举

本文详细介绍了OSPF协议中DR(Designated Router)和BDR(Backup Designated Router)的选举过程。在MA网络上,DR与BDR的选举基于Hello报文,所有路由器必须与DR和BDR建立FULL邻接关系。选举算法首先在DR集合中选出DR,然后在BDR集合中选出BDR。如果网络中没有BDR,会从DRother集合中选出。在选举过程中,若Wait计时器超时且未学习到DR/BDR,则所有路由器会依次进行DR和BDR的选举,直到选举结束并开始邻接建立。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### OSPF DR BDR 选举过程解释 在 OSPF 中,为了减少邻接关系的数量并优化路由更新的传播效率,在多路访问网络(如以太网)上会选出指定路由器(Designated Router, DR备份指定路由器(Backup Designated Router, BDR)。其余的路由器只与 DR BDR 建立完全邻接关系。 #### 选举条件 当两台或多台运行 OSPF 的路由器连接到同一个广播型或 NBMA 网络时,将触发 DR/BDR选举[^2]。选举基于以下标准: - **优先级(Priority)**:每台路由器接口有一个0至255范围内的优先级值,默认通常是1。此数值越高越有可能被选为 DR 或者 BDR。 - 如果存在相同最高优先级,则比较 **Router ID** 来决定最终胜出者;具有较高 IP 地址的设备更可能当选。 #### 选举流程 一旦满足上述条件,选举即刻发生,并遵循如下逻辑顺序执行: 1. 所有参与竞选的路由器发送 Hello 报文来交换彼此的身份信息以及当前已知的最佳候选对象是谁; 2. 接收到这些报文之后,各节点依据所接收的信息计算谁应该成为新的 DR 及其备用角色——BDR; 3. 当某个特定时刻所有成员达成一致意见后,正式宣布获胜者名单并向整个区域内通告这一变化情况; 4. 对于新加入或者重启后的路由器来说,只要发现已有现成可用的选择结果就会立即接受而不再重新发起投票程序。 ```python class OspfRouter: def __init__(self, priority=1, router_id=""): self.priority = priority self.router_id = router_id def elect_dr_bdr(self, routers): dr = max((r for r in routers), key=lambda x: (x.priority, x.router_id)) bdr_candidates = sorted([r for r in routers if not r == dr], reverse=True, key=lambda x: (x.priority, x.router_id))[:1] return {'dr': dr, 'bdr': bdr_candidates[0]} if len(bdr_candidates)>0 else None ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值