開放最短路徑優先 (OSPF) 協議是一種鏈路狀態路由協議,旨在替代距離矢量路由協議 RIP。OSPF 是一種無類路由協議,它使用區域概念實現可擴展性。RFC 2328 將 OSPF 度量定義爲一個獨立的值,該值稱爲開銷。 Cisco IOS 使用帶寬做爲 OSPF 開銷度量。
OSPF背景
Internet 工程工做小組 (IETF) 的 OSPF 工做組於 1987 年着手開發 OSPF。當時,Internet 基本是由美國政府資助的學術研究網絡。如下是發展歷程:
OSPF消息封裝:
不管每一個 OSPF 數據包的類型如何,都具備 OSPF 數據包報頭。隨後,OSPF 數據包報頭和數據包類型特定的數據被封裝到 IP 數據包中。在該 IP 數據包報頭中,協議字段被設爲 89 以表明 OSPF,目的地址則被設爲如下兩個組播地址之一:224.0.0.5 或 224.0.0.6。若是 OSPF 數據包被封裝在以太網幀內,則目的 MAC 地址也是一個組播地址:01-00-5E-00-00-05 或 01-00-5E-00-00-06。
OSPF數據包類型:
咱們介紹了鏈路狀態數據包 (LSP)。OSPF的 LSP 有五種類型。每種數據包在 OSPF 路由過程當中發揮各自的做用:
1. Hello — Hello 數據包用於與其它 OSPF 路由器創建和維持相鄰關係。Hello 協議將在下一主題中詳細討論。
2. DBD — DBD(數據庫說明) 數據包包含發送方路由器的鏈路狀態數據庫的簡略列表,接收方路由器使用本數據包與其本地鏈路狀態數據庫對比。
3. LSR — 隨後,接收方路由器能夠經過發送鏈路狀態請求 (LSR) 數據包來請求 DBD 中任何條目的有關詳細信息。
4. LSU — 鏈路狀態更新 (LSU) 數據包用於回覆 LSR 和通告新信息。LSU 包含七種類型的鏈路狀態通告 (LSA)。LSU 和 LSA 將在下一主題中簡略討論。
5. LSAck - 路由器收到 LSU 後,會發送一個鏈路狀態確認 (LSAck) 數據包來確認接收到了 LSU。
Hello協議:
l 發現 OSPF 鄰居並創建相鄰關係。
l 通告兩臺路由器創建相鄰關係所必需統一的參數。
l 在以太網和幀中繼網絡等多路訪問網絡中選舉指定路由器 (DR) 和備用指定路由器 (BDR)。
重要字段包括:
l 類型:OSPF 數據包類型:Hello (1)、DD (2)、LS 請求 (3)、LS 更新 (4) 或 LS 確認 (5)
l 路由器 ID:始發路由器的 ID
l 區域 ID:數據包的始發區域
l 網絡掩碼:與發送方接口關聯的子網掩碼
l Hello 間隔:發送方路由器連續兩次發送 hello 數據包之間的秒數
l 路由器優先級:用於 DR/BDR 選舉
l 指定路由器 (DR):DR 的路由器 ID(若是有的話)
l 備用指定路由器 (BDR):BDR 的路由器 ID(若是有的話)
l 鄰居列表:列出相鄰路由器的 OSPF 路由器 ID
創建相鄰關係
在 OSPF 路由器可將其鏈路狀態泛洪給其它路由器以前,OSPF首先要創建鄰居。OSPF Hello 中的信息包括髮送方路由器的 OSPF 路由器 ID。若是經過一個接口收到 OSPF Hello 數據包,便可確認該鏈路上存在另外一臺 OSPF 路由器。隨後,OSPF 即與該鄰居創建相鄰關係。
OSPF Hello 間隔和 Dead 間隔
兩臺路由器在創建 OSPF 相鄰關係以前,必須統一三個值:Hello 間隔、Dead 間隔和網絡類型。OSPF Hello 間隔表示 OSPF 路由器發送其 Hello 數據包的頻度(默認狀況下,在多路訪問網段和點對點網段中每 10 秒鐘發送一次 OSPF Hello 數據包,而在非廣播多路訪問 (NBMA) 網段(幀中繼、X.25 或 ATM)中則每 30 秒鐘發送一次 OSPF Hello 數據包。)Hello數據包使用組播發送給ALLSPFRouters 的專用地址 224.0.0.5 。
Dead 間隔是路由器在宣告鄰居進入 down(不可用)狀態以前等待該設備發送 Hello 數據包的時長,單位爲秒。Cisco 所用的默認斷路間隔爲 Hello 間隔的四倍。若是 Dead 間隔已到期,而路由器仍未收到鄰居發來的 Hello 數據包,則會從其鏈路狀態數據庫中刪除該鄰居。
選舉 DR 和 BDR
爲減少多路訪問網絡中的 OSPF 流量,OSPF 會選舉一個指定路由器 (DR) 和一個備用指定路由器 (BDR)。當多路訪問網絡中發生變化時,DR 負責使用該變化信息更新其它全部 OSPF 路由器(稱爲 DROther)。BDR 會監控 DR 的狀態,並在當前 DR 發生故障時接替其角色。
(點對點鏈路相互鏈接,不會執行 DR/BDR 選舉。)
OSPF鏈路狀態更新
鏈路狀態更新 (LSU) 數據包用於 OSPF 路由更新。一個 LSU 數據包可能包含11類型的鏈路狀態通告 (LSA),術語「鏈路狀態更新 (LSU)」和「鏈路狀態通告 (LSA)」之間的差別有時較難分清。有時,它們能夠互換使用。一個 LSU 包含一個或多個 LSA,這兩個術語中的任何一個均可用於表示由 OSPF 路由器傳播的鏈路狀態信息。
如下是LAS的11種類型:
OSPF算法
每臺 OSPF 路由器都會維持一個鏈路狀態數據庫,其中包含來自其它全部路由器的 LSA。一旦路由器收到全部 LSA 並創建其本地鏈路狀態數據庫,OSPF 就會使用 Dijkstra 的最短路徑優先 (SPF) 算法建立一個 SPF 樹。隨後,將根據 SPF 樹,使用通向每一個網絡的最佳路徑填充 IP 路由表。
管理距離:OSPF的管理距離(AD)是「110」。
身份驗證:
與對其它路由協議同樣,OSPF 也可進行身份驗證配置。對傳輸的路由信息進行身份驗證是好的作法。此作法可確保路由器僅接受配置有相同的口令和身份驗證信息的其它路由器所發來的路由信息。
OSPF基本配置
process-id 是一個介於 1 和 65535 之間的數字,由網絡管理員選定。process-id僅在本地有效,這意味着路由器之間創建相鄰關係時無需匹配該值。
配置方法:
R1#conf t
R1(config)#router ospf 1
R1(config-router)#
Network 命令
OSPF 中的 network 命令與其它 IGP 路由協議中的 network 命令具備相同的功能:
l 路由器上任何符合 network 命令中的網絡地址的接口都將啓用,可發送和接收 OSPF 數據包。
l 此網絡(或子網)將被包括在 OSPF 路由更新中。
Router(config-router)#network network-address wildcard-mask areaarea-id
area area-id 指 OSPF 區域。OSPF 區域是共享鏈路狀態信息的一組路由器。相同區域內的全部 OSPF 路由器的鏈路狀態數據庫中必須具備相同的鏈路狀態信息,這經過路由器將各自的鏈路狀態泛洪給該區域內的其它全部路由器來實現。(「
OSPF路由器ID
肯定路由器 ID
OSPF 路由器 ID 用於惟一標識 OSPF 路由域內的每臺路由器。Cisco 路由器按下列順序根據下列三個條件肯定路由器 ID:
l 使用經過 OSPF router-id 命令配置的 IP 地址。
l 若是未配置 router-id,則路由器會選擇其全部環回接口的最高 IP 地址。
l 若是未配置環回接口,則路由器會選擇其全部物理接口的最高活動 IP 地址。
OSPF router-id 命令
Router(config)#router ospf process-id //進入OSPF配置模式
Router(config-router)#router-id ip-address //配置Router-id
修改路由器 ID
重複的路由器 ID
當同一個 OSPF 路由域內的兩臺路由器具備相同的路由器 ID 時,將沒法正常路由。若是兩臺相鄰路由器的路由器 ID 相同,則沒法創建相鄰關係。當出現重複的 OSPF 路由器 ID 時,IOS 將顯示一條相似下列的消息:
%OSPF-4-DUP_RTRID1:Detected router with duplicate router ID
驗證Router-id:使用show ip protocols來驗證。
驗證OSPF
show ip ospf neighbor 命令可用於驗證 OSPF 相鄰關係並排除相應的故障。此命令爲每一個鄰居顯示下列輸出:
l Neighbor ID — 該相鄰路由器的路由器 ID。
l Pri — 該接口的 OSPF 優先級。
l State — 該接口的 OSPF 狀態。FULL 狀態代表該路由器和其鄰居具備相同的 OSPF 鏈路狀態數據庫。
l Dead Time — 路由器在宣告鄰居進入 down(不可用)狀態以前等待該設備發送 Hello 數據包所剩餘的時間。此值在該接口收到 Hello 數據包時重置。
l Address — 該鄰居用於與本路由器直連的接口的 IP 地址。
l Interface — 本路由器用於與該鄰居創建相鄰關係的接口。
在下列狀況下,兩臺路由器不會創建 OSPF 相鄰關係:
l 子網掩碼不匹配,致使該兩臺路由器分處於不一樣的網絡中。
l OSPF Hello 計時器或 Dead 計時器不匹配。
l OSPF 網絡類型不匹配。
l 存在信息缺失或不正確的 OSPF network 命令。
其它功能強大的 OSPF 故障排除命令包括:
可用於快速驗證關鍵 OSPF 配置信息,其中包括 OSPF 進程 ID、路由器 ID、路由器正在通告的網絡、正在向該路由器發送更新的鄰居以及默認管理距離
show ip ospf
命令也可用於檢查 OSPF 進程 ID 和路由器 ID,此外,還可顯示 OSPF 區域信息以及上次計算 SPF 算法的時間。
路由器每次收到有關拓撲的新信息時,必須從新運行 SPF 算法,SPF 算法會佔用不少 CPU 資源。如下信息是使用show ip ospf的輸出。
Initial SPF schedule delay 5000 msecs
Minimum hold time between two consecutive SPFs 10000 msecs
Maximum wait time between two consecutive SPFs 10000 msecs
狀態在 up 和 down 之間來回變化的網絡稱爲鏈路不穩。鏈路不穩會致使區域內的 OSPF 路由器持續從新計算 SPF 算法,從而沒法正確收斂。爲儘可能減輕此問題,路由器在收到一個 LSU 後,會等待 5 秒(5000 毫秒)才運行 SPF 算法。這樣能夠防止路由器持續運行 SPF 算法,還存在一個 10 秒(10000 毫秒)的保留時間。路由器運行完一次 SPF 算法後,會等待 10 秒纔再次運行該算法。
show ip ospf interface
檢查路由表
使用show ip route 命令可用於檢驗路由器是否正在經過 OSPF 發送和接收路由。每條路由開頭的 O 表示路由來源爲 OSPF。
OSPF度量
OSPF 度量稱爲開銷RFC 2328 中有下列描述:「開銷與每一個路由器接口的輸出端關聯。系統管理員可配置此開銷。開銷越低,該接口越可能被用於轉發數據流量。」
Cisco IOS 使用從路由器到目的網絡沿途的傳出接口的累積帶寬做爲開銷值。
圖示爲各類接口的默認 OSPF 開銷。
參考帶寬
參考帶寬默認爲 10 的 8 次冪,即 100,000,000 bps,亦即 100 Mbps。這使帶寬等於或大於 100 Mbps 的接口具備相同的 OSPF 開銷 1。
可以使用 OSPF 命令 auto-cost reference-bandwidth 修改參考帶寬值。若是須要使用此命令,則建議同時用在全部路由器上,以使 OSPF 路由度量保持一致。
OSPF 累計開銷
OSPF 路由的開銷爲從路由器到目的網絡的累計開銷值。(就是說源地址到目的地址中間通過的全部路徑的開銷值進行相加)
修改鏈路的開銷
bandwidth 接口命令或 ip ospf cost 接口命令均可用於達到此目的 — 使 OSPF 在肯定最佳路由時使用準確的值。(要該就要兩端都要改)
Router(config-if)#bandwidth bandwidth-kbps //修改接口的帶寬參數。
Router(config-if)# ip ospf cost 「加數字」 //命令則直接將鏈路開銷設置爲特定值並免除了計算過程。
多路訪問網絡中的挑戰
在多路訪問網絡中,相同的共享介質上鍊接有兩臺以上設備。以太網 LAN 就是一種廣播多路訪問網絡。由於該網絡中的全部設備會看到全部廣播幀,因此它屬於廣播網絡。
OSPF 定義了五種網絡類型:
l 點對點
多路訪問網絡對 OSPF 的 LSA 泛洪過程提出了兩項挑戰:
1. 建立多邊相鄰關係,其中每對路由器都存在一項相鄰關係。
2. LSA(鏈路狀態通告)的大量泛洪。
多邊相鄰關係
在網絡中的每對路由器間建立相鄰關係會產生一些沒必要要的相鄰關係。這將致使大量 LSA 在該網絡內的路由器間傳輸。對於多路訪問網絡中任意數量(用 n 表示)的路由器,將存在 n ( n - 1 ) / 2 項相鄰關係。但隨着網絡中路由器數量增長,相鄰關係數量將急劇增大。
LSA 泛洪
鏈路狀態路由器會在 OSPF 初始化以及拓撲更改時泛洪其鏈路狀態數據包。在多路訪問網絡中,此泛洪過程當中的流量可能變得很大。
解決方案:指定路由器(DR)
用於在多路訪問網絡中管理相鄰關係數量和 LSA 泛洪的解決方案是指定路由器 (DR)。(可比喻爲在房間裏選舉出一我的,由該人員向全部人逐個詢問姓名,而後將這些姓名一次性通告給全部人。)多路訪問網絡中的路由器會選舉出一個 DR 和一個 BDR。DROther 僅與網絡中的 DR 和 BDR 創建徹底的相鄰關係。這意味着 DROther 無需向網絡中的全部路由器泛洪 LSA,只需使用組播地址 224.0.0.6(ALLDRouters — 全部 DR 路由器)將其 LSA 發送給 DR 和 BDR 便可。
DR/BDR選舉過程(DR/BDR 選舉不會發生在點對點網絡中)
DR/BDR 選舉
選舉過程遵循如下條件:
1. DR:具備最高 OSPF 接口優先級的路由器
2. BDR:具備第二高 OSPF 接口優先級的路由器
3. 若是 OSPF 接口優先級相等,則取路由器 ID 最高者。
DROther 僅與 DR 和 BDR 創建徹底的相鄰關係,但也會與該網絡中的任何其它 DROthers 創建相鄰關係。這意味着多路訪問網絡中的全部 DROther 路由器仍然會收到其它全部 DROther 路由器發來的 Hello 數據包。當兩臺 DROther 路由器造成相鄰關係後,其相鄰狀態顯示爲 2WAY。
使用show ip ospf neighbor能夠快速查看DR、BDR和DROther以及2WAY。
使用show ip ospf interface 能夠查看詳細的DR、BDR信息
DR/BDR 選舉的時間安排
DR 一旦選出,將保持 DR 地位,直到出現下列條件之一爲止:
l DR 發生故障。
l DR 上的 OSPF 進程發生故障。
l DR 上的多路訪問接口發生故障。
若是 DR 發生故障,BDR 將接替 DR 角色,隨即進行選舉,選出新的 BDR。
新路由器加入該網絡。若是在選出 DR 和 BDR 後有新路由器加入網絡,即便新路由器的 OSPF 接口優先級或路由器 ID 比當前 DR 或 BDR 高,也不會成爲 DR 或 BDR。
前任 DR 返回網絡後不會從新取得 DR 的地位。
若是 BDR 發生故障,則會在 DRother 之間選出新的 BDR。
您怎樣確保所需的路由器在 DR 和 BDR 選舉中獲勝呢?無需進一步配置,解決方案有兩種:
l 首先啓動 DR,再啓動 BDR,而後啓動其它全部路由器;
l 關閉全部路由器上的接口,而後在 DR 上執行 no shutdown 命令,再在 BDR 上執行該命令,隨後在其它全部路由器上執行該命令。
OSPF接口優先級
因爲 DR 成爲 LSA 的集散中心,因此它必須具備足夠的 CPU 和存儲性能才能擔此重責。與其依賴路由器 ID 來肯定 DR 和 BDR 結果,不如使用 ip ospf priority 接口命令來控制選舉。
Router(config-if)#ip ospf priority {0 - 255}
OSPF默認路由重分發
R1#conf t
R1(config)#ip route
R1(config)#router ospf 1
R1(config-router)#default-information originate
路由表的輸出信息:O*E2
O表示從OSPF學到的路由
E2 表示此路由爲一條 OSPF第 2 類外部路由。
OSPF 外部路由分爲如下兩類:第 1 類外部 (E1) 和第 2 類外部 (E2)。兩種類型的差別在於路由的 OSPF 開銷在每臺路由器上的計算方式不一樣。
l E1 路由在整個 OSPF 區域內傳播時,OSPF 會累計路由的開銷。
l E2 路由的開銷卻始終是外部開銷,而與通向該路由的內部開銷無關。
微調OSPF
參考帶寬
可以使用 OSPF 命令 auto-cost reference-bandwidth修改參考帶寬,以適應這些更快鏈路的要求。
R1(config-router)#auto-cost reference-bandwidth 「1~
修改 OSPF 間隔
可以使用下列接口命令手動修改 OSPF Hello 間隔和 Dead 間隔:
Router(config-if)#ip ospf hello-intervalseconds //Hello間隔多少秒發送一次
Router(config-if)#ip ospf dead-intervalseconds //多少秒沒有收到Hello就Down