兩臺路由器之間建立鄰接關系的過程
在學習OSPF建立鄰居關系之前我們再來回憶一下RIP協議建立鄰居的過程。在運行RIP協議的路由器A啟動之后會向鄰居路由器B發送一個請求報文,鄰居收到后回應一個確認報文。然后路由器A將自己已知的所有報文發送給路由器B,并且每隔30秒周期性的向自己的鄰居發送。那么這樣一個看似簡單的過程有什么弊端呢?首先,RIP協議每個30秒周期性的發送是為了確保一臺路由器發生故障后能夠更新路由表。所以這每隔30秒周期性的發送報文包含了大量的路由信息實際上是一種浪費。因為如果網絡沒有發生變化,這些報文是沒有實際意義的。OSPF把維護路由信息報文和更新的路由報文這兩種報文分開來發送。如下圖所示:
RT1啟動之后發送一個Hello報文,Hello報文中包含了DR的地址,以及是否發現了鄰居。在此圖中,Neighbors Seen=0說明還沒有發現鄰居。RT2收到RT1發送來的Hello報文后,也向RT1發送一個Hello報文,這個報文中告訴RT1,DR為RT2,同時告訴RT1已經發現了RT1是自己的鄰居。RT1收到RT2發回來的回應報文后,這種狀態我們稱之為鄰居關系。在建立了鄰居關系后,RT1就開始向網絡發送LSA。但實際上,在網絡連接起來后,每臺路由器中的大部分路由都是相同的,這個時候如果RT1仍舊將自己所知的所有LSA發送給RT2那么也會造成浪費。
所以,在RT1向RT2發送LSA之前,會告訴RT2那些路由是自己需要的,那些是自己不需要的。在前面我們講到過在OSPF發送報文的時候會在LSA報文前加一個Head,在這個Head中包含了LSA的標示,就可以區分每條LSA。所以,RT1只需要向RT2發送Head就可以了,從而大大減少了發送的信息量。當RT2收到所有的Lsa的Head后會與自己本地的LSA中的Head進行比較,如果有不同的則向RT1發送請求(請求報文只發送Head報文)。
然而, LSA報文是基于IP的報文,IP的特點是不可靠盡力而為的轉發。所以LSA必須建議一種機制來確保對方能夠準確無誤的收到了自己發送的報文。所以LSA建立了一種類似TCP的確認和超時重傳機制,來保證報文的準確無誤的發送和接收。在圖示中,RT1向RT2發送一個DD報文,在***次發送的DD報文中不包含任何LSA信息,i代表了這時RT1發送給RT2的***個報文,M代表了后面還有更多的報文,而MS則告訴RT2自己是主發送,而誰的MS大誰就決定了使用誰的發送次序(Sq),只有MS才能夠在發送報文是將序號加一,在上圖中我們可以發現RT2成為了MS。當發送報文中的字段M=0得時候,就可以確認報文已經發送完。此時,RT1才會向RT2發送LS requese報文。RT2收到LS request報文后,發送LS Update報文,最有由RT1發送LS ack確認報文。通過這一系列的報文發送,每臺路由器就可以形成一個相同的LSDB。
【編輯推薦】