1. 程式人生 > >OSPF建立鄰居、鄰接關系 學習筆記

OSPF建立鄰居、鄰接關系 學習筆記

net 步驟 數據 如何 一個 第一個 then 路由 由於

Ospf中路由器之間存在兩種連接關系:鄰居關系和鄰接關系。本博文將詳細介紹這2種關系建立及工作原理。

如果兩臺路由器之間共享一條公共數據鏈路(兩臺路由器中間沒有其它路由器,或者兩臺路由器之間存在虛連接),並且成功協商了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的RouterID較大,所以在報文中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報文予以回應即可。雙方的鄰居狀態機在此過程中不再發生變化。

轉自:http://blog.csdn.net/yiluyangguang1234/article/details/50571910

OSPF建立鄰居、鄰接關系 學習筆記