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狀態了。



ospf無法建立鄰接關係如何處理 ospf無法建立鄰居原因_OSPF



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個小時,希望大家多多支持啊,你們的支持是我的動力!謝謝各位!