1.OSPF的數據包(5種)
Hello :發現建立並週期保護鄰居關係
DBD :數據庫描述包——進行主從關係的選舉,最重要的作用是發送LSDB目錄
LSR :鏈路狀態請求——對收到鄰接發來的LSDB目錄中,對於本地未知的LSA進行請求
LSU :鏈路狀態更新——對收到鄰接發來的LSR,攜帶LSA給鄰接
LSack :對DBD/LSR/LSU進行確認
2.OSPF的狀態機
Down :一旦收發hello包,直接進入下一狀態
Int :初始化——收到的hello包中含有本地的RID,進入下一狀態
2way :鄰居關係建立的標誌
條件匹配 :雙向通信——點到點直接進入下一狀態;MA網絡進行DR/BDR選舉(30s)。DR,BDR進入下一狀態,非DR,BDR保持鄰居關係,hello包週期保活即可。
exstart :預啓動——使用類似hello 的DBD包進行主從關係的選舉,RID大爲主,優先進入下一狀態
exchange :準交換——使用真正的DBD包進行LSDB目錄的交互
loading :加載——使用LSR/LSU/LSack獲取未知信息
full :轉發——鄰接關係建立的標誌
3.實驗抓包分析
3.1 Hello 數據報文(發現建立並週期保護鄰居關係)
(1)OSPF的頭部信息(OSPF Header)
(2)OSPF協議報文頭部字段,每種OSPF報文都包含。
字段 | 作用 |
---|---|
version | 描述OSPF協議版本 |
message type | 描述OSPF報文信息,1 hello ,2 DBD, 3 LSR,4 LSU,5 LSAck |
packet length | 描述OSPF報文長度 |
router id | 描述設備的router id |
area id | 描述所屬的OSPF區域 |
checksum | 校驗和 |
anth type | 0 null,1 明文,2 md5 |
auth date | 認證信息 |
(3)Hello包中內容分析
作用 | |
---|---|
network mask | 接口掩碼 |
hello interval | hello報文發送間隔,P2P,broadcast默認10s,P2MP,NBMA默認30s |
router priority | 接口優先級,用在Broadcast,NBMA型鏈路選舉DR,BDR,默認爲1,取值範圍0-255 |
dead interval | 鄰居失效時間,默認爲hello time的4倍 |
DR | 該鏈路上DR接口的IP地址,P2P,P2MP該字段爲0.0.0.0 |
BDR | 該鏈路上BDR接口的IP地址,P2P,P2MP該字段爲0.0.0.0 |
option | E bit=1 代表能交換5類LSA, N bit=0 代表不能交換7類LSA |
(4)任何情況下要滿足的建立鄰居關係的條件
- router id 不能衝突
- area id 必須一樣(必須在一個同區域)
- auth type 要一致
- auth data 要匹配
- hello interval 要一致
- dead interval 要一致
- E bit ,N bit 要一致
(5)特殊場景下對其他參數的要求
- P2P鏈路不要求地址在同一個網段,不要求掩碼一致。
- broadcast,NBMA 要求地址必須在同一個網段,掩碼必須一致。
- P2MP 要求地址必須在同一個網段,默認情況下要求掩碼一致,但可以通過命令忽略對掩碼的檢測
(6)其他報文對鄰居關係的影響
DBD報文中IP MTU值要一致,默認情況下華爲設備不對BDB報文的IP MTU值做檢測,華爲設備DBD報文的IP MTU 默認爲0,思科設備默認設置爲接口IP MTU的大小。當設備接收到DBD報文時,會檢測DBD報文中的IP MTU值是否小於自身接口的IP MTU,如果小則接收並處理,如果大則丟棄。
(7)華爲設備的DBD報文中的IP MTU值:
若cisco和華爲設備互聯可以直接建立鄰居關係。(原因是因爲cisco的IP MTU等於1500,而華爲默認不對DBD報文的IP MTU進行檢測,並且值爲0)
3.2 DBD(進行主從關係的選舉,最重要的作用是發送LSDB目錄)
(1)Src:10.1.1.1 Dst:10.1.1.2 (R1給R2發送初次發送DBD報文)
(2)Src:10.1.1.2 Dst:10.1.1.1 (R2給R1發送初次發送DBD報文)
exstart發送的DBD報文只做主從關係的選舉,而不會攜帶任何LSDB中LSA的頭部信息。並各自表達自身的初次發送DBD報文,後續還希望繼續發送DBD,並以自身爲Master,隨機生成DBD報文序列號,進行主從選舉,彼此交換該DBD報文後,根據router id 的大小完成主從關係的選舉,router id 大的爲master,router id 小的爲salve。
(3)exchange狀態,salve路由器開始發送攜帶自身LSDB中LSA頭部信息的DBD報文,並使用exstart狀態下的master路由器的序列號來進行確認。
(4)master路由器收到salve路由器發送過來的攜帶LSA的DBD報文後,通過對自己的序列號加1來對salve路由器進行確認。(如圖salve序列號爲239,master序列號爲240)
(5)當DBD報文交互完成後,最終salve路由器會再發一個沒有攜帶LSA頭部信息的DBD包來對master進行隱式確認。
(6)問題:爲什麼要設計DD報文呢?
原因:實現按需同步,提高收斂速度
(7)問題:爲什麼要採用隱式確認?
原因:因爲DBD報文攜帶自身LSDB中所以LSA的頭部信息,信息比較多,一 一進行確認處理起來比較繁瑣,消耗設備資源,影響鄰居收斂的時間,所以採用相對簡單的隱式確認機制。
exchange完成後,鄰居根據DBD報文的頭部信息和自身的LSDB的頭部信息做比較,進行LSDB的同步。
(8)同步規則:交換彼此沒有的LSA以及新的LSA替換老舊的LSA,實現鄰居LSDB的一致性。
爲了實現同步,對LSA的數據結構做出定義要能實現如下功能:
- 如何實現唯一的區分一條LSA。
- 如何實現LSA的新舊判斷。
而這些功能就是LSA的頭部信息(摘要信息),DBD報文攜帶的正是LSA的頭部信息,exstart狀態下DBD不攜帶LSA頭部信息。
(9)LSA通過6個參數來標識自身和新舊程度。
例:首先在R1上寫一條靜態,再重發布靜態,R1上就產生一條5類LSA,然後傳到R2上。
[R1]ip route-static 192.168.2.1 24 NULL 0
[R1]ospf 1
[R1-ospf-1]import-route static
當在R1上取下重發布後,R2上的這條5類LSA老化時間達到3600後刪除。
[R1-ospf-1]undo import-route static
最終5類LSA被刪除。
exchange 進入loading狀態,發送LSR,LSU,LSAck完成LSDB的同步。
3.3 LSR:對收到鄰接發來的LSDB目錄中,對於本地未知的LSA進行請求
當R1和R2收到對方發來的DD報文後,就自己本地未知的LSA進行請求,發送LSR給鄰接R2,如抓包結果所示,R1請求了兩條1類LSA。
3.4 LSU:對收到鄰接發來的LSR,攜帶LSA給鄰接
之後應答鄰接的LSR,讓LSU攜帶LSA給鄰接。
上圖所示,R2發送了兩個LSU。查看對應序列號得知發生了變化,第一次有兩條link,第二次有3條link,則進行了觸發更新。
3.5 LSAck:對DBD/LSR/LSU進行確認
ack是對LSU裏面的LSA進行確認。而不是讀LSU包進行確認。若LSU裏面攜帶兩條LSA,他就會直接發送一個LSAck,裏面直接攜帶這兩個LSA的頭部信息,一起進行確認。
補充說明:
DD報文的隱性確認是序列號直接的確認。而LSAck的確認是顯式確認。就相當於一個是收到消息回覆1來確認。而另一個確認是我對你說的話你在給我複述一遍,我就確保你知道了。所以ack的確認更加可靠。
DD報文用隱式的簡單確認的原因是DD報文裏的都是摘要信息,信息量大,逐一去進行確認,比較繁瑣,消耗資源大,並且收斂速度過慢。我們之間就進行一下簡單的確認。而ack確認用LSA的頭部進行顯式確認的原因是通過DD報文,我們大體路由信息基本都有了,只需要按需進行同步,相對的數量也會少,所以用ack進行確認。對設備性能的開銷不會很大,並且更可靠。