OSPF鄰居建立過程及報文詳解
R1配置如下:
router ospf 1
router-id 1.1.1.1
啓
network 2.2.2.2 0.0.0.0 area 0
network 192.168.1.0 0.0.0.3 area 0
R2配置如下:
router ospf 1
router-id 10.10.10.10
network 10.10.10.10 0.0.0.0 area 0 //在相應網段的接口上開啓OSPF,屬於區域0
network 192.168.1.0 0.0.0.3 area 0
OSPF鄰接已經建立成功,下面我們就來分析下整個鄰接建立過程:
首先來總結一下OSPF鄰接各個階段:
1.down state:路由器還末收到鄰居發來的HELLO包
2.init state:路由器收到鄰居發來的HELLO包,但在鄰居階段中看不到自己的ROUTER-ID
3.two-way state:路由器在收到鄰居發來的HEELO包中,能夠看到自己的ROUTER-ID,就進入該狀態(需要選舉DR和BDR的在這階段選舉)
4.exstart state:在選舉DR和BDR之後,開始選主從(ROUTER-ID大的為主,作用為了同步DBD的序列號)
5.exchange state:主從協商完成後,進行DBD的同步
6.loading state:DBD同步完成後,進行LSA的同步
7.full state:LSA同步完成之後
在NBMA還有個attempt(嘗試狀態):為NBMA網絡中的一個正常過濾狀態,即我發送了HELLO等待對方的迴應,如果對方不迴應則一直滯留在此狀態。
現在我們來分析一下每個報文的作用:
1.R1的接口上啓用了OSPF後,會向外組播發送OSPF的HELLO報文。SIP=192.168.1.1 DIP:224.0.0.5 TTL=1 (有DR和BDR網絡中,DR和BDR路由器向外送LSA的目標地址為224.0.0.5,DRother路由器向DR和BDR發送LSA的目標地址為224.0.0.6)
OSPF的頭部格式:
Version:OSPF的版本號,對於OSPFv2來説,其值為2,IPV6為3。
Message Type:OSPF報文的類型。數值從1到5,分別對應Hello報文、DD報文、LSR報文、LSU報文和LSAck報文。
Packet length:OSPF報文的總長度,包括報文頭在內,單位為字節。
Router ID:始發該LSA的路由器的ID。(優先採用手工指定,沒有則looopback最大的,再接口IP最大的,必須得有)
Area ID:始發LSA的路由器所在的區域ID。
Checksum:對整個報文的校驗和。
AuType:驗證類型。可分為不驗證、簡單(明文)口令驗證和MD5驗證,其值分別為0、1、2。
Authentication:其數值根據驗證類型而定。當驗證類型為0時未作定義,為1時此字段為密碼信息,類型為2時此字段包括Key ID、MD5驗證數據長度和序列號的信息。
説明:MD5驗證數據添加在OSPF報文後面,不包含在Authenticaiton字段中。
HELLO報文格式:
Network Mask:發送Hello報文的接口所在網絡的掩碼
HelloInterval:發送Hello報文的時間間隔。
Router-id Pri:路由器優先級。如果設置為0,則該路由器接口不能成為DR/BDR(0-255)。
RouterDeadInterval:失效時間。如果在此時間內未收到鄰居發來的Hello報文,則認為鄰居失效。
Designated Router:指定路由器的接口的IP地址。
Backup Designated Router:備份指定路由器的接口的IP地址。
Neighbor:鄰居路由器的Router ID。(上圖中還沒有形成鄰居所以沒有)
2.R2的接口上啓用了OSPF後,會向外組播發送OSPF的HELLO報文。SIP=192.168.1.2 DIP:224.0.0.5 TTL=1 (有DR和BDR網絡中,DR和BDR路由器向外送LSA的目標地址為224.0.0.5,DRother路由器向DR和BDR發送LSA的目標地址為224.0.0.6)
格式同上!
3.R1收到對方發來的HELLO包,並在鄰居字段中能看到自己的ROUTER-ID,進入TWO-WAY狀態。
active neighbor字段中為R1的ROUTER-ID 1.1.1.1 ,進入TWO-WAY狀態
4.R2收到對方發來的HELLO包,並在鄰居字段中能看到自己的ROUTER-ID,進入TWO-WAY狀態。
active neighbor字段中為R1的ROUTER-ID 10.10.10.10 ,進入TWO-WAY狀態
需要選舉DR和BDR的在這個階段中開始選舉,接口優先級高的優先成為DR或BDR,優先級相等時,ROUTER-ID大的為DR或BDR,其它的路由器為DRother。
5.在選舉DR和BDR(或不需要選舉DR和BDR)後,進入exstart state,開始選主從(ROUTER-ID大的為主,作用為了同步DBD的序列號)R1和R2分別向外發DBD報文,都認為自己為主,其中的I、M、MS位分別置1,I表示為第一個包,M表示後面還有更多包,MS表示為主
DBD報文的格式:
包括OSPF的首部信息+DBD信息 OSPF首部格式看前面有介紹,這裏不説了
Interface MTU:在不分片的情況下,此接口最大可發出的IP報文長度為1500。
options:可選項(見下面)
I(Initial):當發送連續多個DD報文時,如果這是第一個DD報文,則置為1,否則置為0。
M(More):當連續發送多個DD報文時,如果這是最後一個DD報文,則置為0。否則置為1,表示後面還有其他的DD報文。
MS(Master/Slave):當兩台OSPF路由器交換DD報文時,首先需要確定雙方的主(Master)從(Slave)關係,Router ID大的一方會成為Master。當值為1時表示發送方為Master。
DD Sequence Number:DD報文序列號,由Master方規定起始序列號,每發送一個DD報文序列號加1,Slave方使用Master的序列號作為確認。主從雙方利用序列號來保證DD報文傳輸的可靠性和完整性。
OSPF的可選項,但功能都是一樣的,下面講一下各個可選項的作用:
DN:用於基MPLS的VPN
O:表明始發路由器是支持Opaque LSA(類型9、10和11)
DC:當始發路由器支持按需電路上的OSPF能力時,該位被設置
L:包含鏈路本地信念
N/P:只用在Hello包中N=1説明支持NSSA 外部LSA,N=0,那麼路由器不發送和接收NSSA外部LSA P只用在NSSA中頭部 通知ABR把7類LSA轉化成5類LSA
MC :當路由器具有轉發IP組播能力時,被設置
E:E=1,接收5類LSA,=0不接收5類LSA
MT:設置了該位表示始發路由器支持多拓撲OSPF(MT-OSPF)
6.通過比較ROUTER-ID,R2的ID大所以成為主,R1成為備,R1使用R2的序列號497發送LSA的頭部信息給R2(I=0,M=1,MS=0)不為第一個包,後面還有包,為從
在BDB的主從協商完畢就進入了exchange狀態了。

7.R2收到R1發來的DBD中的LSA頭部信息,同時向R1發送DBD報文,攜帶LSA的頭部。
(I=0,M=1,MS=1)不為第一個包,後面還有包,為主,序列號+1為498
同時R2先知道自己的數據庫是否同步,所以發送LSR,請求沒同步的LSA
LSA的頭部格式:
LS age:LSA產生後所經過的時間,以秒為單位。LSA在本路由器的鏈路狀態數據庫(LSDB)中會隨時間老化(每秒鐘加1),但在網絡的傳輸過程中卻不會。
LS type:LSA的類型。常用有1、2、3、4、5、7類LSA。
Link State ID:具體數值根據LSA的類型而定。
Advertising Router:始發LSA的路由器的ID。
LS sequence number:LSA的序列號,其他路由器根據這個值可以判斷哪個LSA是最新的。
LS checksum:除了LS age字段外,關於LSA的全部信息的校驗和。
length:LSA的總長度,包括LSA Header,以字節為單位。
R2發送LSR請求,請求末同步的LSA,就是一些LSA的頭部信息
LS type:LSA的類型號 //上圖中為路由器LSA
Link State ID:鏈路狀態標識,根據LSA的類型而定。 //LDID 1.1.1.1
Advertising Router:產生此LSA的路由器的Router ID。//通告AD 1.1.1.1
8.R1收到R2發過來的BDB,要發送DBD的確認給DBD的主路由器也就R2,同時R1沒有DBD的包了,所以M=0,表示為最後一個DBD包。(但如果主再發DBD包過來,從還是要發DBD進行確認,這叫隱式確認)
DBD的確認就是發送一個DBD包,序列號為主的序列號,這叫隱式確認。
同時,R1也知道自己的數據庫哪些末同步,也向R2發送LSR請求末同步的LSA,也就是一些LSA的頭部信息
LS type:LSA的類型號 //上圖中為路由器LSA 1類LSA
Link State ID:鏈路狀態標識,根據LSA的類型而定。 //LDID 10.10.10.10
Advertising Router:產生此LSA的路由器的Router ID。//通告AD 10.10.10.10
在發送LSR時就進入了loading狀態。
R1收到R2發過來的LSR請求,則發回LSU給R1
發達LSU給LSR請求的路由(包含具體的LSA信息)
Number of LSAs:該報文包含的LSA的數量。
LSAs:該報文包含的所有LSA。
9.R2收到R1發來的LSU要對收到的LSU進行確認,發送LSACK叫做顯式確認。
LSAck報文用來對接收到的LSU報文進行確認,內容是需要確認的LSA的Header。一個LSAck報文可對多個LSA進行確認。
LSA Headers:該報文包含的LSA頭部。
同時接收到R1的LSR請求,發送LSU
包含多條LSA的具體信息
同時R2後面沒有DBD數據包了,要發送出最後一個DBD(M=0),告訴R1沒有DBD包了
10.R1收到LSU後,對該LSU發送確認LSACK
R1收到R2發來的最後一個DBD包後,還是要發回確認的。
exchange和loading之間沒有嚴格的界限,在exchange狀態也會傳送LSR、LSU、LSACK等信息,大家明白就好,不必太追究。這期間可能還有更多的LSA請求、更新、確認,直到LSDB的完全同步。
至此R1和R2的LSDB完全同步了,進入FULL狀態,R1和R2建立鄰接關係,每隔10s發送HELLO報文,運行SPF算法計算路由,把最最佳路由加入到全局路由表中。
:寫博文有半個多月了,雖然寫得不怎麼樣,但畢竟還是原創,寫起來還真不是一件易事,每次寫一篇至少要花2-3個小時,希望大家多多支持啊,你們的支持是我的動力!謝謝各位!