|
在學(xué)習(xí)OSPF建立鄰居關(guān)系之前我們再來回憶一下RIP協(xié)議建立鄰居的過程。在運行RIP協(xié)議的路由器A啟動之后會向鄰居路由器B發(fā)送一個請求報文,鄰居收到后回應(yīng)一個確認(rèn)報文。然后路由器A將自己已知的所有報文發(fā)送給路由器B,并且每隔30秒周期性的向自己的鄰居發(fā)送。那么這樣一個看似簡單的過程有什么弊端呢?首先,RIP協(xié)議每個30秒周期性的發(fā)送是為了確保一臺路由器發(fā)生故障后能夠更新路由表。所以這每隔30秒周期性的發(fā)送報文包含了大量的路由信息實際上是一種浪費。因為如果網(wǎng)絡(luò)沒有發(fā)生變化,這些報文是沒有實際意義的。OSPF把維護(hù)路由信息報文和更新的路由報文這兩種報文分開來發(fā)送。如下圖所示:

RT1啟動之后發(fā)送一個Hello報文,Hello報文中包含了DR的地址,以及是否發(fā)現(xiàn)了鄰居。在此圖中,Neighbors Seen=0說明還沒有發(fā)現(xiàn)鄰居。RT2收到RT1發(fā)送來的Hello報文后,也向RT1發(fā)送一個Hello報文,這個報文中告訴RT1,DR為RT2,同時告訴RT1已經(jīng)發(fā)現(xiàn)了RT1是自己的鄰居。RT1收到RT2發(fā)回來的回應(yīng)報文后,這種狀態(tài)我們稱之為鄰居關(guān)系。在建立了鄰居關(guān)系后,RT1就開始向網(wǎng)絡(luò)發(fā)送LSA。但實際上,在網(wǎng)絡(luò)連接起來后,每臺路由器中的大部分路由都是相同的,這個時候如果RT1仍舊將自己所知的所有LSA發(fā)送給RT2那么也會造成浪費。
所以,在RT1向RT2發(fā)送LSA之前,會告訴RT2那些路由是自己需要的,那些是自己不需要的。在前面我們講到過在OSPF發(fā)送報文的時候會在LSA報文前加一個Head,在這個Head中包含了LSA的標(biāo)示,就可以區(qū)分每條LSA。所以,RT1只需要向RT2發(fā)送Head就可以了,從而大大減少了發(fā)送的信息量。當(dāng)RT2收到所有的Lsa的Head后會與自己本地的LSA中的Head進(jìn)行比較,如果有不同的則向RT1發(fā)送請求。
然而, LSA報文是基于IP的報文,IP的特點是不可靠盡力而為的轉(zhuǎn)發(fā)。所以LSA必須建議一種機(jī)制來確保對方能夠準(zhǔn)確無誤的收到了自己發(fā)送的報文。所以LSA建立了一種類似TCP的確認(rèn)和超時重傳機(jī)制,來保證報文的準(zhǔn)確無誤的發(fā)送和接收。在圖示中,RT1向RT2發(fā)送一個DD報文,在第一次發(fā)送的DD報文中不包含任何LSA信息,i代表了這時RT1發(fā)送給RT2的第一個報文,M代表了后面還有更多的報文,而MS則告訴RT2自己是主發(fā)送,而誰的MS大誰就決定了使用誰的發(fā)送次序(Sq),只有MS才能夠在發(fā)送報文是將序號加一,在上圖中我們可以發(fā)現(xiàn)RT2成為了MS。當(dāng)發(fā)送報文中的字段M=0得時候,就可以確認(rèn)報文已經(jīng)發(fā)送完。此時,RT1才會向RT2發(fā)送LS requese報文。RT2收到LS request報文后,發(fā)送LS Update報文,最有由RT1發(fā)送LS ack確認(rèn)報文。通過這一系列的報文發(fā)送,每臺路由器就可以形成一個相同的LSDB。
|
【收藏】【打印】【進(jìn)入論壇】 |
|
|
|
|
|
|
|