OSPF基本工作原理詳解


鄰居關系的建立

在接口激活運行OSPF路由器會以組播(組播地址為224.0.0.5)的形式發送Hello包來發現和維護鄰居關系。

       那么鄰居關系是如何建立的呢?下面以一個點對點鏈路為例來講解。(如下圖)

  R1的接口激活OSPF后開始發送組播的Hello報文(目的IP地址為224.0.0.5),在該報文的OSPF頭部信息中,填寫着R1的Router-ID以及該接口的區域ID。另外,該Hello報文中,填寫着該接口的網絡掩碼、Hello間隔、路由失效間隔,以及R1在該接口上所發現的鄰居,由於此時R1並未在該接口上發現任何鄰居,因此“鄰居”字段為空。

(Hello報文格式)

  R2收到這個Hello報文后,首先會對這個Hello報文進行檢查。由於雙方使用以太網接口互聯,在這種接口類型上,OSPF首先會檢查雙發的掩碼是否一致,如不一致,則忽略該報文。此外R2還會檢查接口的Hello間隔、路由失效間隔與收到的報文中的對應字段上是否一致,如不一致則忽略該報文(實際上R2對Hello報文的檢查項並不局限於上述內容)。當Hello報文檢查通過之后,R2將自己鄰居表中的R1狀態置為Init。

接下來,R2在自己發送的Hello報文的“鄰居”字段中寫入R1的Router-ID。而當R1收到R2發送過來的Hello報文並且在“鄰居”字段中發現自己的Router-ID時,它意識到鄰居R2已經發現自己了,並且認可了自己所發送的Hello報文中的相關參數,於是它將R2添加到自己的鄰居表並把讓R2的狀態設置成2-way。

隨后R1在自己發送的Hello報文的“鄰居”字段加入R2的Router-ID,R2收到該報文后,在其鄰居表中將R1的狀態切換到2-way。

       至此,R1和R2形成了鄰居關系。

       如果路由器的接口接入了一個多路訪問的網絡,那么OSPF鄰居關系達到2-way之后,將開始進DR和BDR的選舉。

DR和BDR的選舉

       在廣播網絡和NBMA網絡中,任意兩台路由器之間都要傳遞路由信息。如果網絡中有n台路由器,則需要建立n(n-1)/2個鄰居關系。這使得如果有任何一台路由器的路由發生變化都會導致多次傳遞,浪費帶寬資源。為解決這一個問題,OSPF定義了DR(Designated Router,指定路由器),所有路由器都只將信息發送給DR,由DR將網絡鏈路狀態發送出去,如下圖所示。 

 

  如果DR由於某種故障而失效,則網絡中的路由器必須重新選舉DR,再與新的DR同步。這需要較長的時間,在這段時間內,路由計算是不正確的。為了能夠縮短這個時間,OSPF提出了BDR(Backup Designated Router,備份指定路由器)的概念。

 

在多路訪問的網絡環境中(如廣播網絡,像普通的以太網)需要選舉出一台DR和一台BDR,以下是DR/BDR的選舉規則。

  1. OSPF priority最高者為DR。(默認所有路由器優先級為1,可以通過 ip ospf priority 接口命令修改)
  2. 如果優先級相同,則Router-ID最高的路由器為DR。(Router-ID為最大的接口IP地址,如果配置了loopback地址,則使用loopback地址作為Router-ID;如果配置了多個loopback,則以最高的loopback地址作為Router-ID;也可以通過router-id <address> 命令強制某個IP地址作為Rouer-ID)

 

PS:

  1.其中BDR的選擇,是優先級僅次於DR的路由器。

  2.如果路由器的優先級設置為“0”,則該路由器不參與DR/BDR的選舉,為DRother

  3.OSPF的DR(指定路由器)指的是路由器的一個活動接口,並非整台路由器。(DR和BDR只是一個接口概念

  4.DR不能搶占(若在一個OSPF多路訪問網絡中已經存在一台DR和BDR,如果DR down掉或重啟,則BDR自動升級為DR,同時在該網絡中重新選舉一台BDR.當原DR重啟后,雖然檢測到目前運行的BDR的Router-ID比自己的低,但也只能作為BDR或DRother運行(如果已經選舉了另一台BDR),這樣在一定程度上確保了鏈路狀態的穩定性)

 

DD報文的交互

  在ExStart(交換初始)狀態下,路由器發送空的DD報文以便協商Master/Slave, Router-ID最大的路由器會成為Master路由器,DD序列號就是由Master路由器決定的.用於Master/Slaver協商的報文是空的、不攜帶任何LSA頭部的DD報文,在這些報文中,I比特位被置為1。

開始時兩者都認為自己是Master,因此各自都在DD報文中將MS比特位被設置為1。R1在自己發送的DD報文中寫入自己設定的DD序列號——200,並且將MS比特位設置為1以向對端宣告自己的身份是Master。R2收到這個DD報文顯然是不同意的,因為它 的Router-ID比R1更大,因此在它發送的DD報文中,MS比特位也被設置為1,DD序列號則被設置為它自己使用的序列號——300。

  在Exchange(交換)狀態下,路由器向鄰居發送描述自己LSDB的DD報文,DD報文中包含LSA頭部信息(而不是完整的LSA數據),DD報文逐個發送,每個報文中都包含着DD序列號,DD序列號是由Master路由器決定的。這個序列號在DD報文交互的過程中被遞增,以確保DD報文交互過程的有序性和可靠性。

  R1收到DD報文后接受了自己並非Master路由器的事實(因為自己的Router-ID確實要更小),然后將R2的狀態切換到Exchange並發送帶有LSA頭部信息的DD報文,這個DD報文的序列號為300(也就是R2發送過來的序列號),M比特位置為1表示后續還有更多的DD報文,而MS比特位置為0(表示自己不是Master路由器)。

  接着R2收到了R1發送過來的DD報文,於是將R1的狀態切換為Exchange,隨后自己也開始發送攜帶LSA頭部的DD報文,此時DD報文的序列號為301(在上一個序列號300的基礎上加1),M及MS比特位均設置為1。由於雙方的LSDB中都包含較多的LSA,因此需要交互多個DD報文,而在該過程中,Master路由器R2將DD報文序列號逐次加1,Slave路由器R1則使用前者的DD序列號來發送自己的DD報文,如此這般的有序進行。

  如下圖所示,經過數次DD報文交互,R2發送的DD報文達到308,它繼續在DD報文中發送自己剩余的LSA頭部,R1收到該DD報文后,使用該DD報文發送了自己最后一個DD報文,在該報文中,它將M比特位置為0。

R2收到該DD報文后,繼續發送自己的DD報文,描述剩余的LSA頭部信,而恰好這也是它最后一個DD報文,它在該報文中將M比特位設置為0。

該報文到達R1后,雖然R1此時已經完全描述完了自己的LSDB,但是R1依然需要確認R2發送的最后一個DD 報文,於是它向R2發送了一個空的DD報文,該報文的序列號是309。

 

請求交互LSA

  R1及R2收到對方發送的最后一個DD報文后,便徹底了解了對方的LSDB中所包含的LSA頭部,此時它們需要從對方獲取感興趣的LSA的完整數據,因此R1將R2的另據狀態切換為Loading,R2同理。

       接下來便是數據庫同步的過程。在Loading狀態下,路由器向鄰居發送LSR以便請求LSA的完整數據。對方使用LSU報文進行回復,因此只有LSU報文中才有LSA的完整信息。在收到LSU報文后,路由器需要發送LSAck對其中的LSA進行確認。

       R1向R2發送LSR報文,用於請求感興趣的LSA,而R2則使用包含LSA完整數據的LSU報文進行回應。

同理,R2也向R1發送用於請求LSA的LSR報文,而R1也使用LSU報文進行回應。

雙方可能會交互多個LSR及LSU報文,直到LSDB實現同步。

形成鄰接關系

  R1和R2收到對方的LSU報文后,將報文中所包含的LSA加載到自己的LSDB中,並使用LSAck確認這些LSA。當R1或R2發現自己沒有其他的LSA需要從鄰居獲取后,便將另據狀態切換為Full。

至此,形成鄰接關系。

       LSA交換完成之后,路由器獲得完整的LSDB,運用SPF算法計算出最優路由加入OSPF協議中的路由表中。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM