開放最短路徑優先 (OSPF) 協定是一種鍊路狀态路由協定,旨在替代距離矢量路由協定 RIP。OSPF 是一種無類路由協定,它使用區域概念實作可擴充性。RFC 2328 将 OSPF 度量定義為一個獨立的值,該值稱為開銷。 Cisco IOS 使用帶寬作為 OSPF 開銷度量。
OSPF背景
Internet 工程工作小組 (IETF) 的 OSPF 工作組于 1987 年着手開發 OSPF。當時,Internet 基本是由美國政府資助的學術研究網絡。以下是發展曆程:
<a href="http://blog.51cto.com/attachment/201210/210610565.jpg" target="_blank"></a>
<a href="http://img.bimg.126.net/photo/k198XgRtsXYUmc52Gu4gPQ==/4298967319303497488.jpg"></a>
OSPF消息封裝: OSPF 消息的資料部分封裝在資料包内。此資料字段可能包含五種 OSPF 資料包類型之一。
<a href="http://blog.51cto.com/attachment/201210/210655964.jpg" target="_blank"></a>
<a href="http://img.bimg.126.net/photo/Gydj7q4DdlCZj0gyGIjo4w==/4298967319303497489.jpg"></a>
無論每個 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協定: 第一種類型的 OSPF 資料包 1 是 OSPF Hello 資料包。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種類型:
<a href="http://blog.51cto.com/attachment/201210/210747486.jpg" target="_blank"></a>
<a href="http://img.bimg.126.net/photo/zq7TI1C0k-S23Tg3QlUblw==/4298967319303497490.jpg"></a>
OSPF算法
每台 OSPF 路由器都會維持一個鍊路狀态資料庫,其中包含來自其它所有路由器的 LSA。一旦路由器收到所有 LSA 并建立其本地鍊路狀态資料庫,OSPF 就會使用 Dijkstra 的最短路徑優先 (SPF) 算法建立一個 SPF 樹。随後,将根據 SPF 樹,使用通向每個網絡的最佳路徑填充 IP 路由表。
管理距離:OSPF的管理距離(AD)是“110”。
身份驗證:
與對其它路由協定一樣,OSPF 也可進行身份驗證配置。對傳輸的路由資訊進行身份驗證是好的做法。此做法可確定路由器僅接受配置有相同的密碼和身份驗證資訊的其它路由器所發來的路由資訊。
OSPF基本配置 Router 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 路由器的鍊路狀态資料庫中必須具有相同的鍊路狀态資訊,這通過路由器将各自的鍊路狀态泛洪給該區域内的其它所有路由器來實作。(“0”為骨幹區域)
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 使用:Router#clear ip ospf process 指令來重新開機OSPF程序,然後去修改你想要的Router-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 故障排除指令包括: show ip protocols
可用于快速驗證關鍵 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 此指令用于檢驗 Hello 間隔和 Dead 間隔的最快方法。Cost就是開銷值。
檢查路由表
使用show ip route 指令可用于檢驗路由器是否正在通過 OSPF 發送和接收路由。每條路由開頭的 O 表示路由來源為 OSPF。
OSPF度量
OSPF 度量稱為開銷RFC 2328 中有下列描述:“開銷與每個路由器接口的輸出端關聯。系統管理者可配置此開銷。開銷越低,該接口越可能被用于轉發資料流量。”
Cisco IOS 使用從路由器到目的網絡沿途的傳出接口的累積帶寬作為開銷值。
圖示為各種接口的預設 OSPF 開銷。
<a href="http://blog.51cto.com/attachment/201210/210944462.jpg" target="_blank"></a>
<a href="http://img.bimg.126.net/photo/nXeAr_TZhtO0YMvZbZaq_g==/4298967319303497491.jpg"></a>
參考帶寬
參考帶寬預設為 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 點對點 l 廣播多路通路 l 非廣播多路通路 (NBMA) l 點對多點 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 0.0.0.0 0.0.0.0 loopback 1
R1(config)#router ospf 1
R1(config-router)#default-information originate
路由表的輸出資訊:O*E2 0.0.0.0/0 [110/1] via 192.168.10.10, 00:05:34, Serial0/0/1
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~4294967”機關是Mbits
修改 OSPF 間隔
可使用下列接口指令手動修改 OSPF Hello 間隔和 Dead 間隔:
Router(config-if)#ip ospf hello-intervalseconds //Hello間隔多少秒發送一次
Router(config-if)#ip ospf dead-intervalseconds //多少秒沒有收到Hello就Down
本文轉自 沐小七 51CTO部落格,原文連結:http://blog.51cto.com/3088522/1032650