關於卷一中DR/BDR選舉過程解釋
為什麼MA網路上需要進行DR和BDR的選舉?如果每個路由器都發送自己的LSDB資料庫的話,網路中會有大量LSA流量,而且這些lsa中很大一部分都是重複的.所以為了減少LSA資料包占用的頻寬,選舉DR和BDR來代表大家傳送LSA.
從上圖可以很容易的看出來,如果所有路由器形成鄰接關係之後,那麼需要25條LSA通告全網.
選舉DR之後,DR負責的任務是:
代表該MA網路,以及MA網路中其他attach上的路由器.
管理廣播流量
簡單來說,DR及背後的網段可以看做一個偽節點,從attach到該偽節點的路由器到偽節點的出向cost為正常的介面cost,但是從偽節點到所attach的路由器的cost為0.(沒太理解這段話啥意思.)
DR代表一個特定網段的偽節點,DR和BDR都是介面的概念而不是路由器的概念.
從上圖可以看出來所有路由器都是與DR建立鄰接關係.相互之間並不是常規的鄰接.
上面的設計有個問題,如果DR掛了,那麼就需要重新選舉DR,這個過程中網路是不可達的.所以,為了避免單點故障,ospf的設計是,啟用一個BDR.所有路由器同時與DR和BDR建立鄰接關係.而且DR和BDR之間也有完全的鄰接關係.這樣DR掛的時候,可以迅速切換到BDR上去,防止出現網路不可用的情況.
DR/BDR選舉的必要條件:
使用一個8bit的priority. 思科預設的priority為1,並且可以通過介面命令ip ospf priority來修改.0代表不參與選舉
hello資料包中帶有priority及自己認為的DR和BDR的介面地址的欄位.
一個介面在MA網路中啟用時,初始化DR和BDR欄位為0.0.0.0,並且設定一個與dead timer相同長度的wait timer
DR和BDR的資訊會被記錄到介面表中.
DR和BDR的選舉過程:(注意!!!這裡不是腦殘的簡單翻譯!!!!)
step1.After two-way communication has been established with one 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 on this list unless it is ineligible.
在廣播鏈路上,ospf路由器之間進入到2-way狀態之後,開始進行DR/BDR的選舉.首先,為什麼是2-way狀態開始進行選舉,因為在2-way狀態下,所有路由器的鄰居ID欄位裡都已經有了所有其他路由器的RID,保證了選舉的公平.
在初始化選舉的時候(注意,是初始化選舉),所有具有選舉條件的路由器都將自己的RID寫入hello包的DR和BDR欄位中.
step2.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).
第二步很讓人困惑,因為第一步中所有路由器都已經將自己的RID寫入DR欄位,那麼不生成自己是DR的子集一定為空.這一步看上去是與step1衝突的.這裡要注意的是,選舉的過程是在ospf程序啟動後一直存在的,也就是說這個過程是一直有效的,不僅僅是用於初始化的選舉.
換句話說,這個子集裡的所有路由器的DR欄位裡寫的不是自己的RID,所以,這一步其實是在為BDR做準備.
再來分析一下,現在有很多說法是ospf實際是先選舉BDR再將BDR推舉為DR,個人認為這種說法是錯誤的.從下面的步驟中我們可以看到,在初始化的狀態下,所有路由器都聲稱自己是DR和BDR,step2中的子集為空,應該跳轉到step5中進行DR的選舉.DR選舉出來之後,所有路由器的DR欄位寫的是DR的RID而非自己的RID,這時候就符合進入該子集的條件了.除DR外所有路由器都會進入該子集,開始進行BDR的選舉.
step3.If one 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.
step3比較明確,初始化的過程中所有路由器BDR寫的都是自己,在選舉完成後,只有BDR寫的是自己.其他都寫的是BDR的RID.
step4.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.
step4說的是,如果沒人聲稱自己是BDR,那麼就意味著BDR死了,那麼BDR將會重新選舉.(死人是不會說話的,同理可得,死掉的BDR也不會說話…所以,BDR不說自己是BDR了,那麼就意味著BDR掛了.)
step5.If one 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.
這一步是DR的選舉.如果很多人說自己是DR,那麼優先順序大的選作DR,優先順序一樣,RID大的是DR.(如果RID一樣呢,那麼你想多了,鄰居關係都起不來)
step6.If no router has declared itself the DR, the newly elected BDR will become the DR.
這一步和step4的概念差不多,主要就是如何判定DR掛了.DR不說話了就以為著DR掛了.這時候BDR自動成為DR.如果這時候DR還沒有選舉出來,那麼會先進行BDR的選舉,為什麼呢,因為大家的DR欄位裡還是寫的那個掛掉的DR,不符合step5的條件,所以step5沒有辦法執行.
step7.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.
step7印證了一個問題,這個過程不是僅僅給初始化的時候用的.
這裡有幾個問題需要注意:
選舉是路由器內部的一個過程,所以抓包是看不到太多資訊的.
DR和BDR一旦決定,在新路由器加入的時候不會有變化,那麼這種非搶佔特性是如何實現的?一個新上線的路由器不會知道自己到底是處在一個新啟動的網路環境還是已經有了DR/BDR的環境.所以,正常情況應該是一視同仁.但是,注意,選舉過程引入了一個wait time,一個新上線的路由器並不是立即開始選舉過程,而是先等待一個wait time,這個時間的引入是為了學習已有DR和BDR.這個時間DR和BDR欄位全部為0.
關於DR和BDR到底誰是先選舉,網路上現在很多人說是BDR先選舉出來.之後發現沒有DR,BDR自動當選DR.個人感覺這是對RFC文件的誤解讀.RFC給出的過程並不是一個嚴格的順序化過程,而應該是一個狀態的觸發機制.從debug吐出來的時間來看,兩者是同時的.但是很有可能是因為debug時間的粒度遠小於實際處理時間間隔.
從抓包來看,感覺是符合文件描述,先選舉DR的.(糾結這個問題好像沒有太大意義,廠商的具體實現並不一定完全遵循RFC文件)