每一个广播网和NBMA网络有一个DR。它主要执行两种功能。
1)DR产生所在网络的network-LSA。而不用每个相连的路由器都产生network-LSA。
2)与网络中其它所有的路由器建立邻接关系。减少LSDB交互时的带宽和路由器开销。
DR是很多邻接关系的端点。为了更有效的在广播网上进行泛洪,DR使用地址AllSPFRouters(224.0.0.5)多播它的LS更新包,而不是为每个邻接路由器单独发送更新包。
为了使新的DR的产生更平滑,每个广播网和NBMA网有一个BDR。
BDR也同网络上其它所有路由器建立邻接关系,在DR fail 时成为DR。
如果没有BDR,则DR fail时,需要重新选举DR,新选出的DR要与网络中所有其它的路由器建立邻接关系(同步LSDB),在这期间,网络将无法传输数据(发现DR down了之后,对应的network LSA将会失效,经过这个network的路由被删除)和LSA(没有邻接关系)。没有采用额外机制的情况,需要等到邻居DR的dead interval超时,才知道DR down了,这需要30-40秒的时间,期间,下一跳是DR的数据会丢失,下一跳是其他路由器的数据被正常转发。
有了BDR后,当DR down时,虽然网络传输数据被打断(所以要避免DR的变换,将可靠性高的路由的优先级配置高一些,并且先启用OSPF),但是LSA的传输不会被打断,但是数据中断的时间只是泛洪新的network LSA的时间(当然,还有其他路由器计算路由的时间)。
注意:DR和BDR之间也要建立邻接关系。
BDR同样使用地址AllSPFRouters(224.0.0.5)多播它的LS更新包。
N*(N-1)/2个邻接关系减少为(N-2)*2+1=2N-3个。
N=2、3、4、5、6…时
N*(N-1)/2=1、3、6、10、15…
2N-3=1、3、5、7、9…
现在有从1.0.0.1到6.0.0.1的数据,走RT3,RT3右面的接口down了之后,RT2仍然向RT3发送数据,但是RT3上已经没有到6.0.0.0/8的路由了。这个时候数据中断了。当RT6重新通告5.0.0.0/8的network LSA后,RT2会使用RT4作为下一跳。
不是DR,也不是BDR的路由器。
DRother之间不建立邻接关系,邻居状态是two-way。
DRother和DR、BDR之间建立邻接关系。DRother使用地址AllDRouters(224.0.0.6)多播它的LS更新包。
注意:AllDRouters,这个地址的目标除了包括DR,也包括BDR。
基本概念
阅读本文前你应该已经掌握了以下概念:
Tow-way、DR、BDR、DRother、邻居、邻接、network LSA。
参考资料
主要选举过程由RFC2328 9.4. Electing the Designated Router定义,但是不好理解,原因是定义使用了程序思维,而且考虑了健壮性问题。另外整个第9章讲的是接口状态机,而主要的接口状态就是DR、BDR、DRother,所以其实要充分理解DR选举要精读整个第9章。
直观理解
通常简单来理解DR选举,就是所有路由器都尝试成为DR,最高优先级者最终成为DR,然后选举BDR,次高优先级者成为BDR,这样理解,通常和实际选举结果吻合。但是在测试使用OSPF时,仍会产生很多关于DR选举的疑惑。原因在于,实际上选举时,先选BDR再选DR,而且最开始选举时,所有OSPF设备都不会声称自己是DR或者BDR。
选举流程
DR和BDR初始值为0,路由器运行选举算法时,考虑所有状态大于或等于2-way的邻居,自己也在考虑范围内,不考虑路由器优先级为零的路由器(RFC2328 P75),优先级为0的接口只能做DRother。
Cisco12.4和TRv7.8允许配置的优先级范围都是<0,255>。缺省值都是1。
第一步,选举BDR:只有没有声称自己是DR的路由器才可能成为BDR。如果只有一个路由器声称自己是BDR,选它做BDR。如果有多个路由器声称自己是BDR,拥有最高路由器优先级的路由器成为BDR。如果有多个路由器优先级同为最高,则选拥有最高路由器ID的路由器。如果没有路由器宣布自己是BDR,则选拥有最高路由器优先级的路由器(这个路由器必须也没有宣布自己是DR)。如果有多个路由器优先级同为最高,则选择router-id大的路由器。
第二步,选举DR:如果只有一个路由器声称自己是DR,选它做DR。如果有多个路由器声称自己是DR,拥有最高路由器优先级的路由器成为DR。如果有多个路由器优先级同为最高,则选择router-id大的路由器。如果没有路由器宣布自己是DR,则将新选出来的BDR作为DR(此时BDR和DR是同一台路由器)。
如果路由器新成了DR或者BDR或者不再是DR或者BDR,则重复上面两步。这保证一台设备不会同时选自己是DR和BDR。
先选举BDR后选举DR,然后再加上当DR fail时,原先的BDR成为DR后,才可以选举新的BDR,从而保证了DR down后,平滑的过度,防止了某个DRother发现DR down了,就开始竞选DR或者BDR。
DR可能不是优先级最高的
如果某个设备优先级最高,而且加入network的时间不晚于其他设备30s(waiting timer 的40s再留出10s,达到two-way状态),就一定可以成为DR,晚于30s就不一定能成为DR了(取决于它能参加选举时,选举是否已经完成)。
类似的
如果某个设备优先级第二高,而且加入network的时间不晚于那些优先级低于自己的设备30s(waiting timer 的40s再留出10s,达到two-way状态),就一定可以成为BDR,晚于30s就不一定能成为BDR了(取决于它能参加选举时,选举是否已经完成)。
说DR可能不是优先级最高的,BDR也可能不是优先级排第二的,是因为他们错过了选举的时间窗口。
选举的时间点
如果一台路由器加入一个网络,开始一个waiting定时器。如果发现一个状态大于等于two-way的邻居声称自己是BDR(即BackupSeen event type1),则删除waiting定时器,该路由器开始进行选举,如果也已经有人宣称是DR,则该路由器最终是DRother状态(从外部现象来看就是不参加选举),如果还没有人宣称时DR,原来的BDR升为DR后,这个路由器参与BDR选举,可能是DRother也可能是BDR。如果发现状态大于等于two-way的邻居声称自己是DR,并且没有BDR(即BackupSeen event type2),则删除waiting定时器该路由器开始BDR选举,如果等到waiting超时都没有BackupSeen发生,则该路由器开始BDR选举。
选出过程中如果出现Neighbor Change则再次进行选举:包括 有邻居加入tow-way列表,有邻居退出tow-way列表,有邻居开始宣称自己是DR或者BDR,有邻居不再宣称自己是DR或者BDR,邻居的优先级发生了变化。
选举方式
每个路由器自己内部独立进行选举,通过hello报文把自己的选举结果告诉别人。
选举结束
当所有路由器的选举结果都一致时,选举完成。
不用担心很需要很长时间才能完成选举。
如果所有路由器在10秒内加入网络,则不管有多少台路由器,开始选举后,10s内就可以完成选举。
如果所有路由器在30秒内加入网络,则不管有多少台路由器,开始选举后,30s内就可以完成选举。
选举耗时最长的情况是,第一个路由器在0s加入网络,然后每隔二十多秒就加入一个优先级更高的路由器。
抓包看选举效果须知
GSRv7.6 OSPF是wait时间是40s,如果network中只有这一个OSPF router,则前四个hello报文DR、BDR都是0.0.0.0。等到第5个hello报文,DR就是自己(的接口地址)了,BDR还是0.0.0.0。
Ciscov12.4 OSPF的wait时间也是40s,如果network中只有一个OSPF router,则前4个hello报文DR、BDR都是0.0.0.0。等到第五个hello报文,DR就是自己(的接口地址)了,BDR还是0.0.0.0。
ZebOSv7.10,如果network中只有一个OSPF router,则前5个hello报文DR、BDR都是0.0.0.0。等到第六个hello报文,DR就是自己(的接口地址)了,BDR还是0.0.0.0。
可见cisco是在发送第五个hello报文前开始选举(先设置waiting timer,然后再发送第一个hello报文,这样一来,发送第五个hello报文前,waiting timer已经超时),zebos是在发送第五个hello报文后开始选举。原因是ZebOS提前发送了第二个hello报文,第一个hello报文后大约9秒就发送了第二个报文(之后还是每隔10s发送一个hello报文)。这样一来39s时发送第5个hello报文,40s时waiting timer才超时。
DR和BDR选举举例
举例1
高优先级者晚20多秒启用OSPF,仍然当选DR。
Ciscov12.4-50.0.80.1/24(pri 200)---50.0.80.2(pri 100)/24-ZebOS7.10
ZebOS先启用OSPF,24秒后Cisco启用OSPF。
选举过程:
34s时在ZebOS看来cisco进入了two-way状态。
40s时ZebOS waiting超时,发现没有人宣称是BDR,所以选举优先级高的cisco为BDR,ZebOS发现没有人宣称是DR,所以将新选出来的BDR选为DR(这个时候DR、BDR都是cisco)。
64s时,cisco waiting超时,发现没有人宣称是BDR,所以选举自己为BDR,然后又发现没有人宣称是DR,所以将先选出的BDR(自己)选为DR(这个时候DR、BDR都是cisco)。然后cisco再次选举BDR,因为自己已经声称是DR,所以选择ZebOS为BDR。然后再选举DR,发现只有自己声称是DR,所以还是选自己为DR。
ZebOS收到cisco 64s时的hello,再次进行选举,因为cisco宣称自己是DR,所以选举自己为BDR,然后选举DR,因为只有cisco宣称为DR,所以还是选cisco为DR。选举过程结束。
如果在45s时有第三台路由器router3(优先级240)加入这个网段,会怎么样?
答案:router3当选DR。cisco当选BDR。
举例2
高优先级者晚30多秒启用OSPF,落选DR。
Ciscov12.4-50.0.80.1/24(pri 200)---50.0.80.2(pri 100)/24-ZebOS7.10
ZebOS先启用OSPF,35秒后Cisco启用OSPF。
选举过程:
40s时ZebOS发现没有人宣称自己是BDR,所以选择自己为BDR,然后因为只有自己宣称是BDR,所以选择自己做DR(此时ZebOS既是DR也是BDR),然后再次选举BDR因为ZebOS已经宣称自己是DR,所以不能再做BDR,所以选择了BDR为空。DR选举过程已经完成。
45s时在ZebOS看来cisco从one-way变成two-way。所以具有了选举资格。选举cisco为BDR。
Cisco在75s时waiting time超时,发现没有人宣称自己是BDR,所以参与BDR的选举,它选了自己。然后选举DR,发现ZebOS宣称自己是DR,所以选举ZebOS为DR。选举过程结束。
举例3和举例4
Ciscov12.4-50.0.80.1/24(pri 100)---50.0.80.2(pri 200)/24-ZebOS7.10
Cisco先启用OSPF,2秒后ZebOS启用OSPF
ZebOS先启用OSPF,2秒后Cisco启用OSPF
现象:cisco第五个hello报文DR、BDR字段填的都是ZebOS。ZebOS第六个hello报文DR填自己,BDR填0。
内部选举过程:
40s时Cisco waiting超时,发现没有人宣称是BDR,所以选举优先级高的ZebOS为BDR,Cisco发现没有人宣称是DR,所以将新选出来的BDR选为DR(这个时候DR、BDR都是ZebOS)。
42s时,ZebOS waiting超时,发现没有人宣称是BDR,所以选举自己为BDR,然后又发现没有人宣称是DR,所以将先选出的BDR(自己)选为DR(这个时候DR、BDR都是ZebOS)。然后ZebOS再次选举BDR,因为自己已经声称是DR,所以选择cisco为BDR。然后再选举DR,发现只有自己声称是DR,所以还是选自己为DR。
Cisco收到ZebOS的第六个hello报文后,发现没有人宣称是BDR,所以,而且ZeboOS已经宣称为DR,所以选举自己为BDR。然后cisco再次选举ZebOS为DR。
举例5和举例6
Ciscov12.4-50.0.80.1/24(pri 200)---50.0.80.2(pri 1100)/24-ZebOS7.10
Cisco先启用OSPF,2秒后ZebOS启用OSPF。
ZebOS先启用OSPF,2秒后Cisco启用OSPF
现象:是cisco在第五个hello报文中DR填cisco、BDR填ZebOS,ZebOS同意,第六个hello报文中也是DR填cisco、BDR填ZebOS。
内部选举过程:
40s时cisco发现没人宣称自己是BDR,所以选择自己为BDR,然后因为只有自己宣称是BDR,所以选择自己做DR(此时cisco既是DR也是BDR),然后再次选举BDR因为cisco已经宣称自己是DR,所以不能再做BDR,所以选择了ZebOS做BDR。
42s时ZebOS发现没有人宣称是BDR,所以选举自己做BDR,发现cisco宣称自己是DR,所以就选举cisco为DR。