詳解OSPF路由器完全鄰接關系的建立過程
詳解OSPF路由器完全鄰接關系的建立過程
運行OSPF協(xié)議的路由器,如果你想正常運轉(zhuǎn)的話,那么就得和其他的路由器建立完全鄰接的關系。因為這種狀態(tài)下,同一個區(qū)域中的所有的路由器的LSDB都是完全同步的、一致的。其實呢,應該反過來說,當同一個區(qū)域中的所有的路由器的LSDB的完全同步、一致的情況下,OSPF路由器才算是達到了這個完全鄰接的狀態(tài)!
有這么幾個過程:
OSPF 處于 down 狀態(tài)----à Init狀態(tài)-----à 雙向(two—way)狀態(tài)-----à 鄰接狀態(tài)--à 預啟動( exstart )狀態(tài) ------à 交換(exchange )狀態(tài)----à 完全( full )鄰接狀態(tài)!
當配置了OSPF的路由器剛剛啟動的時候,這個協(xié)議還是處于down的狀態(tài)的,為什么呢?因為還沒有其他的路由器和他交換信息啊。所以他接下來要做的就是通過所有的OSPF接口向外發(fā)送HELLO分組,并且分組的目標地址是224.0.0.5 (這個地址代表的是哪些路由器呢?我認識吧,他代表的是與發(fā)送HELLO分組的路由器直接相連的那些路由器,就是指的那些直連路由器。并且在這里需要說明的是,HELLO分組不會被路由,這個HELLO分組的行程只有一跳。那我們看到的“HELLO分組在整個區(qū)域中的多個路由器之間進行擴展”又該如何解釋呢?HELLO分組在同一個區(qū)域中的多個路由器之間進行擴展,運用的不是路由功能,而是一個路由器發(fā)送這個HELLO分組到了直接相連的所有的路由器后,這些路由器就復制一個副本,并且將自己的信息添加進去后,就還是運用目標地址為224.0.0.5來分發(fā)這個HELLO分組到與自己直接相連的各個路由器上。就這樣一直下去,以此類推!)
所有的直連OSPF路由器接收到這個路由器發(fā)送來的HELLO分組后,就將這個路由器加入到鄰居列表中。這就是Init狀態(tài)!(這里說的這個“鄰居列表”說的是HELLO分組中的數(shù)據(jù)部分。如果不理解的話,可以去看看5種類型的OSPF分組的格式)。
所有的這些收到HELLO分組的路由器,都會向發(fā)送這個HELLO分組的路由器發(fā)送一個單播應答分組;其中包含著自己的信息(因為人家這個路由器也不是死的啊,人家也同時在進行這個過程啊,人家也有自己的一些鄰居啊),這個發(fā)回去的應答分組中的“鄰居列表”中自然是包含那個開始發(fā)送這個HELLO分組的路由器了。現(xiàn)在這個應答分組就是返回給他的。
原來那個路由器接收到這個應答分組后,先看看這個鄰居列表中是否包含自己。如果包含自己的話,就說明一個問題:即對方已經(jīng)知道我的存在了。并且接下來就將這個HELLO分組中帶來的那些鄰居表中包含的路由器ID加入到自己的LSDB中。這樣一來呢,這些路由器就建立了雙向( two-way )狀態(tài)。到此為止,所有的路由器之間都建立了雙向狀態(tài),即路由ID彼此出現(xiàn)在對方的鄰居列表中;
接下來,要看看網(wǎng)絡類型,確定下是否有必要進行DR與BDR的選舉。如果這個網(wǎng)絡屬于廣播類型的網(wǎng)絡(如以太網(wǎng)),那么就需要進行選舉。具體的選舉過程可以自己去查閱相關的資料。選擇了DR與BDR后,那么網(wǎng)絡中的路由器都只與這種身份的路由器建立雙向鄰接關系,然后路由器之間才能進行交換鏈路狀態(tài)信息。
注:當一個路由器加入到已經(jīng)有DR與BDR的廣播網(wǎng)絡時,將同所有的路由器(包括DR、BDR、DROTHER)建立雙向狀態(tài),但是只與DR與BDR建立雙向鄰接關系!并且我們需要知道的是,網(wǎng)絡中的所有的路由器都會定期的進行HELLO包的交換,以確保通信不中斷。默認的時間間隔是10S。這個HELLO分組中包含DR、BDR與一個路由器列表,其實他們都是鄰居,也可以說是已經(jīng)相互建立了雙向狀態(tài)的路由器。
還想來分析下這個“雙向狀態(tài)”與“鄰接”狀態(tài)的不同之處:
雙向狀態(tài):這個狀態(tài)下的路由器之間定期進行交換的是HELLO分組,通過這個HELLO分組可以學習到的是所有可能存在的鄰居。這個定期的交換,指的是10S一次,并且這個對象說的是同一個區(qū)域中的所有的路由器,他們相互之間都會定期的進行這個動作,而不是某些具備特定條件的路由器才進行定期的交換!
鄰接狀態(tài):這種狀態(tài)是在“雙向狀態(tài)”狀態(tài)下的一種提升。且,這種狀態(tài)下進行交換的已經(jīng)不是HELLO分組了,而是LSU了。并且,這種動作并不是定期的,而是觸發(fā)式的,即只要有鏈路狀態(tài)的改變,就會進行相應的LSU的建立、發(fā)送。并且這個動作也不是發(fā)生在同一個區(qū)域中的所有路由器之間了。而是發(fā)生具有特定身份的路由器之間的。即發(fā)生在一個普通的路由器(DROTHER)與一個特殊角色路由器(DR/BDR)之間。
上面是選舉了DR、BDR,各個路由器與DR、BDR建立了雙向鄰接關系,此時路由器就是處于預啟動(exstart)狀態(tài)了。這個狀態(tài)下,路由器已經(jīng)做好了發(fā)現(xiàn)有關互聯(lián)網(wǎng)絡的鏈路狀態(tài)信息并建立LSDB的準備。
處于預啟動狀態(tài)后,DR與BDR之間建立主從關系。接下來他們就開始互相交換DBD(此時就算是進入了交換狀態(tài)),這個就是5種OSPF分組中的第二種。里面包含的是LSDB中LSA條目的摘要信息。LSA是關于鏈路或者網(wǎng)絡的。摘要信息包括鏈路狀態(tài)類型、通告LSA的路由器的IP地址、鏈路的成本和序列號。當路由器收到DBD后并不是將其中的包含的內(nèi)容全部的收下,而是一步一步的采取下面的步驟:
1、首先給對方一個LSACK,來確認下已經(jīng)收到了這個分組;
2、將收到的信息同本身的LSDB中信息進行比較。如果有更新的條目的話,那么就向發(fā)送方發(fā)送一個LSR(這時候你就想了,他知道這個LSR發(fā)給誰嗎?只要想要的是什么嗎?呵呵、當然知道了,因為這些信息都在發(fā)送來的LSA摘要信息中包含著呢。尤其是那個“通告LSA的路由器的地址”。)
3、對方用LSU分組進行響應,該LSU中包含著有關被請求的條目的完整信息。同樣呢,收到這個LSU分組后,也要給對方一個LSACK進行確認下!
4、路由器將提供來的新的完整的LSA條目加入到自己的LSDB中。
彼此給對方提供所需要的全部LSA后相鄰路由器就處于同步和完全的鄰接狀態(tài)了。
上面說的是DR與BDR之間完全鄰接的這么一個過程,那么其他的互為鄰接關系的路由器達到完全鄰接的狀態(tài)也是這么一個過程。其實說的就是DRother 與 DR之間的完全鄰接過程!
那么如何來判定條目的新舊呢?通過摘要信息中的序列號字段就可以了,這個序列號是個長32位的字段,最小的一個序列號是0X80000001,最大的是0X8FFFFFFF。當序列號越大的時候,就表示越新!
路由器想轉(zhuǎn)發(fā)數(shù)據(jù)流的話,必須處于完全鄰接狀態(tài)。至此,區(qū)域內(nèi)所有路由器的LSDB都相同。