0×1.鏈路狀態路由協議概述
鏈路狀態路由協議使用Dijkstra算法,也稱SPF(Shortest Path First,最短路徑優先)算法。常見的鏈路狀態路由協議有:OSPFv2、OSPFv3等。這篇文章主要針對OSPFv2,OSPFv3是面向IPv6的且不兼容IPv4,暫不介紹。
a.工作過程
1)每臺路由器學習激活的直接相連的網絡。2)每臺路由器和直接相連的路由器互交,發送Hello報文,建立鄰居關系。3)每臺路由器構建包含直接相連的鏈路狀態的LSA(Link-State Advertisement,鏈路狀態通告)。鏈路狀態通告(LSA)中記錄了所有相關的路由器,包括鄰路由器的標識、鏈路類型、帶寬等。4)每臺路由器泛洪鏈路狀態通告(LSA)給所有的鄰路由器,并且自己也在本地儲存鄰路由發過來的LSA,然后再將收到的LSA泛洪給自己的所有鄰居,直到在同一區域中的所有路由器收到了所有的LSA。每臺路由器在本地數據庫中保存所有收到的LSA副本,這個數據庫被稱作"鏈路狀態數據庫(LSDB,Link-State Database)"5)每臺路由器基于本地的"鏈路狀態數據庫(LSDB)"執行"最短路徑優先(SPF)"算法,并以本路由器為根,生成一個SPF樹,基于這個SPF樹計算去往每個網絡的最短路徑,也就得到了最終的路由表。
下圖(圖1)演示了鏈路狀態路由協議路由表的生成過程:

b.優缺點
優點:運行鏈路狀態路由協議的路由器通過LSA的交換,最后獨立的計算出到每個網絡的最短路徑,相對距離矢量路由具有更強的全局觀;收到鄰居的LSA后立即泛洪,并且本路由再執行SPF算法,比距離矢量路由有更高的收斂速度(EIGRP除外,EIGRP是高級距離矢量路由協議有更快的收斂速度);當檢測到拓撲發生變化時立即發送更新;多區域設計,可以將一些問題限制在較小的區域中。
缺點:內存需求高,需要更強的CPU的支持,在網絡初始化時,大量鏈路狀態包泛洪,會影響網絡的可用帶寬。
0×2.OSPF概述和基本配置
OSPF(Open Shortest Path First,開放最短路徑優先)是一個被各廠商設備廣泛支持的鏈路狀態路由協議。
a.特性
OSPF執行IETF標準,IETF標準被不同廠商的設備所支持;執行SPF算法,不會產生環路;支持VLSM和CIDR;可以用于大型網絡;層次型設計,易擴展;區域化設計,減小路由更新給設備帶來的負擔;快速收斂,使用觸發式更新;支持針對區域和鏈路的驗證。執行OSPF的路由默認每隔30分鐘會泛洪一次鏈路狀態通告(LSA),稱為鏈路狀態刷新(并非周期性更新);當一條LSA被接收并被儲存到鏈路狀態數據庫中后,路由器會給這條記錄增加一個老化時間標識,默認是一小時,所以為了防止一些正常的LSA被清除,始發這條LSA的路由會每隔30分鐘泛洪一次這條LSA的一個新拷貝。
b.術語
鏈路(Link):當一個接口加入OSPF進程,就被當做是OSPF的一條鏈路。
鏈路狀態(Link-State):包括接口的IP、子網、網絡類型、鏈路花費、鏈路上的鄰居等。
路由器ID(Router ID,簡稱RID):RID是一個用來標識路由器的IP地址,可以在OSPF路由進程中手工指定;如果沒有指定,路由器默認選擇回環接口中最高的IP作為RID;如果沒有回環地址,路由器使用所有激活的物理接口中最高的IP作為RID。
鄰居(Neighbor):兩臺或多臺路由連接在一個公共的網絡上;比如兩臺路由通過串行線路相連,或多臺路由通過以太網相連。
鄰接(Adjacency):鄰接是兩臺路由器之間的關系,OSPF只與建立了鄰接關系的鄰居共享路由信息。
區域(Area):OSPF通過劃分區域來實現分層設計,跨越兩個或兩個以上區域的路由被稱作ABR(Area Border Router,區域邊界路由)。所有的區域都和"Area 0"相連,"Area 0"被稱作骨干區域,骨干區域路由器具有整個自制系統中所有路由條目,LSA的擴散僅限制在區域內,通過劃分多個區域可以減小LSA擴散過程中對硬件的負擔。
指定路由器(Designated Router,簡稱RD):當OSPF鏈路被連接到多路訪問的網絡中時,需要選擇一臺指定路由器(DR),每臺路由器都把拓撲變化發給DR和BDR,然后由DR通知該多路訪問網絡中的其他路由器。
備用的指定路由器(Backup Designated Router,簡稱BDR):當DR發生故障的時候,BDR轉變成DR,接替DR工作。
花費(Cost):OSPF中使用的唯一度量值,使用鏈路的帶寬計算得來。
c.包格式
OSPF和EIGRP一樣,也被設計成一個網絡層協議,協議號89,包格式如下圖(圖2):

數據鏈路層頭部:OSPF使用的組播IP地址是224.0.0.5(非DR和BDR路由使用的地址)和224.0.0.6(DR和BDR使用的組播地址),這兩個組播地址對應的MAC地址分別為:"01-00-5E-00-00-05"和"01-00-5E-00-00-06"。包頭部:協議號是89,源IP是發送路由的IP,目的IP是組播IP地址224.0.0.5或224.0.0.6。OSPF頭部:包括路由ID和所在的區域號、包的類型代碼(5種類型的包代碼)。OSPF包對應的數據:不同包具有不同的內容。
d.包類型
1)Hello包
Hello報文用來建立和維護OSPF路由器間的鄰接關系,它的主要作用是:發現OSPF鄰居,建立和維護鄰接關系;在多路訪問中選擇DR和BDR。OSPF泛洪鏈路狀態通告給其他路由前需要先建立鄰接關系,通過在OSPF協議的接口上發送Hello報文判斷是否有其他OSPF路由器運行在相同的鏈路上。
雙方要建立鄰接關系,Hello報文中的區域號、Hello間隔和dead間隔、驗證(如果有)以及區域類型都要一致。在廣播(如以太網)和點對點鏈路(如串行線路)中,Hello間隔默認是10秒;dead時間默認是Hello間隔的4倍(40秒);非廣播多路訪問(NBMA),比如幀中繼網絡中默認Hello間隔是30秒。
可以通過下面的命令修改默認的Hello時間和dead時間:
1
/修改串行線路s0/0的Hello間隔為5秒,死亡間隔為20秒。/
2
Router(config)#
int
s 0/0
3
Router(config-if)#
ip
ospf
hello-interval
5
4
Router(config-if)#
ip
ospf
dead-interval
20
5
Router(config-if)#
end
2)DBD(Database Description,數據庫狀態描述包)
DBD包是發送端對自己鏈路狀態數據庫的一個簡短描述,接收路由器根據接收到的DBD包對比自己的鏈路狀態數據庫,檢測發送端和接收端的鏈路狀態數據庫是否同步。
3)LSR(Link-State Request,鏈路狀態請求包)
接收端可以發送LSA來請求接收到的DBD中的某些詳細信息。
4)LSU(Link-State Update,鏈路狀態更新包)
LSU用來更新OSPF路由信息,回復LSR請求。
5)LSAck(Link-State Acknowledgement,鏈路狀態確認)
當收到一個LSU,路由器發送LSAck確認。
e.鄰居關系的建立過程
OSPF中鄰居建立過程演示圖(圖3)如下:

Down:OSPF初始狀態,還沒有開始交換信息。Init:交換信息初期,表示已經收到了鄰居的Hello報文,但是報文中沒有列出本路由的RID,也就是說對方還沒有收到本路由發出的Hello報文。Two-Way:雙向階段,雙方都收到了對方發送的Hello報文,建立了鄰居關系。在多路訪問的網絡中,兩個接口狀態是DROther的路由器之間將停留在此狀態,其他情況將繼續轉入高級狀態。在此狀態下的路由器是不能共享路由信息的,想共享路由信息,必須建立鄰接關系。(注意鄰居關系和鄰接關系的區別)Exstart:準備開始交換階段,雙方通過Hello報文決定主從關系,最高RID的路由將成為主路由,最先發起交換。主從關系確立后進入下一個階段。Exchange:開始交換階段,路由器將本地的"路由狀態數據庫(LSDB)"用"數據庫描述(DBD)"報文來描述,然后發給鄰路由。如果這個階段中的路由收到不在其數據庫中的有關鏈路的信息,那么在下一個階段中將請求對方發送該路由條目的完整信息。Loading:加載階段,路由器通過發送"鏈路狀態請求(LSR)",來向鄰居請求一些路由條目的詳細信息。鄰居則會使用"鏈路狀態更新包(LSU)"來回復LSR請求,收到鄰居發回的LSU后,再發送LSAck向發送LSU的路由進行確認。FULL:完全鄰接狀態,Loading結束后,路由器之間就變成了"Full adjacency"。
f.基本配置實例
使用OSPF配置下面的拓撲,三臺c3640路由使用以太網接口連接在一臺二層非網管交換機上(GNS3中自帶的那個"Ethernet switch",非IOU中的二層可網管交換機),設備間連線和IP如下圖(圖4)所示:

01
R1(config)#
int
s 0/0
02
R1(config-if)#
ip
add
12.1.1.1 255.255.255.0
03
R1(config-if)#
no
shut
04
R1(config-if)#
int
lo
0
05
R1(config-if)#
ip
add
1.1.1.1 255.255.255.0
06
R1(config-if)#
no
shut
07
R1(config-if)#
int
fa 1/0
08
R1(config-if)#
ip
add
123.1.1.1 255.255.255.0
09
R1(config-if)#
no
shut
10
/啟用OSPF進程,進程號1只具有本地意義/
11
R1(config-if)#router
ospf
1
12
R1(config-router)#
net
123.1.1.0 0.0.0.255
area
0
13
R1(config-router)#
net
1.1.1.0 0.0.0.255
area
0
14
R1(config-router)#
net
12.1.1.0 0.0.0.255
area
0
15
R1(config-router)#
end
16
17
/*
18
"router ospf 1"
中的OSPF進程號1,只具有本地意義,每個路由可以不同,
19
"net 123.1.1.0 0.0.0.255 area 0"
OSPF網絡的宣告使用反掩碼形式,
20
"area 0"
是OSPF區域號,同一個區域中的路由器區域號要保持一致,
21
- CCNA中只涉及區域0,也就是骨干區域的配置。
22
- 如果要將路由器上所有接口都宣告進OSPF進程,可以使用下面的命令:
23
"net 0.0.0.0 255.255.255.255 area 0"
24
*/
R2配置:
01
R2(config)#
int
s 0/1
02
R2(config-if)#
ip
add
12.1.1.2 255.255.255.0
03
R2(config-if)#
no
shut
04
R2(config-if)#
int
lo
0
05
R2(config-if)#
ip
add
2.2.2.2 255.255.255.0
06
R2(config-if)#
no
shut
07
R2(config-if)#
int
fa 1/0
08
R2(config-if)#
ip
add
123.1.1.2 255.255.255.0
09
R2(config-if)#
no
shut
10
R2(config-if)#router
ospf
2
11
R2(config-router)#
net
0.0.0.0 255.255.255.255
area
0
12
R2(config-router)#
end
13
14
/*
"net 0.0.0.0 255.255.255.255 area 0"
將R2上的所有接口都發布進OSPF進程*/
R3配置:
01
R3(config)#
int
fa 1/0
02
R3(config-if)#
ip
add
123.1.1.3 255.255.255.0
03
R3(config-if)#
no
shut
04
R3(config-if)#
int
lo
0
05
R3(config-if)#
ip
add
3.3.3.3 255.255.255.0
06
R3(config-if)#
no
shut
07
R3(config-if)#
int
lo
1
08
R3(config-if)#
ip
add
33.3.3.3 255.255.255.0
09
R3(config-if)#
no
shut
10
R3(config-if)#router
ospf
3
11
R3(config-router)#
net
123.1.1.0 0.0.0.255
area
0
12
R3(config-router)#
net
3.3.3.0 0.0.0.255
area
0
13
R3(config-router)#
end
14
15
/R3并沒有將Lo1接口宣告進OSPF進程/
16
17
/*
18
- 對于OSPF的宣告還有幾種可以使用的不規范格式:
19
20
"net 123.1.1.1 0.0.0.0 area 0"
21
- 指定僅有一個IP(123.1.1.1)宣告進OSPF進程。
22
23
"net 123.1.1.0 255.255.255.0 area 0"
,
24
- 這條命令和
"net 123.1.1.0 0.0.0.255 area 0"
效果相同。
25
26
"net 0.0.0.0 0.0.0.0 area 0"
,
27
- 這條命令和
"net 0.0.0.0 255.255.255.255 area 0"
效果相同。
28
29
- 上面幾種格式都能被正確識別,但是最好使用規范格式。
30
*/
OSPF路由表:
01
/*
02
- R1路由表,顯示如下:
03
- R1學習到了R2和R3上面的回環接口的IP地址,
04
- 因為R3的Lo1并沒有宣告進OSPF進程,所以沒有33.3.3.3這個地址。
05
"O"
表示是從OSPF學習到的路由條目。
06
*/
07
R1#
show
ip
route
08
09
1.0.0.0/24 is subnetted, 1 subnets
10
C 1.1.1.0 is directly connected, Loopback0
11
2.0.0.0/32 is subnetted, 1 subnets
12
O 2.2.2.2 [110/2] via 123.1.1.2, 00:15:04, FastEthernet1/0
13
3.0.0.0/32 is subnetted, 1 subnets
14
O 3.3.3.3 [110/2] via 123.1.1.3, 00:15:04, FastEthernet1/0
15
123.0.0.0/24 is subnetted, 1 subnets
16
C 123.1.1.0 is directly connected, FastEthernet1/0
17
12.0.0.0/24 is subnetted, 1 subnets
18
C 12.1.1.0 is directly connected, Serial0/0
在OSPF中所有的回環接口都被自動宣告成32位的主機路由"/32",如果想顯示回環接口的實際子網掩碼,可以使用下面的命令調整:
1
/在R1、R2、R3宣告進OSPF的回環接口上執行下面的命令/
2
R1(config)#
int
lo
0
3
R1(config-if)#
ip
ospf
network
point-to-point
執行完成后,再次查看路由表就會發現所有回環接口的子網掩碼都變成了實際的子網掩碼。
OSPF鄰居表:
01
R1#
show
ip
ospf
neighbor
02
03
Neighbor ID Pri State Dead Time Address Interface
04
2.2.2.2 0 FULL/ - 00:00:37 12.1.1.2 Serial0/0
05
2.2.2.2 1 FULL/BDR 00:00:37 123.1.1.2 FastEthernet1/0
06
33.3.3.3 1 FULL/DROTHER 00:00:31 123.1.1.3 FastEthernet1/0
07
R1#
08
09
/*
10
- Neighbor ID:鄰居的RID,通過上面的輸出可以看到R2的RID是2.2.2.2
11
- R3的RID是33.3.3.3,R1和R2通過不同的接口(以太網和串行線路),
12
- 建立了兩次鄰居關系。
13
14
- Pir:OSPF鄰居接口的優先級,接口優先級用于DR和BDR的選舉,
15
- 以太網接口接口的默認優先級是1,串行線路不需要選舉DR和BDR所以優先級是0,
16
- 0代表不參與選舉。
17
18
- State:鄰居路由器的狀態,FULL代表已經建立鄰接關系,
19
- 斜杠
"/"
后面是選舉的DR或BDR標識,因為串行線路不需要選舉,所以是
"-"
,
20
"FULL/BDR"
表示R2是BDR,R3是DROTHER,除了DR和BDR的其余路由器都是DROTHER。
21
- 所以R1自己就是DR了。稍后會介紹DR和BDR的選舉過程。
22
23
- Dead time:默認的死亡時間是hello時間的4倍,即40秒。
24
- 死亡時間是一個倒計時,計時器為0時,該鄰居被刪除。
25
26
- Address:鄰居直連接口的IP地址。
27
28
- Interface:本路由的外出接口。
29
*/
OSPF拓撲表:
01
R1#
show
ip
ospf
database
02
03
OSPF Router with ID (1.1.1.1) (Process ID 1)
04
05
Router Link States (Area 0)
06
07
Link ID ADV Router Age Seq# Checksum Link count
08
1.1.1.1 1.1.1.1 1087 0x80000006 0x0096BA 4
09
2.2.2.2 2.2.2.2 486 0x80000004 0x001832 4
10
33.3.3.3 33.3.3.3 953 0x80000004 0x00358D 2
11
12
Net Link States (Area 0)
13
14
Link ID ADV Router Age Seq# Checksum
15
123.1.1.1 1.1.1.1 292 0x80000003 0x00304B
16
17
/在同一個區域中的所有路由器的OSPF拓撲表都是相同的/
g.Router ID選舉規則
Router ID簡稱RID,用來唯一標示OSPF網絡中的每一臺路由器。如果兩條OSPF路由器的RID一樣,彼此間無法建立鄰接關系。RID是以IP地址的形式出現的,按照下面的順序來選舉RID:
1)Router-id 配置命令最優先
首先在R3上查看一下默認選舉出來的RID:
1
R3#
show
ip
protocols
2
Routing Protocol is
"ospf 3"
3
/默認選出來的RID是lo1接口的IP/
4
Router ID 33.3.3.3
在R3上手工配置Router ID:
01
R3(config)#router
ospf
3
02
/將RID配置成8.8.8.8/
03
R3(config-router)#
router-id
8.8.8.8
04
05
/路由器提示需要重啟OSPF進程來使更改生效/
06
Reload or use
"clear ip ospf process"
command, for this to take effect
07
08
R3(config-router)#
end
09
/重啟OSPF進程/
10
R3#clear
ip
ospf
process
11
Reset ALL OSPF processes? [
no
]: y /輸入y回車/
12
13
/再次查看協議,發現RID更改成了8.8.8.8/
14
R3#
show
ip
protocols
15
...
16
Router ID 8.8.8.8
17
...
從上面手動配置RID來看,RID可以是一個并不存在的IP地址,RID僅僅作為路由的標識,不用于尋址。
2)如果沒有手動指定RID,路由器默認使用最大已激活的回環接口IP作為RID。(注意,這個最大并不是接口號最大,而是IP地址最大,比如33.3.3.3大于3.3.3.3)
現在取消R3手動配置的RID,并且關閉Lo1接口,這個時候最大的已激活回環接口IP應該是lo0的3.3.3.3,重啟OSPF進程看看結果是否和預測的一樣:
01
R3(config)#router
ospf
3
02
/刪除手動RID配置/
03
R3(config-router)#
no
router-id
04
Reload or use
"clear ip ospf process"
command, for this to take effect
05
R3(config-router)#
int
lo
1
06
/關閉Lo1,它將處于非激活狀態/
07
R3(config-if)#
shutdown
08
R3(config-if)#
end
09
R3#clear
ip
ospf
process
10
Reset ALL OSPF processes? [
no
]: y
11
12
/再次查看協議,RID果然變成了3.3.3.3/
13
R3#
show
ip
protocols
14
...
15
Router ID 3.3.3.3
16
...
3)如果路由器沒有手動指定RID,也沒有激活的回環接口,路由器默認選擇最大激活的物理接口的IP地址作為RID。(接口的IP最大,而不是接口號最大)
下面關閉R3的lo0接口,再次重啟OSPF進程,看看RID的變化情況:
01
R3(config)#
int
lo
0
02
R3(config-if)#
shut
03
R3(config-if)#
end
04
R3#clear
ip
ospf
process
05
Reset ALL OSPF processes? [
no
]: y
06
07
/查看協議/
08
R3#
show
ip
protocols
09
Routing Protocol is
"ospf 3"
10
...
11
Router ID 3.3.3.3
12
13
/看到這里大家可能覺得奇怪,為什么還是回環接口的地址作為RID,回環地址明明已經全部關閉了,這是一個小bug,需要手動配置RID然后再刪除手動配置的方法來讓物理接口成為RID/
14
15
R3#
conf
t
16
R3(config)#router
ospf
3
17
/首先手動配置一個RID/
18
R3(config-router)#
router-id
5.5.5.5
19
Reload or use
"clear ip ospf process"
command, for this to take effect
20
R3(config-router)#
end
21
/重啟OSPF進程/
22
R3#clear
ip
ospf
process
23
Reset ALL OSPF processes? [
no
]: y
24
R3#
conf
t
25
R3(config)#router
ospf
3
26
/接著清除這個手動配置的RID/
27
R3(config-router)#
no
router-id
28
Reload or use
"clear ip ospf process"
command, for this to take effect
29
R3(config-router)#
end
30
/再次重啟OSPF進程/
31
R3#clear
ip
ospf
process
32
Reset ALL OSPF processes? [
no
]: y
33
34
/這時候再次查看協議,現在RID變成了最大激活的物理接口IP地址了/
35
R3#
show
ip
protocols
36
Routing Protocol is
"ospf 3"
37
...
38
Router ID 123.1.1.3
h.DR和BDR選舉規則
首先用下面的圖(圖5)來說明一下為什么多路訪問的以太網中需要選舉DR和BDR,選舉它們有什么好處:

在上圖的多路訪問的網絡中,如果沒有選舉DR和BDR,為了交互路由信息,每臺路由器都需要和其他路由建立鄰接關系,就會有10個鄰接關系,如果其中一臺路由離開,要和所有的路由斷開鄰接關系,新的路由加入,也需要和所有路由建立鄰接關系,這樣會影響收斂效率。
如果選舉了DR和BDR,那么所有DROther路由器只需要和DR以及BDR建立鄰接關系即可,DROther之間的關系停留在Two-Way狀態,如果網絡上有路由條目更新,DROther向組播地址224.0.0.6發出,224.0.0.6是DR和BDR的組播地址,DR接收到這個更新后,再用224.0.0.5組播地址向其他的DROhter發送LSA。這樣不僅加快的網絡收斂速度,也節約了網絡帶寬的占用。
在多路訪問網絡中需要選舉DR和BDR,比如廣播型多路訪問的網絡以太網、令牌環網、FDDI;非廣播型多路訪問的網絡幀中繼、X.25、SMDS。點對點或點對多點網絡不需要選舉,如PPP或HDLC封裝的點對點線路。
DR和BDR選舉規則:
1)OSPF路由器選擇網絡中接口優先級最高的路由器為DR,接口優先級次高的路由器為BDR,以太網接口默認的優先級都為1。2)如果優先級相同,將使用RID最高的為DR,次高的為BDR。
按照上面的選舉規則,查看R3的鄰居表:
1
/發現R3的鄰居表的顯示中,并沒有像DR和BDR選舉規則中描述的那樣,反而R1是DR/
2
R3#
show
ip
ospf
neighbor
3
4
Neighbor ID Pri State Dead Time Address Interface
5
1.1.1.1 1 FULL/DR 00:00:30 123.1.1.1 FastEthernet1/0
6
2.2.2.2 1 FULL/BDR 00:00:34 123.1.1.2 FastEthernet1/0
這是因為,DR和BDR的選舉在設計的時候考慮到網絡的穩定性,并沒有使用搶占機制。假設此時R1、R2、R3同時啟動,因為優先級都為1,所以按照路由的RID,應該R3成為DR,R2成為BDR,R1是DROther,但是前面的配置中,R3的OSPF進程重新啟動過,相當于DR離開,此時身為BDR的R2升級成為DR,而身為DROther的R1升級成為BDR,如果此時R2也重啟了進程,那么身為BDR的R1升級成為DR,身為DROther的R3升級成為BDR,R2變成了DROther,而R3此時如果重啟OSPF,R2將從DROther升級成為BDR,就出現了現在顯示的這個樣子。其實就是一個頂替機制,DR離開BDR頂替DR,DROther再頂替BDR的位置。
可以通過下面的命令讓R3永遠是DR:
01
/將R1和R2的以太網的優先級調成0/
02
R1(config)#
int
fa 1/0
03
R1(config-if)#
ip
ospf
priority
0
04
R1(config-if)#
end
05
06
R2(config)#
int
fa 1/0
07
R2(config-if)#
ip
ospf
priority
0
08
R2(config-if)#
end
09
10
/查看R2的鄰居表,現在R1和R2都停留在了2WAY狀態,R3是DR/
11
R2#
show
ip
ospf
neighbor
12
13
Neighbor ID Pri State Dead Time Address Interface
14
1.1.1.1 0 2WAY/DROTHER 00:00:33 123.1.1.1 FastEthernet1/0
15
123.1.1.3 1 FULL/DR 00:00:36 123.1.1.3 FastEthernet1/0
16
1.1.1.1 0 FULL/ - 00:00:37 12.1.1.1 Serial0/1
17
18
/查看R3的拓撲表,發現R1和R2都是DROther/
19
R3#
show
ip
ospf
neighbor
20
21
Neighbor ID Pri State Dead Time Address Interface
22
1.1.1.1 0 FULL/DROTHER 00:00:34 123.1.1.1 FastEthernet1/0
23
2.2.2.2 0 FULL/DROTHER 00:00:36 123.1.1.2 FastEthernet1/0
這個時候如果R3出現了故障Down掉了,R1和R2將不能通過以太網正常的交換OSPF信息。另外必須強調一點,DR和BDR的選舉是基于接口的,比如一臺路由器的某個接口可能在那個網段是DR,但另外一個接口在另外一個網段卻是BDR或者DROther,這都是有可能的。
i.度量值計算方法
OSPF中使用的度量值是"花費(Cost)",默認OSPF使用100Mb/s作為參考帶寬,使用100Mb/s除以實際鏈路帶寬,得出的值取整(對于小于0的結果,取1),就是那條鏈路上OSPF的度量值,即"花費"。
比如串行線路的帶寬是1.544M,快速以太網的帶寬是100M,計算他們的"花費":
串行線路的花費=100M/1.544≈64 (取整,且不四舍五入)快速以太網線路花費=100M/100M=1
繼續上面(圖4)的實驗,將R1和R2的快速以太網接口的優先級再次調整成1,并且開啟R3的lo0接口,然后我們查看R1的OSPF路由條目驗證這一點:
01
/僅顯示OSPF條目/
02
R1#
show
ip
route
ospf
03
2.0.0.0/24 is subnetted, 1 subnets
04
O 2.2.2.0 [110/2] via 123.1.1.2, 00:03:40, FastEthernet1/0
05
3.0.0.0/24 is subnetted, 1 subnets
06
O 3.3.3.0 [110/2] via 123.1.1.3, 00:03:40, FastEthernet1/0
07
R1#
08
/*
09
- 在
"[110/2]"
中110是OSPF的默認管理距離,2是花費,
10
- 去往
"2.2.2.0/24"
的花費是2,就是快速以太網的花費加上回環接口的花費,
11
- 因為回環接口的帶寬非常高,用100M除會小于0,所以取1。
12
*/
關閉R1的快速以太網接口,再次查看R1路由表:
01
R1(config)#
int
fa 1/0
02
R1(config-if)#
shut
03
R1(config-if)#
end
04
05
/*
06
"2.2.2.0 [110/65] via 12.1.1.2"
因為數據都要經過串行線路,此時的花費變成了65,
07
"3.3.3.0 [110/66]"
這個66是串行線路花費64加上以太網花費1,再加上回環地址花費1。
08
*/
09
R1#
show
ip
route
ospf
10
2.0.0.0/24 is subnetted, 1 subnets
11
O 2.2.2.0 [110/65] via 12.1.1.2, 00:00:05, Serial0/0
12
3.0.0.0/24 is subnetted, 1 subnets
13
O 3.3.3.0 [110/66] via 12.1.1.2, 00:00:05, Serial0/0
14
123.0.0.0/24 is subnetted, 1 subnets
15
O 123.1.1.0 [110/65] via 12.1.1.2, 00:00:05, Serial0/0
可以通過下面的方法修改計算花費的參考帶寬:
1
R1(config)#router
ospf
1
2
R1(config-router)#
auto-cost
reference-bandwidth
10000
3
% OSPF: Reference bandwidth is changed.
4
Please ensure reference bandwidth is consistent across all routers.
5
R1(config-router)#
end
6
/*
7
- 將參考帶寬改成10000M,
8
- 路由器提示我們,在所有的路由上都執行這條命令,讓它們擁有相同的參考帶寬。
9
*/
將所有路由的參考帶寬全部設置成10000M后,再次查看R1路由表:
1
R1#
show
ip
route
ospf
2
2.0.0.0/24 is subnetted, 1 subnets
3
O 2.2.2.0 [110/6477] via 12.1.1.2, 00:00:33, Serial0/0
4
3.0.0.0/24 is subnetted, 1 subnets
5
O 3.3.3.0 [110/6577] via 12.1.1.2, 00:00:33, Serial0/0
6
123.0.0.0/24 is subnetted, 1 subnets
7
O 123.1.1.0 [110/6576] via 12.1.1.2, 00:00:33, Serial0/0
這里拿去往3.3.3.0/24網絡的6577舉例計算花費:
R1和R2相連的串行鏈路花費=10000M/1.544M≈6476(取整且不四舍五入)R2去往R3中間是快速以太網線路,花費=10000M/100M=100R3上的Lo1接口的花費=10000M/8000M≈1(取整且不四舍五入)
所以結果就是這三條線路花費的總和,即6577。
可以通過下面的命令查看某接口的OSPF信息:
01
R1#
show
ip
ospf
interface
s 0/0
02
Serial0/0 is up, line protocol is up
03
Internet Address 12.1.1.1/24, Area 0
04
Process ID 1, Router ID 1.1.1.1, Network Type POINT_TO_POINT, Cost: 64
05
Transmit Delay is 1 sec, State POINT_TO_POINT,
06
Timer intervals configured, Hello 10, Dead 40, Wait 40, Retransmit 5
07
oob-resync timeout 40
08
Hello due in 00:00:05
09
Supports Link-local Signaling (LLS)
10
Index 3/3, flood queue length 0
11
Next 0x0(0)/0x0(0)
12
Last flood scan length is 1,
maximum
is 1
13
Last flood scan time is 0 msec,
maximum
is 4 msec
14
Neighbor Count is 1, Adjacent neighbor count is 1
15
Adjacent with neighbor 2.2.2.2
16
Suppress hello for 0 neighbor(s)
0×3.OSPF高級配置
a.驗證實例
OSPF鏈路的驗證分為兩種,一種明文驗證,一種MD5驗證,默認OSPF鏈路沒有使用驗證,在沒有使用任何驗證前,通過下面的命令來查看一下R1的OSPF分組的接收情況:
01
R1#debug
ip
ospf
packet
02
03
*Mar 1 03:44:54.507: OSPF: rcv. v:2
t
:1 l:48 rid:2.2.2.2
04
aid:0.0.0.0 chk:E694 aut:0 auk: from Serial0/0
05
06
/*
07
- 本例截取了從R2上發過來OSPF報文如上,各字段的解釋如下:
08
09
"v:2"
表示OSPFv2版本。
10
"t:1"
表示Type,即類型,類型1是Hello報文。
11
"l:48"
長度Length是48。
12
"rid:2.2.2.2"
發送整個報文的路由器的RID。
13
"aid:0.0.0.0"
表示所在區域是0(
area
0)。
14
"chk:E694"
表示驗證和。
15
"aut:0"
表示驗證,0表示空驗證,1表示明文驗證,2表示MD5驗證。
16
"auk:"
驗證相關的內容,因為沒有使用驗證,所以沒有值。
17
"from Serial0/0"
表示從s0/0接口接收到的OSPF分組。
18
*/
下面首先介紹OSPF明文驗證配置,首先再次打開前面的試驗(圖4)中關閉的R1的fa1/0接口,然后在R1、R2、R3上配置驗證;
明文驗證的配置步驟是:
1)在所有參與OSPF進程的接口上配置使用明文密碼。2)在OSPF進程中聲明使用明文驗證。
01
/在每個參與OSPF進程的接口上配置明文密碼/
02
R1(config)#
int
fa 1/0
03
/*fa1/0接口驗證密碼
"ccna1234"
*/
04
R1(config-if)#
ip
ospf
authentication
key
ccna1234
05
R1(config-if)#
int
s 0/0
06
/*s0/0接口驗證密碼
"ccna"
*/
07
R1(config-if)#
ip
ospf
authentication
key
ccna
08
/在OSPF進程中開啟區域0的明文驗證/
09
R1(config-if)#router
ospf
1
10
R1(config-router)#
area
0
authentication
11
R1(config-router)#
end
12
13
/在R2上也開啟明文驗證,鏈路兩端配置的密碼必須相同/
14
R2(config)#
int
fa 1/0
15
R2(config-if)#
ip
ospf
authentication
key
ccna1234
16
R2(config-if)#
int
s 0/1
17
R2(config-if)#
ip
ospf
authentication
key
ccna
18
R2(config-if)#router
ospf
2
19
R2(config-router)#
area
0
authentication
20
R2(config-router)#
end
21
22
/在R3上面開啟明文驗證/
23
R3(config)#
int
fa 1/0
24
/前面的度量值實驗中關閉了這個端口,現在重新打開它/
25
R3(config-if)#
no
shut
26
R3(config-if)#
ip
ospf
authentication
key
ccna1234
27
R3(config-if)#router
ospf
3
28
R3(config-router)#
area
0
authentication
29
R3(config-router)#
end
30
31
/*
32
- 上面R1和R2的串行線路配置的密碼都是
"ccna"
,和多路訪問的以太網接口的密碼不一樣,
33
- 這是允許的,只要兩端的密碼相同即可。
34
*/
再次打開"debug ip ospf packet"查看:
1
R1#debug
ip
ospf
packet
2
3
*Mar 1 04:13:24.546: OSPF: rcv. v:2
t
:1 l:48 rid:2.2.2.2
4
aid:0.0.0.0 chk:E693 aut:1 auk: from Serial0/0
5
6
/可以看到
"aut:1"
,說明開啟了明文驗證/
試著取消R1 fa1/0的明文驗證,然后使用下面的命令查看路由器輸出:
01
/取消R1的fa1/0明文驗證/
02
R1(config)#
int
fa 1/0
03
R1(config-if)#
no
ip
ospf
authentication
key
04
R1(config-if)#
end
05
R1#
06
07
/查看鄰接關系輸出/
08
R1#debug
ip
ospf
adj
09
OSPF adjacency events debugging is on
10
11
*Mar 1 04:17:24.578: OSPF: Rcv pkt from 123.1.1.2, FastEthernet1/0 : Mismatch Authentication Key - Clear Text
12
R1#u all
13
/*看到了驗證不匹配的提示
"Mismatch Authentication Key"
*/
不需要將R1的fa1/0接口驗證恢復,接著下面的實驗,配置MD5驗證(點對點線路兩端必須配置相同的密碼):
01
/R1配置MD5驗證/
02
R1(config)#
int
s 0/0
03
/刪除剛才配置的明文驗證/
04
R1(config-if)#
no
ip
ospf
authentication
key
05
/配置MD5驗證/
06
R1(config-if)#
ip
ospf
message-digest
key
1 md5 ccna123
07
/fa1/0接口在上面的試驗中已經刪除了原來的明文驗證/
08
R1(config-if)#
int
fa 1/0
09
R1(config-if)#
ip
ospf
message-digest
key
1 md5 ccna123456
10
R1(config-if)#router
ospf
1
11
/取消區域的明文驗證/
12
R1(config-router)#
no
area
0
authentication
13
/使用MD5驗證/
14
R1(config-router)#
area
0
authentication
message-digest
15
R1(config-router)#
end
16
17
/R2配置MD5驗證/
18
R2(config)#
int
fa 1/0
19
R2(config-if)#
no
ip
ospf
authentication
key
20
R2(config-if)#
ip
ospf
message-digest
key
1 md5 ccna123456
21
R2(config-if)#
int
s 0/1
22
R2(config-if)#
no
ip
ospf
authentication
key
23
R2(config-if)#
ip
ospf
message-digest
key
1 md5 ccna123
24
R2(config-if)#router
ospf
2
25
/可以直接覆蓋明文驗證/
26
R2(config-router)#
area
0
authentication
message-digest
27
R2(config-router)#
end
28
29
/R3配置MD5驗證/
30
R3(config)#
int
fa 1/0
31
R3(config-if)#
no
ip
ospf
authentication
key
32
R3(config-if)#
ip
ospf
message-digest
key
1 md5 ccna123456
33
R3(config-if)#router
ospf
3
34
R3(config-router)#
area
0
authentication
message-digest
35
R3(config-router)#
end
配置完成后,查看debug輸出:
1
R1#debug
ip
ospf
packet
2
OSPF packet debugging is on
3
R1#
4
*Mar 1 04:32:14.582: OSPF: rcv. v:2
t
:1 l:48 rid:2.2.2.2
5
aid:0.0.0.0 chk:0 aut:2 keyid:1 seq:0x3C7F02E8 from Serial0/0
6
7
/可以看到
"aut:2 keyid:1 seq:0x3C7F02E8"
,驗證類型是MD5,keyid是1/
此時拓撲中的所有路由都可以交換OSPF信息,并且是MD5驗證模式;繼續下面的實驗,配置默認路由。
b.默認路由實例
在R1上新建一個回環接口lo1,IP設置成11.11.11.11,因為R1并沒有將所有接口都發布到OSPF進程中,所以lo1不會被其他路由器學習到,下面將這個新增加的接口設置成R1的默認路由出口,并且宣告給其他路由:
01
R1(config)#
int
lo
1
02
R1(config-if)#
ip
add
11.11.11.11 255.255.255.0
03
R1(config-if)#
no
shut
04
R1(config-if)#
exit
05
/創建默認路由指向lo1接口/
06
R1(config)#
ip
route
0.0.0.0 0.0.0.0 lo1
07
R1(config)#router
ospf
1
08
/發布默認路由/
09
R1(config-router)#
default-information
originate
10
R1(config-router)#
end
11
12
/查看R2的路由表,可以看到多出一條
"OE2"
的默認路由*/
13
R2#
show
ip
route
14
15
O*E2 0.0.0.0/0 [110/1] via 123.1.1.1, 00:01:02, FastEthernet1/0
"O*E2"中O表示從OSPF學習到的路由,E2表示該路由是OSPF外部類型2的路由,OSPF使用E1和E2標記外部路由,E1表示除計算外部來的花費外,還要計算OSPF內部花費,而E2則只計算外部花費,不計算OSPF域內花費,這就是這條默認路由的花費為1的原因。如果此時關閉R1的lo1接口,其他路由上這條默認路由將消失,可以使用下面的命令讓R1始終對外發布默認路由:
1
R1(config)#router
ospf
1
2
R1(config-router)#
default-information
originate
always
3
R1(config-router)#
end
使用這條命令配置之后R1關閉lo1接口,其他路由上還是會存在這條默認路由。