如何拒绝入职:OSPF中DR与BDR触发

来源:百度文库 编辑:中财网 时间:2024/04/29 19:24:32

OSPF中DR与BDR触发

(2010-02-26 14:42:24)转载 标签:

杂谈

分类: CISCO

转载:

 

问题的提出:DRBDR选举的触发事件是什么?一个路由器,在什么情况下会认定DR/BDR选举完成,而DR/BDR选举完成则意味着这个多路访问网络已经稳定,那么换而言之,在什么情况下,一个路由器会认定这个网络已经稳定?

 

前置知识:已经大致了解DR/BDR选举过程,并至少已经通读了

TCP_IP路由技术(卷1)》中关于DR/BDR选举过程的描述。

 

解决问题:

 

首先我们来看下DR/BDR选举中,很少被人所知的过程,其实一个路由器是先选出BDR的!但此时的BDR不会被写入接口数据库,而是会立刻将此BDR提升到了DR的地位并写入数据库,然后会再看看是否有人声称他自己(这点在后面会提及)是BDR,如果没有人声称的话,他会再次进行BDR的选举,并写入接口数据库中向外发通告(总结自OSPFRFC文档)

 

当一个路由器新接入一个多路访问网络的时候,他会先等待waittime计时器到期,到期后,将按DR/BDR选举原则进行选举,其时间默认是hello间隔的四倍,而其之所以要先等待waittime计时器到期是因为它刚刚接入此网络,不知道此网络的状况,因此他需要收集hello包进行分析,这就是waittime计时器的作用。而如果其收集到的hello包有证据表明此网络已经稳定,即DR/BDR选举已完成,那么他将不会等待waittime计时器到期而立刻触发选举。那么,触发选举的的事件有哪些呢?

 

触发事件一:当新接入的路由器接收到了一个来自BDRhello包,且DR字段不为空后,他将不会等待waittime计时器到期而立刻选举。

 

提出疑问:为什么新接入的路由器宁可相信” BDR,而不愿相信DR的数据包呢?也就是说如果是DR发送了一个hello包,且DR/BDR字段都不为空,为什么不会触发选举?

其实仔细想想waittime计时器的作用,我们会发现其实只要路由器能够确定此网络中的DR/BDR的选举已经完成,那么waittime计时器即可不必理会,那么关键就在于路由器凭什么认定此网络中的DR/BDR的选举已经完成。仔细回顾下刚才所讲的DR/BDR选举中,很少被人所知的过程,我们会发现,BDR是最后被写入数据库的,这也就意味着,一旦BDR在数据库中出现,也就绝对意味着选举的完成,而如果是DR的话,显然不能说明什么问题。

 

转载:

OSPF实验2:DR/BDR的选取
实验级别:Professional
情况一:
我们都知道OSPF选取DR的过程是首先比较优先级,在优先级相同的情况下选择RID较高的为DR,但是我多次实验后发现在很多时候DR并非RID最高的路由器,这是什么原因呢?

在翻阅了卷一有关OSPF DR选取的介绍时,发现了这么一句话:“在一个多址网络上,最先初始化启动的两台具有DR选取资格的路由器
将成为DR和BDR路由器。”这是我总结了非最高RID而成为DR的实验,发现这些路由器都是我在进行OSPF配置的时候首先启动ospf的路由器,那会不会是因为这些路由器首先启动了OSPF,然后把自己设置为DR导致其他路由器启动OSPF后就不再进行DR的选取了呢?于是我做了下面的这个实验。


实验的topo很简单,我就不画了,就是两台路由器通过fa0/0口相连接。
R1:
conf t
ho R1
int lo0
ip add 1.1.1.1 255.255.255.0
int fa0/0
ip add 172.1.1.1 255.255.255.0
no sh
router ospf 10
net 172.1.1.1 0.0.0.0 a 0

R2:
conf t
ho R2
int lo0
ip add 2.2.2.2 255.255.255.0
int fa0/0
ip add 172.1.1.2 255.255.255.0
no sh

R1启动ospf进程后,我们在R2上暂时先不开启ospf,在R1上发现了以下信息:

R1#sho ip ospf int
FastEthernet0/0 is up, line protocol is up
   Internet Address 172.1.1.1/24, Area 0
   Process ID 10, Router ID 1.1.1.1, Network Type BROADCAST, Cost: 1
   Transmit Delay is 1 sec, State DR, Priority 1
   Designated Router (ID) 1.1.1.1, Interface address 172.1.1.1
   No backup designated router on this network
   Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
oob-resync timeout 40
Hello due in 00:00:01
   Index 1/1, flood queue length 0
   Next 0x0(0)/0x0(0)
   Last flood scan length is 0, maximum is 0
   Last flood scan time is 0 msec, maximum is 0 msec
   Neighbor Count is 0, Adjacent neighbor count is 0
   Suppress hello for 0 neighbor(s)

我们看到R1已经把自己设定为DR了,按照OSPF的规则,新加入的路由器即使RID比DR高,也不会替换DR这就说明了为什么在有些时候DR并非RID最高的路由器。

当然这个实验也顺便验证了ospf中DR选取结束后,除非DR路由器出现故障,否则就是有更高优先级或者RID的路由器进入OSPF进程,也是无法改变DR的。既DR是不可以抢夺的!

情况二(本实验参照了ITAA实验室Netfish的实验):
ospf中有一个Wait Timer计时器,在这个计时器所限定的时间内起来的OSPF可以视为同时起机。

   TCP/IP卷1第292页对于这个时间间隔是这样定义的:
Wait Timer:在开始选举DR和BDR之间,路由器等待邻居路由器的Hello数据包通告DR和BDR的时长。长度就是RouterDeadInterval的时间。

本实验拓扑与情况一相同,不同的地方在于当我们在R1上启动OSPF后,迅速(一定要迅速,非常迅速!40s之内)在R2上也启动ospf,通过debug信息可以看到以下情况:
R1#debug ip ospf adj
OSPF adjacency events debugging is on
R1#debug ip ospf ev
OSPF events debugging is on
*Aug 14 00:56:19.047: OSPF: Interface FastEthernet0/0 going Up
*Aug 14 00:56:19.051: OSPF: Send hello to 224.0.0.5 area 0 on FastEthernet0/0 from 172.1.1.1
*Aug 14 00:56:19.551: OSPF: Build router LSA for area 0, router ID 1.1.1.1, seq 0x80000001
*Aug 14 00:56:19.555: OSPF: Rcv hello from 2.2.2.2 area 0 from FastEthernet0/0 172.1.1.2
*Aug 14 00:56:19.555: OSPF: End of hello processing
R1(config-router)#
*Aug 14 00:56:29.051: OSPF: Send hello to 224.0.0.5 area 0 on FastEthernet0/0 from 172.1.1.1
*Aug 14 00:56:29.451: OSPF: Rcv hello from 2.2.2.2 area 0 from FastEthernet0/0 172.1.1.2
*Aug 14 00:56:29.455: OSPF: 2 Way Communication to 2.2.2.2 on FastEthernet0/0, state 2WAY
*Aug 14 00:56:29.455: OSPF: End of hello processing
R1(config-router)#
*Aug 14 00:56:39.051: OSPF: Send hello to 224.0.0.5 area 0 on FastEthernet0/0 from 172.1.1.1
*Aug 14 00:56:39.427: OSPF: Rcv hello from 2.2.2.2 area 0 from FastEthernet0/0 172.1.1.2
*Aug 14 00:56:39.427: OSPF: End of hello processing
R1(config-router)#
*Aug 14 00:56:49.051: OSPF: Send hello to 224.0.0.5 area 0 on FastEthernet0/0 from 172.1.1.1
*Aug 14 00:56:49.447: OSPF: Rcv hello from 2.2.2.2 area 0 from FastEthernet0/0 172.1.1.2
*Aug 14 00:56:49.447: OSPF: End of hello processing
R1(config-router)#
*Aug 14 00:56:59.051: OSPF: end of Wait on interface FastEthernet0/0
*Aug 14 00:56:59.051: OSPF: DR/BDR election on FastEthernet0/0
*Aug 14 00:56:59.051: OSPF: Elect BDR 2.2.2.2
*Aug 14 00:56:59.055: OSPF: Elect DR 2.2.2.2
*Aug 14 00:56:59.055:        DR: 2.2.2.2 (Id) BDR: 2.2.2.2 (Id)
*Aug 14 00:56:59.055: OSPF: Send DBD to 2.2.2.2 on FastEthernet0/0 seq 0x826 opt 0x52 flag 0x7 len 32
*Aug 14 00:56:59.059: OSPF: Send hello to 224.0.0.5 area 0 on FastEthernet0/0 from 172.1.1.1
*Aug 14 00:56:59.459: OSPF: Rcv hello from 2.2.2.2 area 0 from FastEthernet0/0 172.1.1.2
*Aug 14 00:56:59.463: OSPF: Neighbor change Event on interface FastEthernet0/0
*Aug 14 00:56:59.463: OSPF: DR/BDR election on FastEthernet0/0
*Aug 14 00:56:59.463: OSPF: Elect BDR 1.1.1.1
*Aug 14 00:56:59.467: OSPF: Elect DR 2.2.2.2
*Aug 14 00:56:59.467: OSPF: Elect BDR 1.1.1.1
*Aug 14 00:56:59.467: OSPF: Elect DR 2.2.2.2
*Aug 14 00:56:59.471:        DR: 2.2.2.2 (Id) BDR: 1.1.1.1 (Id)

这个时候我们发现两个路由器进行了DR/BDR的选取,并且结论和书上介绍的完全一致。

从Debug信息的时间上来看,从启动OSPF进程到开始选举DR和DBR的时间间隔是40秒,在这个时间段内,无论R1还是R2并没有选举DR和DBR。


在RFC2328中对这个时间间隔的定义如下:
Wait Timer
       A single shot timer that causes the interface to exit the
       Waiting state, and as a consequence select a Designated Router
       on the network.   The length of the timer is RouterDeadInterval
       seconds.

因为在广播链路中的RouterDeadInterval是40秒,所以我们看到的这个时间间隔为40秒。

结论:
   并不是先启动OSPF进程的路由器就是DR,而是有一个时间间隔让路由器来等待其他路由器,在这个时间间隔内,路由器相互监听Hello包中的DR和DBR字段中的信息,并且服从优先级原则,可以这样认为——选举是公平的。


实际情况:
   在实际的网络中,即使是40秒内同时起进程的情况也少见;实际情况下是率先启用ospf进程的路由器就很有可能成为DR,第二个启动的就很有可能成为BDR,考虑到路由器故障或者重启等情况,实际的运行效果是:“活”得最久的路由器成为DR(比多长时间不重起)

DR和BDR的产生
在初始状态下,一个路由器的活动接口设置DR和BDR为0.0.0.0,这意味着没有DR和BDR被选举出来。同时设置Wait Timer,其值为RouterDeadInterval,其作用是如果在这段数时间里还没有收到有关DR和BDR的宣告,那么它就宣告自己为DR或BDR。经过Hello协议交换过程后,每一个路由器获得了希望成为DR和BDR的那些路由器的信息,按照下列步骤选举DR和BDR:
(1)在路由器同一个或多个路由器建立双向的通信以后,就检查每个邻居Hello包里的优先级、DR和BDR域。列出所有符合DR和BDR选举的路由器(他们的优先级要大于0,接口状态要大于双向通信),列出所有的DR,列出所有的BDR;
(2)从这些合格的路由器中建立一个没有宣称自己为DR的子集(因为宣称为DR的路由器不能选举成为BDR);
(3)如果在这个子集里有一个或多个邻居(包括它自己的接口)在BDR域宣称自己为BDR,则选举具有最高优先级的路由器,如果优先级相同,则选择具有最高Router ID的那个路由器为BDR;
(4)如果在这个子集里没有路由器宣称自己为BDR,则在它的邻居里选择具有最高优先级的路由器为BDR,如果优先级相同,则选择具有最大Router ID的路由器为BDR;
(5)在宣称自己为DR的路由器列表中,如果有一个或多个路由器宣称自己为DR,则选择具有最高优先级的路由器为DR,如果优先级相同,则选择具有最大Router ID的路由器为DR;
(6)如果没有路由器宣称为DR,则将最新选举的BDR作为DR;
(7)如果是第一选举某个路由器为DR/BDR或没有DR/BDR被选举,则要重复2到6步,然后是第8步。
(8)将选举出来的路由器的端口状态作相应的改变,DR的端口状态为DR,BDR的端口状态为BDR,否则的话为DR other。
在多路访问网络中,DR和BDR与该网络内所有其它的路由器建立邻接关系,这些邻接关系也是该网络内全部的邻接关系。
由于DR和BDR的引入,简化了网络的逻辑拓扑结构,将一个网状网络转变成一个星型网络,使协议包的扩散,计算变的简单,并有效防止了邻接关系震荡的发生。