再回顧 OSPF之鄰居與鄰接關系
在學習ospf時,你是否還能回顧起鄰居建立的7中狀態和5中報文,如果還有疑惑可以參考我上一篇博科《再回顧CCNP之OSPF鄰居建立的7個狀態過程》,但是沒有詳細地描述鄰居與鄰接關系,通過本篇博科將好好再回顧一下ospf的鄰居與鄰接關系。
現在有兩句話:1、是鄰居關系一定是鄰接關系麽?不一定。
2、是鄰接關系一定是鄰接關系麽?是的。
下面我再來解釋一下:
在ospf鄰居創建的過程中,兩臺路由器之間共享一條公共數據鏈路(兩臺路由器中間沒有其它路由器,或者兩臺路由器之間存在虛連接),在init階段先有路由器發送hello包給鄰居,如果兩端都收到hello包並且hello包裏面所指定的參數都已協商完畢,這時候鄰居才建立,此時處於two-way狀態;繼續向下執行,如果兩個鄰居需要同步LSDB,它們之間需要建立鄰接狀態,如果兩個路由器之間建立了鄰接關系,那麽它們的LSDB一定是同步的。LSA只在存在鄰接關系的路由器之間傳遞。
鄰居路由器之間會判斷是否需要建立鄰接關系,有以下7中類型:
1、 如果是point-to-point鏈路,需要建立鄰接關系
2、 如果是point-to-multipoint鏈路,需要建立鄰接關系
3、 如果網絡類型是虛鏈路,需要建立鄰接關系
4、 本地路由器是網段上的DR,需要建立鄰接關系
5、 本地路由器是網段上的BDR,需要建立鄰接關系
6、 鄰居路由器是網段上的DR,需要建立鄰接關系
7、 鄰居路由器是網段上的BDR,需要建立鄰接關系
如何建立鄰接關系呢?
過程如下:
建立鄰接關系使用下面三種協議報文:
Hello報文type1、數據庫描述數據包DBD(type2)、鏈路狀態請求報文LSA(type3)、鏈路狀態更新報文LSU(type4)、鏈路狀態確認報文LSACK(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自己已經有了,就不再需要請求了)。方法是先發送DBD報文,DBD報文中包含了對本地數據庫中LSA的摘要描述(每一條摘要可以惟一標識一條LSA,但所占的空間要少得多)。由於OSPF直接用IP報文來封裝自己的協議報文,所以在傳輸的過程中必須考慮到報文傳輸的可靠性。
為了做到這一點,在DBD報文的發送過程中需要確定雙方的主從關系。作為Master的一方定義一個序列號seq,每發送一個新的DBD報文將seq加一。作為Slave的一方,每次發送DBD報文時使用接收到的上一個Master的DD報文中的seq。實際上這種序列號機制是一種隱含的確認方法。如果再加上每個報文都有超時重傳,就可以保證這種傳輸是可靠的。
RT1首先發送一個DBD報文,宣稱自己是Master(MS=1),並規定序列號為x。I=1表示這是第一個DBD報文,報文中並不包含LSA的摘要,只是為了協商主從關系。M=1說明這不是最後一個報文。
4. RT2在收到RT1的DBD報文後,將RT1的鄰居狀態機改為Exstart,並且回應了一個DBD報文(該報文中同樣不包含LSA的摘要信息)。由於RT2的RouterID較大,所以在報文中RT2認為自己是Master,並且重新規定了序列號為y。
5. RT1收到報文後,同意了RT2為Master,並將RT2的鄰居狀態機改為Exchange。RT1使用RT2的序列號y來發送新的DBD報文,該報文開始正式地傳送LSA的摘要。在報文中RT1將MS=0,說明自己是Slave。
6. RT2收到報文後,將RT1的鄰居狀態機改為Exchange,並發送新的DBD報文來描述自己的LSA摘要,需要註意的是:此時RT2已將報文的序列號改為y+1了。
7. 上述過程持續進行,RT1通過重復RT2的序列號來確認已收到RT2的報文。RT2通過將序列號+1來確認已收到RT1的報文。當RT2發送最後一個DBD報文時,將報文中的M=0,表示這是最後一個DBD報文了
8. RT1收到最後一個DBD報文後,發現RT2的數據庫中有許多LSA是自己沒有的,將鄰居狀態機改為Loading狀態。此時RT2也收到了RT1的最後一個DBD報文,但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報文予以回應即可。雙方的鄰居狀態機在此過程中不再發生變化。
再回顧 OSPF之鄰居與鄰接關系