前言數據庫
上一章節根據5種報文和8種鄰居狀態機給你們介紹了OSPF協議的基本工做原理。5種報文、8種鄰居狀態機詳解OSPF工做原理ide
今天咱們作一個簡單的OPSF實驗,抓取OSPF協議交互的5種報文分析下OSPF路由協議創建鄰接關係的過程。oop
正文測試
1 OSPF 5種 報文頭格式
OSPF用IP報文直接封裝協議報文,協議號爲89。OSPF分爲5種報文,Hello報文、DD報文、LSR報文、LSU報文和LSAck報文。3d
OSPF報文頭格式:code
OSPF這五種報文具備相同的報文頭格式,長度爲24字節。router
一、Type: 1字節 ,表示OSPF報文的類型,有下面幾種類型:Hello報文;DD報文;LSR報文;LSU報文;LSAck報文。blog
二、Packet length :2字節,OSPF報文的總長度,包括報文頭在內,單位爲字節。接口
三、Router ID :4字節,發送該報文的路由器標識。進程
四、Area ID: 4字節 ,發送該報文的所屬區域。
五、Checksum :2字節,校驗和,包含除了認證字段的整個報文的校驗和。
六、AuType :2字節 ,驗證類型值有以下幾種表示, 0表示不驗證;1表示簡單認證;3表示MD5認證。
七、Authentication :8字節 ,鑑定字段,其數值根據驗證類型而定。當驗證類型爲0時未做定義;類型爲1時此字段爲密碼信息;類型爲2時此字段包括Key ID、MD5驗證數據長度和序列號的信息。MD5驗證數據添加在OSPF報文後面,不包含在Authenticaiton字段中。
OSPF Hello報文格式
Hello報文是最經常使用的一種報文,其做用爲創建和維護鄰接關係,週期性的在使能了OSPF的接口上發送。報文內容包括一些定時器的數值、DR、BDR以及本身已知的鄰居。
報文的字段解釋上一章解已經介紹過:5種報文、8種鄰居狀態機詳解OSPF工做原理
OSPF DD 報文格式
兩臺路由器在鄰接關係初始化時,用DD報文(Database Description
Packet)來描述本身的LSDB,進行數據庫的同步。報文內容包括LSDB中每一條LSA的Header(LSA的Header能夠惟一標識一條LSA)。
LSA Header只佔一條LSA的整個數據量的一小部分,這樣能夠減小路由器之間的協議報文流量,對端路由器根據LSA Header就能夠判斷出是否已有這條LSA。
在兩臺路由器交換DD報文的過程當中,一臺爲Master,另外一臺爲Slave。由Master規定起始序列號,每發送一個DD報文序列號加1,Slave方使用Master的序列號做爲確認。
一、Interface MTU: 16比特 ,在不分片的狀況下,此接口最大可發出的IP報文長度。
二、Options: 8比特 ,可選項
三、DD sequence number :32比特 DD報文序列號。主從雙方利用序列號來保證DD報文傳輸的可靠性和完整性。
四、LSA Headers :可變 ,該DD報文中所包含的LSA的頭部信息。
OSPF LSR報文格式
兩臺路由器互相交換過DD報文以後,知道對端的路由器有哪些LSA是本地的LSDB所缺乏的和哪些LSA是已經失效的,這時須要發送LSR報文(Link State Request Packet)向對方請求所需的LSA。內容包括所須要的LSA的摘要。
LSR報文格式以下圖所示,其中LS type、Link State ID和Advertising Router能夠惟一標識出一個LSA,當兩個LSA同樣時,須要根據LSA中的LS sequence number、LS checksum和LS age來判斷出所須要LSA的新舊。
一、LS type:32比特,LSA的類型號。
二、Link State ID:32比特,根據LSA中的LS Type和LSA description在路由域中描述一個LSA。
三、Advertising Router:32比特,產生此LSA的路由器的Router ID。
OSPF LSU報文格式
用來向對端Router發送其所須要的LSA或者泛洪本身更新的LSA,內容是多條LSA(所有內容)的集合。
LSU報文(Link State Update Packet)在支持組播和廣播的鏈路上是以組播形式將LSA泛洪出去。爲了實現Flooding的可靠性傳輸,須要LSAck報文對其進行確認。對沒有收到確認報文的LSA進行重傳,重傳的LSA是直接發送到鄰居的。
Number of LSAs:32比特,LSA的數量。
OPSF LSAck報文格式
用來對接收到的LSU報文進行確認。內容是須要確認的LSA的Header(一個LSAck報文可對多個LSA進行確認)。
LSAck(Link State Acknowledgment Packet)報文根據不一樣的鏈路以單播或組播的形式發送。
LSAs Headers:可變,經過LSA的頭部信息確認收到該LSA。
2 搭建ENSP實驗經過wireshark抓取ospf的5種報文
實驗拓撲以及配置:
如圖所示:PC1和PC2經過OSPF路由協議實現互通,全部路由器都劃分爲骨幹區域area 0。
下面咱們看下每臺路由器的配置:
R2: # interface Ethernet0/0/0 //配置PC1的網關 ip address 192.168.1.1 255.255.255.0 # interface GigabitEthernet0/0/0 //配置和R1的互聯IP ip address 10.1.1.1 255.255.255.252 # interface LoopBack0 //配置loopback做爲router id ip address 2.2.2.2 255.255.255.255 # ospf 1 router-id 2.2.2.2 //配置OSPF的進程號爲1,手動配置router id 爲2.2.2.2 area 0.0.0.0 //進入area 0視圖 network 192.168.1.0 0.0.0.255 network 2.2.2.2 0.0.0.0 network 10.1.1.0 0.0.0.3 # R1: # interface GigabitEthernet0/0/0 ip address 10.1.1.2 255.255.255.252 # interface GigabitEthernet0/0/1 ip address 10.1.2.1 255.255.255.252 # interface LoopBack0 ip address 1.1.1.1 255.255.255.255 # ospf 1 router-id 1.1.1.1 area 0.0.0.0 network 1.1.1.1 0.0.0.0 network 10.1.1.0 0.0.0.3 network 10.1.2.0 0.0.0.3 # R3: # interface Ethernet0/0/0 ip address 192.168.2.1 255.255.255.0 # interface GigabitEthernet0/0/0 ip address 10.1.2.2 255.255.255.252 # interface LoopBack0 ip address 3.3.3.3 255.255.255.255 # ospf 1 router-id 3.3.3.3 area 0.0.0.0 network 3.3.3.3 0.0.0.0 network 192.168.2.0 0.0.0.255 network 10.1.2.0 0.0.0.3
配置完成後,查看鄰居狀態:能夠看到鄰居狀態都達到FULL狀態了。
配置完成後,查看路由表
ping測試:能夠看到PC1能夠ping 通PC2
在路由器R1的g0/0/0上進行抓包
看下路由器R1和R2的交互過程;
第一階段:R1和R2經過Hello報文交互創建鄰居關係以及DR/BDR選舉,狀態從down-init-2-way
A、路由器R1和R2初始狀態爲down,配置了ospf後,會向組播地址224.0.0.5發送hello報文。
如圖所示爲R1發送的hello報文,R2發送的hello報文相似:
從IP報文頭能夠獲得:
一、Hello報文的源是R1的g0/0/0接口IP 10.1.1.2,目的IP是組播地址224.0.0.5.
二、Protocol字段爲89,表示上層是OSPF報文。
從ospf 報文中能夠獲得:
二、OSPF報文的總長度爲44字節。
三、發送該報文的路由器Router ID爲1.1.1.1 。
四、發送該報文的所屬區域Area ID爲 0.0.0.0。
六、認證類型表示不驗證;
B、路由器R2收到了鄰居R1發送的第一個hello報文,狀態變爲init,而且向R1發送一個hello報文,hello報文的鄰居中加入1.1.1.1。(R1收到該報文狀態變爲2-way)
C、路由器R1收到R2發送的第一個hello報文後,狀態變爲init,並會向R2發送一個hello報文,hello報文中鄰居中加入2.2.2.2。(R2收到該報文狀態變爲2-way)
D、經過hello報文選取DR和BDR,圖中能夠看到DR爲10.1.1.1 BDR爲10.1.1.2. (R1和R2的hello報文爲1,R1的router id 爲1.1.1.1 ,R2的routerID wei 2.2.2.2 .優先級相同時,則比較Router ID,值越大越優先被選舉爲DR,所以R2爲BR,R1爲BRD)
第二階段:R1和R2經過DD報文交互進行主從路由器的選舉和數據庫摘要信息的交互,狀態從exstart-exchange。
A、R2鄰居狀態變爲ExStart之後,R2向R1發送第一個DD報文,在這個報文中,DD序列號被設置爲345724,R2宣告本身爲主路由器。
B、R1也向R2發送第一個DD報文,在這個報文中,DD序列號被設置爲345726。R1也宣告本身爲主路由器。
因爲R2的Router ID比R1的大,因此R2應當爲真正的主路由器。
C、R2發送一個新的DD報文,序列號設置爲345724。表示通過協商後R2 是主路由器.
D、R1發送一個新的DD報文,在這個新的報文中包含LSDB的摘要信息,序列號設置爲R2第一次發送時使用的序列號(表示認可R2爲真正的主路由器),所以R1將鄰居狀態改變爲Exchange。
E、鄰居狀態變爲Exchange之後,R2發送一個新的DD報文,該報文中包含LSDB的描述信息,DD序列號設爲345725(上次使用的序列號加1)。
F、即便R1不須要新的DD報文描述本身的LSDB,可是做爲從路由器,R1須要對主路由器R2發送的每個DD報文進行確認。因此,R1向R2發送一個內容爲空的DD報文,序列號爲345725(R2上次使用的序列號加1)。
第三階段:R1和R2通LSR/LSU/LSACK報文交互創建徹底鄰接關係,狀態從loading-FULL。
一、發送完最後一個DD報文以後,R1將鄰居狀態改變爲Loading;鄰居狀態變爲Loading以後,R1開始向R2發送LSR報文,請求那些在Exchange狀態下經過DD報文發現的,並且在本地LSDB中沒有的鏈路狀態信息。
二、R2收到LSR報文以後,向R1發送LSU報文,在LSU報文中,包含了那些被請求的鏈路狀態的詳細信息。R1收到LSU報文以後,將鄰居狀態從Loading改變成Full。
三、R1向R2發送LSACK報文,用於對已接收LSA的確認。