張洋 王淑娟 白艷宇



摘 要: 在大中型網絡的部署中,OSPF協議常作為首選路由協議。在實際網絡環境中,經常會遇到OSPF鄰接關系無法建立,導致路由條目學習不到的情況。鄰接關系的建立是OSPF路由協議最基本的內容,如果連鄰接關系都建立不起來,就無從談LSDB和路由表的建立和維護了。鑒于OSPF鄰接關系建立的重要性,詳細介紹了OSPF鄰接關系建立的過程,旨在為無法建立鄰接關系時提供技術支持。
關鍵詞: OSPF; Hello包; 鄰接關系; LSA; DBD報文
中圖分類號:TP393 文獻標志碼:A 文章編號:1006-8228(2015)12-06-04
Analysis and research on the establishment of OSPF adjacency relationship
Zhang Yang, Wang Shujuan, Bai Yanyu
(Xuchang Prison, Xuchang, Henan 461000, China)
Abstract: In the deployment of large and medium sized networks, OSPF protocol can be used as the preferred routing protocol. In the actual network environment, if the OSPF adjacency relationship can't be established, the route item cannot be learnt from the other routers. The establishment of the adjacency relationship is the basic content of OSPF routing protocol. If the OSPF adjacency relationship can't be established, it is impossible to discuss the establishment and maintenance of LSDB and routing tables. In view of the importance of establishing the OSPF adjacency relationship, this paper introduces the process of establishing the OSPF adjacency relationship, which aims to provide technical support for the establishment of the adjacency relationship.
Key words: OSPF; Hello packet; adjacency relationship; LSA; DBD packet
0 引言
OSPF(Open Shortes Path First)開放式最短路徑優先協議,是所有廠商都支持的鏈路狀態路由選擇協議,應用非常廣泛,適應各種規模的網絡。OSPF協議中鏈路(Link)是指路由器的接口特征,狀態(State)是指路由器與其鄰居路由器之間的關系。Link-State描述了整個OSPF網絡的拓撲結構,對路由處理更加準確和快速,且不會產生環路。OSPF路由協議在對路由處理時,首先需要每個路由器都知道自己的鄰居是誰,其次要知道自己的本區域內有哪些路由器,最后還需要通過SPF算法對鏈路狀態數據庫中拓撲結構進行計算,得到其到達目的網絡的最佳路由。
在運行OSPF協議的路由器中都有三張表,分別是鄰居表(Neighbor Table)、鏈路狀態數據庫表(Link-State DataBase,LSDB)、路由表(Routing Table)。鄰居表中記錄著所有已經和建立雙向鄰居關系的路由器信息;鏈路狀態數據庫表中記錄著網絡中所有其他路由器的信息,列出網絡的拓撲結構;路由表中存放的是使用SPF算法算出到每個目的網絡的最短路徑。
1 OSPF的報文類型
為了交換鏈路狀態信息以及路由信息,OSPF路由器之間要先建立鄰接關系。在建立鄰接關系時,會涉及以下五種報文類型。
1.1 HELLO報文(Hello Packet)
HELLO報文主要用于建立和維護OSPF鄰接關系。路由器周期性的使用組播地址224.0.0.5發送Hello包給鄰居路由器。
1.2 DBD報文(Database Description Packet)
DBD是鏈路狀態數據庫描述信息,有時也可簡寫為DD,描述LSDB中的LSA頭部信息。
相鄰路由器之間相互發送DBD報文,報告對方自己所擁有的路由信息內容,包括LSDB中每一條LSA摘要。摘要是指LSA的頭部。這樣做是為了減少路由器之間傳遞信息的量,因為LSA的頭部信息只占一條LSA整個數據量一小部分,根據LSA頭部信息,對方路由器就可以判斷出是否已經有了這條LSA。
1.3 LSR報文(Link-State Request Packet)
LSR報文用于鏈路狀態請求,向OSPF鄰居請求鏈路狀態信息。
兩臺路由器之間互相交換DBD報文后,知道對方路由器有哪些LSA是本地LSDB所缺少的或者對方更新的LSA,這時需要發送LSR報文向對方請求需要的LSA,報文內容主要是需要的LSA摘要信息。
1.4 LSU報文(Link-State Update Packet)
LSU報文主要是鏈路狀態更新的內容,用于向對方路由器發送所需要的LSA,內容可以是一條或多條LSA。
1.5 LSAck報文(Link-State Acknowledgment Packet)
LSAck報文主要用于對LSU進行確認。
由于OSPF不是使用可靠的TCP協議,但OSPF包又要求可靠的傳輸,所以就有了LSAck包,它是用于來對接收到的LSU報文進行確認,內容是需要確認的LSA的頭部信息。
2 OSPF鄰接關系建立的過程
以路由器A(Router ID為192.168.1.1)和路由器B(Router ID為192.168.1.2)之間建立鄰接關系的過程為例,如圖1,共經歷12個過程交互,來介紹OSPF鄰接關系所經歷的狀態。首先需要說明OSPF鄰接關系狀態是有立足點的,是指立足于本路由器上看到對方的狀態,并不是兩臺路由器之間處于什么狀態。
2.1 Down狀態
初始狀態下,路由器AB的接口激活后處于Down狀態,沒有發現任何鄰居,但都有意愿發起尋找鄰居建立鄰居關系,所以就會在以組播的形式發送Hello包。Hello包中,有一個Active Neighbor字段,用來存儲已經發現的鄰居,Down狀態下該字段不存在。
2.2 Init(初始化)狀態
圖1中第1個過程是由路由器A通過組播地址224.0.0.5發送Hello包,Hello包中Active Neighbor字段為空。路由器B收到該Hello包就表明有OSPF鄰居嘗試和自己建立鄰居關系,所以路由器B把路由器A置為Init狀態,也就是在路由器B上看到路由器A的狀態是初始化狀態。之后路由器B將路由器A的Router ID存儲在自己將要發送的Hello包的Active Neighbor字段中。
圖2 Init狀態下的Hello包
2.3 Two-Way狀態
第2個過程,因為路由器B已經發現了路由器A,路由器B就將路由器A的Router ID存儲在自己Hello包的Active Neighbor字段中,并將含有鄰居信息的Hello包發送給路由器A。路由器A收到路由器B的Hello包,會發現對方的Hello包中Active Neighbor字段就是自己的Router ID,這個時候就意味著路由器AB之間已經建立起雙向雙邊關系,路由器A將路由器B的鄰居狀態置為Two-Way狀態。第3個過程,與此同時,路由器A也會將路由器B的Router ID放到自己的Active Neighbor字段中,發送Hello包。路由器B收到這個Hello包并看到自己的Router ID后,也會將路由器A的狀態置為Two-Way狀態。
圖3為路由器B發送的Hello包,Active Neighbor字段為192.168.1.1。
Two-Way之后,如果是廣播型多路訪問網絡(MA),會有一個選舉DR和BDR的,DR和BDR一旦選舉好,會在Hello包中相應字段填充,這個階段結束后進入準啟動/預啟動(Ex-Start)狀態。
2.4 Ex-Start狀態
接下來,路由器AB會進入Ex-Start狀態,在這個階段會發送DBD報文協商主/從關系。DBD報文是對本路由器LSA頭部信息的描述,DBD報文格式只有一種,但內容有兩種情況,第一種情況DBD報文沒有任何LSA頭部信息,是空的,主要用于協商鄰居之間的主從關系;第二種是裝載的有LSA頭部信息。
DBD報文字段中有三個位非常重要,分別是I、M、MS位。
I位:Init,置1,表明這是初始化協商報文,用于協商兩臺路由器的主從關系。當I=1時,DBD報文中不會包含LSA頭部信息,體積超小。這里需要說明DR和BDR是只在MA網絡中進行選舉指定路由器的,而主從是在后續的LSA同步過程中誰占主動,并依據主動一方的序列號seq,統一LSDB當中的LSA序列號,也就是協商該用誰的序列號。
M位:More,置1,表明后續還有更多的DBD更新。置0,表明是最后一個DBD報文,本路由器的情況已經描述完了。
MS位:Master,置1,表明本路由器是主動方。置0,表明本路由器是從動方。最開始路由器雙方都會認為自己是主動方,經過對比后,確定誰是主動方,對比原則是誰的Router ID大誰為主動方。
第4個過程,路由器A發向路由器B的DBD報文中I=1,M=1,MS=1,表明這是一條初始化協商報文,后續還有報文發送,路由器A會認為自己是主動方。第5個過程,路由器B收到路由器A發過來的DBD報文后,發現路由器A的Router ID小,B會認為自己是Master,所以MS=1。
圖4所示為第4個過程中初始化協商的DBD報文,I=1。
2.5 Exchange狀態
第6個過程,路由器A收到路由器B的DBD后,會發現路由器B的Router ID的確比自己大,會將自己的MS=0,主/從關系也協商完畢,I=0,此時進入Exchange狀態。進入Exchange狀態的標志是收到的DBD的I位置0,表示預啟動狀態結束,主/從關系協商完畢。路由器AB之間發送報文的序列號seq以路由器B的序列號為主,I=0,開始交互真正攜帶LSA頭部的DBD。
第8-9個過程,經過一系列的交互,路由器AB雙方都已經知道了對方的基本情況,也就是對方有多少個LSA頭部摘要信息。在所有的DBD交互完時,最后一個報文中的M=0,當收到這種類型的DBD報文就表示Exchange狀態結束。
2.6 Loading狀態
第10-12個過程,開始裝載更新本路由器需要的完整LSA。在本路由器上維護著一個列表,列表是需要向鄰居請求具體的LSA頭部信息,如果此時沒有任何LSA要更新,就直接進入Full狀態;如果有LSA更新,就發送關于LSA的請求,對方收到就回復LSU,LSU里包含完整的LSA信息。經過一系列的交互,雙方的LSA信息同步,就進入Full狀態,OSPF鄰接關系建立達到全毗鄰,開始進行路由收斂。
圖6為路由器A發送的一個LSR報文。
2.7 Full Adjacency狀態
Loading狀態結束后,也就是本地OSPF接口上再沒有待更新的LSA信息后,將鄰居置為Full狀態。
這里需要聲明如果是NBMA網絡(幀中繼)中,在Down狀態和Init狀態之間有一個Attempt狀態。該狀態表示最近沒有從鄰居收到信息,需要間隔一定時間向鄰居繼續發送Hello包嘗試聯系。
3 結束語
在運行OSPF協議的網絡中,路由器之間建立全毗鄰的鄰接關系是路由信息相互學習的前提條件,鄰接關系是否正常建立影響著OSPF后續工作,其重要性不言而喻。因此,本文對OSPF的基本概念進行了描述,研究了對OSPF中五種報文類型,并以實際的兩臺路由器之間建立鄰接關系的過程為例,通過抓包分析詳細介紹了鄰接關系建立過程中所經歷的每種狀態。
參考文獻(References):
[1] 劉海峰.解析Cisco設備中OSPF路由協議鄰居關系建立的
過程[J].產業與科技論,2011.10:55-56
[2] 黃向農,曾毅夫,譚永欣.關于OSPF路由優化技術的探討[J].
實驗技術與管理,2012.29(2):104-108
[3] 李淑紅.Packet Tracer在OSPF路由協議教學中的應用研究[J].
實驗室科學,2013.13(3):83-86
[4] 郭方平.OSPF路由協議安全性探討[J].中國新通信,
2014.15:45
[5] 潘楠,王勇,陶曉玲.基于OSPF協議的網絡拓撲發現算法[J].
計算機工程與設計,2011.5:1550-1567