OSPF詳解(四):鄰居關係、鄰接關係、泛洪

Ospf中路由器之間存在兩種連接關係:鄰居關係和鄰接關係。

 

如果兩臺路由器之間共享一條公共數據鏈路(兩臺路由器中間沒有其它路由器,或者兩臺路由器之間存在虛連接),並且成功協商了hello包中所指定的參數,那麼它們就成爲鄰居。如果兩個鄰居之間需要同步LSDB,那麼它們之間需要建立鄰接關係。如果兩個路由器之間建立了鄰接關係,那麼它們的LSDB一定是同步的。LSA只在存在鄰接關係的路由器之間傳遞。

 

那麼鄰居關係和鄰接關係怎麼建立呢?

鄰居關係通過hello報文來建立。

Hello報文中包含如下一些內容:
1、始發路由器的router-id

2、始發路由器接口的area-id

3、始發路由器接口的地址掩碼

4、始發路由器接口的authentication type和authentication message

5、始發路由器接口的hello-interval

6、始發路由器接口的router dead-interval

7、路由器優先級

8、指定DR和BDR

9、標識可選性能的5個標誌位

10、始發路由器的所有有效neighbor router-id(始發路由器接收到了它們的hello報文)

以兩臺路由器之間建立鄰居關係爲例:

1、R1發送hello報文(組播或者單播,鏈路層類型來定),neighbor字段爲空

2、R2收到hello報文,爲R1建立一個鄰居數據結構,並把R1的鄰居狀態置爲init,然後向R1發送hello報文,neighbor字段中包含R1的rougerID,表示自己收到了R1的hello報文。

3、R1收到R2的hello報文之後,爲R2建立一個鄰居數據結構,並把鄰居狀態置爲2way,然後向R2發送hello報文,報文的neighbor字段中包含R2的routerID。

4、R2收到R1的hello報文後,把R1的鄰居狀態置爲2way

至此,鄰居關係就建立起來了,鄰居路由器之間會按時發送hello報文進行保活,如果hello報文超時,那麼該路由器就會宣告這裏鄰居失效。

 

所有路由器之間都達到2way狀態後,它們會根據網絡類型判斷是否需要選舉DR和BDR,如果需要的話就開始選舉DR和BDR。

 

鄰居路由器之間會判斷是否需要建立鄰接關係,怎麼判斷呢?

1、  如果是point-to-point鏈路,需要建立鄰接關係

2、  如果是point-to-multipoint鏈路,需要建立鄰接關係

3、  如果網絡類型是虛鏈路,需要建立鄰接關係

4、  本地路由器是網段上的DR,需要建立鄰接關係

5、  本地路由器是網段上的BDR,需要建立鄰接關係

6、  鄰居路由器是網段上的DR,需要建立鄰接關係

7、  鄰居路由器是網段上的BDR,需要建立鄰接關係

 

如何建立鄰接關係呢?其實鄰接關係的建立過程中就順帶把LSDB同步了。過程如下:

建立鄰接關係使用下面三種協議報文:

Hello報文type1、數據庫描述數據包type2、鏈路狀態請求報文type3、鏈路狀態更新報文type4、鏈路狀態確認報文type5

 

1、RT1的一個連接到廣播類型網絡的接口上激活了OSPF協議,併發送了一個

HELLO報文(使用組播地址224.0.0.5)。由於此時RT1在該網段中還未發現

任何鄰居,所以HELLO報文中的Neighbor字段爲空。

2、RT2收到RT1發送的HELLO報文後,爲RT1創建一個鄰居的數據結構,並且

將RT1的鄰居狀態機置爲Init。RT2發送一個HELLO報文迴應RT1,並且在報

文中的Neighbor字段中填入RT1的Router id,表示已收到RT1的HELLO報文。

3、RT1收到RT2迴應的HELLO報文後,爲RT2創建一個鄰居的數據結構,並將

鄰居狀態機置爲Exstart狀態。下一步雙方開始發送各自的鏈路狀態數據庫。

 

爲了提高發送的效率,雙方需先了解一下對端數據庫中那些LSA是自己所需

要的(如果某一條LSA自己已經有了,就不再需要請求了)。方法是先發送

DD報文,DD報文中包含了對本地數據庫中LSA的摘要描述(每一條摘要可

以惟一標識一條LSA,但所佔的空間要少得多)。由於OSPF直接用IP報文來

封裝自己的協議報文,所以在傳輸的過程中必須考慮到報文傳輸的可靠性。

爲了做到這一點,在DD報文的發送過程中需要確定雙方的主從關係。作爲Master的一方定義一個序列號seq,每發送一個新的DD報文將seq加一。作爲

Slave的一方,每次發送DD報文時使用接收到的上一個Master的DD報文中的

seq。實際上這種序列號機制是一種隱含的確認方法。如果再加上每個報文

都有超時重傳,就可以保證這種傳輸是可靠的。

RT1首先發送一個DD報文,宣稱自己是Master(MS=1),並規定序列號爲

x。I=1表示這是第一個DD報文,報文中並不包含LSA的摘要,只是爲了協商

主從關係。M=1說明這不是最後一個報文。

4. RT2在收到RT1的DD報文後,將RT1的鄰居狀態機改爲Exstart,並且迴應了

一個DD報文(該報文中同樣不包含LSA的摘要信息)。由於RT2的Router

ID較大,所以在報文中RT2認爲自己是Master,並且重新規定了序列號爲y。

5. RT1收到報文後,同意了RT2爲Master,並將RT2的鄰居狀態機改爲

Exchange。RT1使用RT2的序列號y來發送新的DD報文,該報文開始正式地

傳送LSA的摘要。在報文中RT1將MS=0,說明自己是Slave。

6. RT2收到報文後,將RT1的鄰居狀態機改爲Exchange,併發送新的DD報文來

描述自己的LSA摘要,需要注意的是:此時RT2已將報文的序列號改爲y+1了。

7. 上述過程持續進行,RT1通過重複RT2的序列號來確認已收到RT2的報文。

RT2通過將序列號+1來確認已收到RT1的報文。當RT2發送最後一個DD報文

時,將報文中的M=0,表示這是最後一個DD報文了

8. RT1收到最後一個DD報文後,發現RT2的數據庫中有許多LSA是自己沒有的,

將鄰居狀態機改爲Loading狀態。此時RT2也收到了RT1的最後一個DD報文,

但RT1的LSA,RT2都已經有了,不需要再請求,所以直接將RT1的鄰居狀態

機改爲Full狀態。

9. RT1發送LS Request報文向RT2請求所需要的LSA。RT2用LS Update報文來回

應RT1的請求。RT1收到之後,需要發送LS Ack報文來確認。上述過程持續

到RT1中的LSA與RT2的LSA完全同步爲止。此時RT1將RT2的鄰居狀態機改

爲Full狀態。

注:

以上過程是兩臺路由器由相互沒有發現對方的存在到建立鄰接關係的過程。或

者可以理解爲網絡中新加入一臺路由器時的處理情況。當兩臺路由器之間的狀

態機都已經達到Full狀態之後,如果此時網絡中再有路由變化時,就無須重複以

上的所有步驟。只由一方發送LS Update報文通知需要更新的內容,另一方發送

LS Ack報文予以迴應即可。雙方的鄰居狀態機在此過程中不再發生變化。

 

 

泛洪擴散:

當路由器檢測的LSA變化之後,會把這個LSA更新到整個網絡上。保證網絡上所有路由器的LSDB一致。

泛洪通過鏈路狀態更新報文type4和鏈路狀態確認報文type5進行,是一個可靠的過程。

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