DR/BDR 選舉過程

關於DR/BDR的選舉似乎一直沒有定論,卷一中所寫的選舉過程實爲引用的RFC2328,而其內容用“過程”來定義似乎是不太容易理解的,準確來說,應該是狀態的觸發,我們想想可知,OSPF協議選舉DR/BDR過程的代碼不會是這些步驟的順序實現,所以我們在分析的時候要找到每一個步驟的觸發點,下面我具體分析一下,事先聲明這不是翻譯
 
1.  After two-way communication has been established with .e or more neighbors, examine the Priority, DR, and BDR fields of each neighbor's Hello. List all routers eligible for election (that is, routers with priority greater than 0 and whose neighbor state is at least two-way); all routers declaring themselves to be the DR (their own interface address is in the DR field of the Hello packet); and all routers declaring themselves to be the BDR (their own interface address is in the BDR field of the Hello packet). The calculating router will include itself . this list unless it is ineligible.
 
在廣播型鏈路上,所有OSPF路由器之間進入Two-Way狀態後開始觸發選舉過程,這個狀態下,每一臺路由器的鄰居ID字段都包含其他所有的路由器的ID,這是選舉公平的保證。
 
下一個關鍵點是,選舉初始化時,所有的路由器在一開始都宣稱自己是DR和BDR,這裏涉及到RFC中的兩個英文單詞 declare 和 claim,很多人認爲這上面有文章,其實這兩個單詞都有宣稱的意思,只不過declare用於更爲正式的場合,試想一臺OSPF路由器會有這等人性的思考?所以用詞我覺得作者可能都沒有怎麼考慮,因爲在路由器上實現所謂的“宣稱自己是DR/BDR”就是將自己的路由器ID寫入Hello包中DR ID字段中和BDR ID字段中

2.  From the list of eligible routers, create a subset of all routers not claiming to be the DR (routers declaring themselves to be the DR cannot be elected BDR).
 
第2步很有意思,似乎與第1步衝突,既然都聲稱自己是DR,那麼不聲稱自己是DR的子集一定爲空啊? 其實這是思維定勢,因爲一個選舉的代碼是要始終有效的,而不是僅僅用於初始化的選舉。
 
關鍵點就一句話:能進入這個子集的條件是,這臺路由器的DR ID字段裏寫的不是自己的ID,這第2步是爲下一步選舉BDR做準備的!
 
具體我們分析一下:在初始化狀態下,即網絡中沒有DR,所有人都宣稱自己是DR,也宣稱自己是BDR,根據原則,這個子集爲空,這時會直接跳到第5步,先去選舉DR,在DR選舉出以後,也就是網絡中存在DR,現象是這樣:除了DR在DR ID字段的寫的是自己的ID以外,別的路由器都不是寫的自己,而是選舉出的那個DR的ID,那麼這時就符合進入子集的條件了,除DR外的所有路由器都會進入這個子集,進行下一步,即BDR的選舉。

3.  If .e or more neighbors in this subset include its own interface address in the BDR field, the neighbor with the highest priority will be declared the BDR. In a tie, the neighbor with the highest Router ID will be chosen.
 
第3步,在選舉BDR的時候,大家都在BDR ID字段寫的自己的ID,選舉結果明確後,只有BDR發的Hello包中寫的是自己的ID,子集裏其餘的路由器都不是寫的自己ID,而是選舉出來的BDR的ID。

4.  If no router in the subset claims to be the BDR, the neighbor with the highest priority will become the BDR. In a tie, the neighbor with the highest Router ID will be chosen.
 
第4步應該這樣理解:如果這個子集沒有路由器說自己是BDR,那就意味着BDR死掉了(本來就他一個說自己是BDR,死了就說不出來了),BDR會重新選舉。

5.  If .e or more of the eligible routers include their own address in the DR field, the neighbor with the highest priority will be declared the DR. In a tie, the neighbor with the highest Router ID will be chosen.
 
第5步是DR的選舉過程,沒有所謂的子集概念,也不是第2步以後的步驟,而是不滿足第2步的條件直接跳到這一步。選舉DR的資格是:在DR ID字段中寫的是自己的ID

6.  If no router has declared itself the DR, the newly elected BDR will become the DR.
 
第6步中說到的如果沒有人宣稱自己是DR對應的情景是這樣,別人都說A是DR,A也應該說自己是DR,可是他死了,死人是不會說話的,所以BDR成爲DR,其實這一條就是說,如果DR當掉,BDR會成爲新的DR。而如果這時BDR還沒有選出來,還是會先進行BDR的選舉,然後BDR成爲DR,爲什麼,因爲大家的DR字段裏還是寫的那個死了的DR,不符合選舉DR的條件,第5步無法執行。

7.  If the router performing the calculation is the newly elected DR or BDR, or if it is no longer the DR or BDR, repeat steps 2 through 6.
 
其實這一步就是說明了這個程序不僅僅是爲初始化的選舉用的,當穩定的角色分配出現問題時,依然能通過這些原則使角色重新定義。
 
總結:
 
其實DR/BDR選舉就是“字段遊戲”,DR的選舉資格:在Hello包中的DR ID寫的是自己的ID,BDR的選舉資格:在Hello包中的BDR ID寫的是自己的ID 且在 DR ID字段寫的不是自己的ID,具體選舉還要看接口優先級和最高Router-id。

 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章