1OSPF簡介
(1)OSPF英文全稱Open Shortest Path First (開放式最短路徑優先)
(2)OSPF是IETF 開發的一種鏈路狀態路由協議,使用基于帶寬的度量值。
(3)OSPF采用SPF算法計算路由,從算法上保證了無路由環路。
(4)OSPF通過鄰居關系維護路由,避免了定期更新對帶寬的消耗。
(5)OSPF路由更新效率高,網絡收斂快,適用于大中型網絡。
(6)OSPF報文封裝于IP,協議號?89,組播地址224.0.0.5與224.0.0.6。
組播地址224.0.0.5:該組播地址用于所有 OSPF 路由器。所有運行 OSPF 協議的路由器都會加入到這個組播組中。
組播地址224.0.0.6:這個組播地址專門用于指定路由器(DR)和備份指定路由器(BDR)?。只有 DR 和 BDR 會加入到 224.0.0.6 這個組播組。
2OSPF的基本概念
四張表 五種報文 六類LSA 七種鄰居之間的狀態
2.1OSPF基本概念--LS
(1)鏈路狀態(LS):路由器周邊的鏈路的狀態。
(2)分為兩種狀態:
? ? ? ? 直連網段狀態:通告接口網段和接口狀態感知。
? ? ? ? 描述直連網段(網段、掩碼、接口開銷)
? ? ? ? 直連拓撲狀態:通過OSPF鄰居和鄰居狀態感知。
? ? ? ? 描述直連拓撲(鄰居RouterID、連接接口、接口開銷)
(3)接口開銷 = OSPF參考帶框/接口帶寬
? ? ? ? OSPF參考帶寬默認為100Mbps(在計算時需要注意單位)
? ? ? ? Loopback接口的開銷默認為1
(4)LS例子:
2.2OSPF基本概念--Router ID
(1)一臺路由器如果要運行OSPF協議,則必須存在Router ID(RID)。
(2)RID是一個32比特無符號整數,可以在一個自治系統中唯一的標識一臺路由器。
(3)RID可以手工配置,也可以自動生成。(一般手工配置)
(4)如果沒有通過命令指定RID,將按照如下順序自動生成一個RID:
????????如果當前設備配置了Loopback接口,將選取所有Loopback接口上數值最 大的IP地址作為RID;
????????如果當前設備沒有配置Loopback接口,將選取它所有已經配置IP地址且鏈 路UP的接口上數值最大的IP地址作為RID。
(5)Router ID選取案例
2.3OSPF基本概念--LSA
(1)鏈路狀態通告(LSA):按一定格式封裝后的鏈路狀態信息。
(2)其中兩種鏈路狀態通告:
? ? ? ? LAS1:路由器鏈路狀態通告(每臺路由器都會發起之間的LSA1)每臺 OSPF 路由器都會生成?LSA 1,描述自身直連鏈路、鄰居關系。
? ? ? ? LSA2:傳送網絡鏈路狀態通告。由網絡中的?DR(指定路由器)?生成,描述廣播型網絡(如以太網)的網段信息?。
2.4OSPF基本概念--LSDB
(1)鏈路狀態數據庫(LSDB):在 OSPF 網絡中,每臺運行 OSPF 協議的路由器都會收集其所在區域內的所有鏈路狀態通告(LSA),并將這些 LSA 存儲在本地的一個數據庫。
(2)每臺OSPF路由器都有一個LSDB,用于存儲LSA。
(3)同一區域中的OSPF路由器的LSDB一致。
? ? ? ? LSA封裝在LSU報文中,在區域內洪泛,最終達到區域內LSDB一致。
? ? ? ? LSA在洪泛過程中內容保持不變。
2.5OSPF基本概念--LSU
(1)鏈路狀態個更新(LSU):主要用于在路由器之間傳遞鏈路狀態信息,確保網絡中所有路由器的鏈路狀態數據庫(LSDB)保持同步。
(2)LSU 報文由一個報頭和多個 LSA(鏈路狀態通告)組成。報頭包含了一些基本信息,如版本號、類型、報文長度等。而其中的 LSA 則是具體的鏈路狀態信息載體,常見的 LSA 類型包括 LSA 1(路由器鏈路狀態通告)、LSA 2(網絡鏈路狀態通告)、LSA 3(匯總鏈路狀態通告)等,這些 LSA 描述了網絡拓撲、路由器連接關系、鏈路屬性等信息。
2.6OSPF基本協議模型
2.7OSPF基本概念--SPF?
(1)SPF計算
? ? ? ? 以自己LSA1為根,進行SPF計算。
? ? ? ? 各OSPF路由器單獨進行SPF計算,互不影響。
? ? ? ? 以自己為根,到目標網段的出接口開銷和。
(2)SPF計算例子1(選擇帶寬最小)
(2)STP開銷計算例子2--以自己為根,到目標網段的出接口開銷和
?2.8OSPF的四張表
生成流程:
????????Hello 建鄰居:路由器發 Hello 報文,匹配參數后建立鄰居關系,填充鄰居表。
????????LSU 同步拓撲:鄰居關系?Full
?后,用 LSU 交換 LSA,構建 LSDB。
????????SPF 算 OSPF 路由:基于 LSDB 運行 SPF 算法,生成 OSPF 路由表。
? ? ? ? 管理距離(優先級相同的情況下)選全局路由:OSPF 路由與其他協議路由比較,選最優路由存入全局路由表,指導數據包轉發。
OSPF 四張表是 “從發現鄰居→同步拓撲→計算協議內路由→選全局最優路由” 的遞進過程,Hello 負責 “認人”,LSU 負責 “傳地圖”,SPF 負責 “規劃路”,管理距離負責 “選最終走哪條路” 。
2.9OSPF基本概念--OSPF網絡類型
2.10OSPF基本概念--OSPF報文類型與封裝(五個報文)
五個報文的發送條件:
(1)Hello 報文
????????啟動及周期性發送:當路由器上啟用 OSPF 協議后,會在所有配置了 OSPF 的接口上按照默認周期(廣播網絡中為 10 秒,非廣播多路訪問(NBMA)網絡中為 30 秒) 發送 Hello 報文。其目的是發現鄰居路由器,并維護鄰居關系。通過 Hello 報文中攜帶的相關參數,如 Router ID、區域 ID、Hello 間隔、Dead 間隔等,來判斷是否可以與鄰居建立和維持鄰接關系。
????????鄰居狀態變化時:當路由器檢測到鄰居的狀態發生變化,比如從 Down 狀態變為 Init 狀態等,也會發送 Hello 報文,以確認鄰居狀態的改變,并嘗試建立或重新建立穩定的鄰居關系。
(2)Database Description(DD)報文
????????鄰接關系建立初期:在兩臺路由器建立鄰接關系過程中,進入 Exstart 狀態后,會開始發送 DD 報文。此時,雙方通過交換 DD 報文來確定主從關系,其中主路由器負責控制 DD 報文的序列號,以確保 DD 報文的有序傳輸。
????????鏈路狀態數據庫(LSDB)同步請求:在確定主從關系后,路由器會發送攜帶 LSA 頭部信息的 DD 報文,向鄰居描述自己的 LSDB 內容,目的是讓對方了解自己擁有哪些鏈路狀態信息,為后續的鏈路狀態信息請求做準備。
(3)Link State Request(LSR)報文
????????收到不完整或過期的 LSDB 信息:當路由器收到鄰居發送的 DD 報文后,會將其中的 LSA 頭部信息與自己的 LSDB 進行對比。如果發現鄰居有自己沒有的 LSA,或者鄰居的 LSA 版本比自己的新,就會向鄰居發送 LSR 報文,請求獲取這些 LSA 的完整詳細信息。
(4)Link State Update(LSU)報文
????????響應 LSR 請求:當路由器接收到鄰居發送的 LSR 報文后,會根據請求內容,將相應的 LSA 封裝在 LSU 報文中發送給鄰居,以滿足鄰居獲取完整鏈路狀態信息的需求。
????????網絡拓撲變化時:當本地路由器檢測到網絡拓撲發生變化,如鏈路故障、新增鏈路等,會生成相應的 LSA,并將這些 LSA 封裝在 LSU 報文中,向鄰居路由器泛洪(Flooding)這些鏈路狀態更新信息,以便讓整個網絡中的路由器都能及時了解網絡拓撲的變化,更新各自的 LSDB。
(5)Link State Acknowledgment(LSAck)報文
????????收到 LSU 報文后:當路由器接收到鄰居發送的 LSU 報文后,會對其中的每個 LSA 進行檢查和處理,然后向發送方發送 LSAck 報文,用以確認自己已經正確接收到了這些 LSA。發送 LSU 報文的路由器在一定時間內若沒有收到對應的 LSAck 確認,會重新發送未被確認的 LSA,以保證 LSU 報文的可靠傳輸。
OSPF 報文直接封裝在 IP 報文中,協議號為 89,利用 IP 層的服務進行傳輸 ,但由于 IP 報文本身是不可靠的傳輸協議,所以 OSPF 通過自身的 LSAck 等機制來保障報文傳輸的可靠性和網絡拓撲信息同步的準確性。
2.11OSPF報文的目的地址
3OSPF的基本工作原理
3.1OSPF網絡類型--P2P點對點的流程
3.1.1建立鄰居關系
通過發送hello報文發現鄰居
3.1.2維持鄰居關系
(1)鄰居之間通過交換Hello報文(周期性發送hello報文--每10s發一次),確認鄰居是否工作正常。?
(2)如果在一定的時間間隔內(鄰居過期時間為4個hello time為40s),收不到鄰居發來的Hello報文,就認為鄰居已經失效,從鄰居表中刪除。
在點到點網絡中,發現鄰居后 同步數據庫?
3.2OSPF網絡類型--廣播多路訪問DR/BDR
3.2.1DR/BDR產生的原因
(1)如果每臺 OSPF 路由器都與其他的所有路由器建立 OSPF 鄰接關系,便會導致網絡中存在過多的 OSPF 鄰接關系,增加設備負擔,也增加了網絡中泛洪的 OSPF 報文數量。
(2)當拓撲出現變更,網絡中的 LSA 泛洪可能會造成帶寬的浪費和設備資源的損耗。
3.2.2DR與BDR
(1)為優化廣播多路訪問網絡中 OSPF 鄰接關系,OSPF 指定了三種 OSPF 路由器身份,DR(Designated Router,指定路由器)、BDR(Backup Designated Router,備用指定路由器)和 DRother 路由器。
(2)只允許 DR、BDR 與其他 OSPF 路由器建立鄰接關系。DRother 之間不會建立全毗鄰的 OSPF 鄰接關系,雙方停滯在 2-way 狀態。BDR 會監控 DR 的狀態,并在當前 DR 發生故障時接替其角色。如下圖情況:
3.2.3DR/BDR的選舉規則
(1)首先比較Hello報文中攜帶的優先級
????????優先級最高的被選舉為DR,優先級次高的被選舉為BDR
????????優先級為0的不參與選舉
(2)優先級一致的情況下,比較Router ID
????????Router ID越大越優先
(3)保持穩定原則
????????當DR/BDR已經選舉完畢,就算一臺具有更高優先級的路由器為有效,也不會替換該網段中已經選舉的DR/BDR成為新的 DR/BDR。如下圖情況:
(4)特殊情況說明:在OSPF中,DR的身份是終生制的,在華為設備中設備啟動后,30s內如果沒有選舉的過程,路由器會認為自己是DR,將自己設置為DR,后續若有更高優先級的設備加入進來無法改變其DR的地位。
(5)在 OSPF(開放最短路徑優先)協議中,DR(指定路由器 )的角色是針對路由器的接口而言的。DR 是 OSPF 路由接口的特性,而非整臺路由器的特性,一臺路由器的不同接口在不同網段中可以擁有不同的 OSPF 路由器身份。
(6)DR與BDR的選舉范圍是在一個廣播域中選,有幾個廣播域就有幾個DR和BDR。
注:?一個交換機的所有接口?屬于同一個廣播域?;路由器的一個接口通常構成一個獨立的廣播域。
3.3鄰居關系無法建立原因總結
3.4鄰居狀態機
3.4.1鄰居狀態變化(鄰居關系)
(1)Down:這是鄰居的初始狀態,還沒收到 Hello 報文
(2)Attempt:只在 NBMA 網絡上存在,已發出 Hello 報文,但沒收到回復(不用管)
(3)Init:已經從鄰居收到了 Hello 報文,但報文鄰居列表沒有自己的 router-id
(4)2-Way:互相收到了對方的 Hello 報文,并且報文鄰居列表有自己的 router-id
3.4.2鄰居狀態變換(鄰接關系)
(1)ExStart:向鄰居發送 DD 報文,協商主從關系
(2)Exchange:相互發送包含鏈路狀態信息摘要的 DD 報文
(3)Loading:相互發送 LSR 報文請求 LSA,發送 LSU 報文通告 LSA。
(4)Full:路由器的 LSDB 已經同步
3.5發現鄰居并建立鄰居關系
hello報文除了有發現鄰居的功能以外還會攜帶自己的鄰居表給對方。
(1)一開始兩邊路由器都處于DOWN狀態。
(2)路由器A向路由器B發送hello報文,因為此時A無鄰居,hello報文中攜帶的鄰居信息為空。
(3)路由器B收到路由器A發來的Hello報文后,知道存在一個鄰居為路由器A,但是對方并不知道自己的存在(路由器B知道此事原因是因為路由器B收到的hello報文中的鄰居信息為空),所以發送給路由器A的hello報文中的鄰居狀態為初始化狀態(Init)
(4)路由器A收到B發來的Hello報文后,發現自己有一個鄰居為路由器B,且路由器B知道自己的存在。此時路由器A發送給路由器B的Hello報文中的鄰居表的鄰居狀態描述為2-way狀態。
注:在該過程中,兩個路由器的狀態并非完全同步,因為路由器在hello報文中描述的是自己和鄰居當前的關系。初始化狀態并非是必須的。
發現鄰居之后,同步數據庫之前會做一個工作:判斷自己的接口類型,如果自己的接口類型為以太網接口類型則需要選舉BR/BDR。其中人為修改的網絡類型優于網絡默認的網絡類型。
其中DRother和DRother之間不需要同步數據庫,狀態停留在2-way狀態。其他類型的路由器都需要同步數據庫。
3.6同步數據庫和建立完全鄰接關系
3.6.1發送DD報文
(1)1?號和 2 號 DD 報文為空 DD 報文(里面不帶數據庫的匯總信息),用于協商主從,其中帶有三個置位分別為:I(標識當前是初始化狀態,無主從)、M(代表后面還有很多報文)、MS(代表當前設備參與主從的選舉),RTA 和 RTB 在交換初始 DD 報文后,會對彼此的 Router ID 進行比較 。router-id 大的一端勝出;
注:為什么要協商主從?為了確定用誰的序列號作為DD報文的初始序列號,提高交互過程中的可靠性。(OSPF的五個報文中,除了hello報文以外,其他四個報文都有序號)
(2)3 號和 4 號 DD 報文包含 LSDB 摘要信息。
注:如果在該過程中因為某種原因路由器B沒有收到路由器A的3號DD報文會超時重傳。
(3)5 號 DD 報文依然是空 DD 報文,用于對主路由器 DD 報文的確認。
注:當對方都收到了對方發來的DD報文后,雙方都會拿著DD報文與自己的鏈路狀態數據庫進行比對,
如果對方DD報文中的信息自己鏈路狀態數據庫中都有,狀態會從Exchange狀態轉變為Full狀態。
如果對方DD報文中的信息存在自己鏈路狀態數據庫中缺失或更新的,狀態會從Exchange狀態轉變為Loading狀態。
(4)路由器使用 DD 報文來進行主從路由器的選舉和數據庫摘要信息的交互。
(5)DD 報文包含 LSA 的頭部信息,用來描述 LSDB 的摘要信息。
(6)DD 報文中的 interface MTU 兩端需要一致
3.6.2向對方請求所需要的LSA
(1)LSR 用于向對方請求所需的 LSA。
(2)LSU 用于向對方發送其所需要的 LSA。
(3)LSACK 用于向對方發送收到 LSA 的確認。
3.7當鄰居關系路由器都達到了FULL狀態,這時有新的LSA生成或收到時?泛洪新LSA
鄰居關系無需重新建立,只需要更新和收到對方更新確認來同步,狀態不需要改變。
3.8廣播網絡中LSDB更新
在廣播和NBMA網絡中,鏈路狀態發生變化時,主要是通過DR路由器發送更新報文。如下圖:
4LSA報文
4.1LSA報文頭部
(1)LS age(16位):代表LSA的“存活時間”,單位是秒
(2)Options(8位):用于標記OSPF的可選功能能力,像是是否支持NSSA(非純末梢區域)、IPv6等特性。
(3)LS type(8位):用來明確LSA的具體類型,不同數值對應不同功能的LSA。
(4)Link StateID(32位):可理解為LSA的“標識ID”,不過其具體含義會隨著LSA類型變化。
(5)Advertising Router(32位):填寫生成并發布這個LSA的路由器的RouterID,作用就是明確“是誰發布了該LSA”,方便其他路由器在處理LSA時,知道信息的源頭,也有助于進行路由信息的溯源和驗證。
(6)LS sequencenumber(32位):是一個序列號,每次新生成LSA或者更新已有LSA時,序列號會單調遞增。路由器依靠它判斷LSA的新舊,序列號越大,代表LSA越新。這樣能避免舊的、過時的LSA覆蓋新的LSA信息,保證網絡中傳播的是最新的拓撲等數據。
(7)LS checksum(16位):是對LSA頭部以及數據部分做的校驗和計算結果。當LSA在網絡中傳輸時,接收方會重新計算校驗和并與該字段對比,以此檢測LSA在傳輸過程中是否出現錯誤、被篡改,保障LSA信息的完整性。
(8)Length(16位):記錄LSA的總長度,單位是字節,包含LSA頭部和后續的數據部分。接收方路由器利用這個字段,能準確知曉該LSA報文的邊界,從而正確解析、提取LSA里的信息,避免解析錯誤。
4.2包含在各種報文中的LSA信息
(1)DD報文:LSA 類型、LSA 標識、通告路由器和 LSA 序列號
(2)LS請求報文:只有 LSA 類型、LSA 標識和通告路由器的簡化 LSA 頭部
(3) LS更新報文:完整的 LSA 信息,包括 LSA 頭部和具體的鏈路狀態信息。
(4)LS確認報文:LSA頭部信息:LSA 類型、LSA 標識、通告路由器和 LSA 序列號 。只確認收到的報文。讓發送方知道對方收到了多少個報文。
5OSPF LSA洪泛與老化
5.1OSPF LSA老化
超過最大老化時間的LSA就會將其刪除。
5.2OSPF LSA老化與全網刷新
半小時更新一次。
如果在某個路由器中 收到了兩份一模一樣的LSA但序號分別為9和10。路由器會存儲序號為10的,因為序號越大內容越新。