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

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

數(shù)據(jù)鏈路層頭部:OSPF使用的組播IP地址是224.0.0.5(非DR和BDR路由使用的地址)和224.0.0.6(DR和BDR使用的組播地址),這兩個(gè)組播地址對應(yīng)的MAC地址分別為:"01-00-5E-00-00-05"和"01-00-5E-00-00-06"。包頭部:協(xié)議號是89,源IP是發(fā)送路由的IP,目的IP是組播IP地址224.0.0.5或224.0.0.6。OSPF頭部:包括路由ID和所在的區(qū)域號、包的類型代碼(5種類型的包代碼)。OSPF包對應(yīng)的數(shù)據(jù):不同包具有不同的內(nèi)容。
d.包類型
1)Hello包
Hello報(bào)文用來建立和維護(hù)OSPF路由器間的鄰接關(guān)系,它的主要作用是:發(fā)現(xiàn)OSPF鄰居,建立和維護(hù)鄰接關(guān)系;在多路訪問中選擇DR和BDR。OSPF泛洪鏈路狀態(tài)通告給其他路由前需要先建立鄰接關(guān)系,通過在OSPF協(xié)議的接口上發(fā)送Hello報(bào)文判斷是否有其他OSPF路由器運(yùn)行在相同的鏈路上。
雙方要建立鄰接關(guān)系,Hello報(bào)文中的區(qū)域號、Hello間隔和dead間隔、驗(yàn)證(如果有)以及區(qū)域類型都要一致。在廣播(如以太網(wǎng))和點(diǎn)對點(diǎn)鏈路(如串行線路)中,Hello間隔默認(rèn)是10秒;dead時(shí)間默認(rèn)是Hello間隔的4倍(40秒);非廣播多路訪問(NBMA),比如幀中繼網(wǎng)絡(luò)中默認(rèn)Hello間隔是30秒。
可以通過下面的命令修改默認(rèn)的Hello時(shí)間和dead時(shí)間:
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,數(shù)據(jù)庫狀態(tài)描述包)
DBD包是發(fā)送端對自己鏈路狀態(tài)數(shù)據(jù)庫的一個(gè)簡短描述,接收路由器根據(jù)接收到的DBD包對比自己的鏈路狀態(tài)數(shù)據(jù)庫,檢測發(fā)送端和接收端的鏈路狀態(tài)數(shù)據(jù)庫是否同步。
3)LSR(Link-State Request,鏈路狀態(tài)請求包)
接收端可以發(fā)送LSA來請求接收到的DBD中的某些詳細(xì)信息。
4)LSU(Link-State Update,鏈路狀態(tài)更新包)
LSU用來更新OSPF路由信息,回復(fù)LSR請求。
5)LSAck(Link-State Acknowledgement,鏈路狀態(tài)確認(rèn))
當(dāng)收到一個(gè)LSU,路由器發(fā)送LSAck確認(rèn)。
e.鄰居關(guān)系的建立過程
OSPF中鄰居建立過程演示圖(圖3)如下:

Down:OSPF初始狀態(tài),還沒有開始交換信息。Init:交換信息初期,表示已經(jīng)收到了鄰居的Hello報(bào)文,但是報(bào)文中沒有列出本路由的RID,也就是說對方還沒有收到本路由發(fā)出的Hello報(bào)文。Two-Way:雙向階段,雙方都收到了對方發(fā)送的Hello報(bào)文,建立了鄰居關(guān)系。在多路訪問的網(wǎng)絡(luò)中,兩個(gè)接口狀態(tài)是DROther的路由器之間將停留在此狀態(tài),其他情況將繼續(xù)轉(zhuǎn)入高級狀態(tài)。在此狀態(tài)下的路由器是不能共享路由信息的,想共享路由信息,必須建立鄰接關(guān)系。(注意鄰居關(guān)系和鄰接關(guān)系的區(qū)別)Exstart:準(zhǔn)備開始交換階段,雙方通過Hello報(bào)文決定主從關(guān)系,最高RID的路由將成為主路由,最先發(fā)起交換。主從關(guān)系確立后進(jìn)入下一個(gè)階段。Exchange:開始交換階段,路由器將本地的"路由狀態(tài)數(shù)據(jù)庫(LSDB)"用"數(shù)據(jù)庫描述(DBD)"報(bào)文來描述,然后發(fā)給鄰路由。如果這個(gè)階段中的路由收到不在其數(shù)據(jù)庫中的有關(guān)鏈路的信息,那么在下一個(gè)階段中將請求對方發(fā)送該路由條目的完整信息。Loading:加載階段,路由器通過發(fā)送"鏈路狀態(tài)請求(LSR)",來向鄰居請求一些路由條目的詳細(xì)信息。鄰居則會使用"鏈路狀態(tài)更新包(LSU)"來回復(fù)LSR請求,收到鄰居發(fā)回的LSU后,再發(fā)送LSAck向發(fā)送LSU的路由進(jìn)行確認(rèn)。FULL:完全鄰接狀態(tài),Loading結(jié)束后,路由器之間就變成了"Full adjacency"。
f.基本配置實(shí)例
使用OSPF配置下面的拓?fù)?,三臺c3640路由使用以太網(wǎng)接口連接在一臺二層非網(wǎng)管交換機(jī)上(GNS3中自帶的那個(gè)"Ethernet switch",非IOU中的二層可網(wǎng)管交換機(jī)),設(shè)備間連線和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進(jìn)程,進(jìn)程號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進(jìn)程號1,只具有本地意義,每個(gè)路由可以不同,
19
"net 123.1.1.0 0.0.0.255 area 0"
OSPF網(wǎng)絡(luò)的宣告使用反掩碼形式,
20
"area 0"
是OSPF區(qū)域號,同一個(gè)區(qū)域中的路由器區(qū)域號要保持一致,
21
- CCNA中只涉及區(qū)域0,也就是骨干區(qū)域的配置。
22
- 如果要將路由器上所有接口都宣告進(jìn)OSPF進(jìn)程,可以使用下面的命令:
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上的所有接口都發(fā)布進(jìn)OSPF進(jìn)程*/
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接口宣告進(jìn)OSPF進(jìn)程/
16
17
/*
18
- 對于OSPF的宣告還有幾種可以使用的不規(guī)范格式:
19
20
"net 123.1.1.1 0.0.0.0 area 0"
21
- 指定僅有一個(gè)IP(123.1.1.1)宣告進(jìn)OSPF進(jìn)程。
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
- 上面幾種格式都能被正確識別,但是最好使用規(guī)范格式。
30
*/
OSPF路由表:
01
/*
02
- R1路由表,顯示如下:
03
- R1學(xué)習(xí)到了R2和R3上面的回環(huán)接口的IP地址,
04
- 因?yàn)镽3的Lo1并沒有宣告進(jìn)OSPF進(jìn)程,所以沒有33.3.3.3這個(gè)地址。
05
"O"
表示是從OSPF學(xué)習(xí)到的路由條目。
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中所有的回環(huán)接口都被自動宣告成32位的主機(jī)路由"/32",如果想顯示回環(huán)接口的實(shí)際子網(wǎng)掩碼,可以使用下面的命令調(diào)整:
1
/在R1、R2、R3宣告進(jìn)OSPF的回環(huán)接口上執(zhí)行下面的命令/
2
R1(config)#
int
lo
0
3
R1(config-if)#
ip
ospf
network
point-to-point
執(zhí)行完成后,再次查看路由表就會發(fā)現(xiàn)所有回環(huán)接口的子網(wǎng)掩碼都變成了實(shí)際的子網(wǎng)掩碼。
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通過不同的接口(以太網(wǎng)和串行線路),
12
- 建立了兩次鄰居關(guān)系。
13
14
- Pir:OSPF鄰居接口的優(yōu)先級,接口優(yōu)先級用于DR和BDR的選舉,
15
- 以太網(wǎng)接口接口的默認(rèn)優(yōu)先級是1,串行線路不需要選舉DR和BDR所以優(yōu)先級是0,
16
- 0代表不參與選舉。
17
18
- State:鄰居路由器的狀態(tài),F(xiàn)ULL代表已經(jīng)建立鄰接關(guān)系,
19
- 斜杠
"/"
后面是選舉的DR或BDR標(biāo)識,因?yàn)榇芯€路不需要選舉,所以是
"-"
,
20
"FULL/BDR"
表示R2是BDR,R3是DROTHER,除了DR和BDR的其余路由器都是DROTHER。
21
- 所以R1自己就是DR了。稍后會介紹DR和BDR的選舉過程。
22
23
- Dead time:默認(rèn)的死亡時(shí)間是hello時(shí)間的4倍,即40秒。
24
- 死亡時(shí)間是一個(gè)倒計(jì)時(shí),計(jì)時(shí)器為0時(shí),該鄰居被刪除。
25
26
- Address:鄰居直連接口的IP地址。
27
28
- Interface:本路由的外出接口。
29
*/
OSPF拓?fù)浔恚?br> 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
/在同一個(gè)區(qū)域中的所有路由器的OSPF拓?fù)浔矶际窍嗤?/em>/
g.Router ID選舉規(guī)則
Router ID簡稱RID,用來唯一標(biāo)示OSPF網(wǎng)絡(luò)中的每一臺路由器。如果兩條OSPF路由器的RID一樣,彼此間無法建立鄰接關(guān)系。RID是以IP地址的形式出現(xiàn)的,按照下面的順序來選舉RID:
1)Router-id 配置命令最優(yōu)先
首先在R3上查看一下默認(rèn)選舉出來的RID:
1
R3#
show
ip
protocols
2
Routing Protocol is
"ospf 3"
3
/默認(rèn)選出來的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進(jìn)程來使更改生效/
06
Reload or use
"clear ip ospf process"
command, for this to take effect
07
08
R3(config-router)#
end
09
/重啟OSPF進(jìn)程/
10
R3#clear
ip
ospf
process
11
Reset ALL OSPF processes? [
no
]: y /輸入y回車/
12
13
/再次查看協(xié)議,發(fā)現(xiàn)RID更改成了8.8.8.8/
14
R3#
show
ip
protocols
15
...
16
Router ID 8.8.8.8
17
...
從上面手動配置RID來看,RID可以是一個(gè)并不存在的IP地址,RID僅僅作為路由的標(biāo)識,不用于尋址。
2)如果沒有手動指定RID,路由器默認(rèn)使用最大已激活的回環(huán)接口IP作為RID。(注意,這個(gè)最大并不是接口號最大,而是IP地址最大,比如33.3.3.3大于3.3.3.3)
現(xiàn)在取消R3手動配置的RID,并且關(guān)閉Lo1接口,這個(gè)時(shí)候最大的已激活回環(huán)接口IP應(yīng)該是lo0的3.3.3.3,重啟OSPF進(jìn)程看看結(jié)果是否和預(yù)測的一樣:
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
/關(guān)閉Lo1,它將處于非激活狀態(tài)/
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
/再次查看協(xié)議,RID果然變成了3.3.3.3/
13
R3#
show
ip
protocols
14
...
15
Router ID 3.3.3.3
16
...
3)如果路由器沒有手動指定RID,也沒有激活的回環(huán)接口,路由器默認(rèn)選擇最大激活的物理接口的IP地址作為RID。(接口的IP最大,而不是接口號最大)
下面關(guān)閉R3的lo0接口,再次重啟OSPF進(jìn)程,看看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
/查看協(xié)議/
08
R3#
show
ip
protocols
09
Routing Protocol is
"ospf 3"
10
...
11
Router ID 3.3.3.3
12
13
/看到這里大家可能覺得奇怪,為什么還是回環(huán)接口的地址作為RID,回環(huán)地址明明已經(jīng)全部關(guān)閉了,這是一個(gè)小bug,需要手動配置RID然后再刪除手動配置的方法來讓物理接口成為RID/
14
15
R3#
conf
t
16
R3(config)#router
ospf
3
17
/首先手動配置一個(gè)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進(jìn)程/
22
R3#clear
ip
ospf
process
23
Reset ALL OSPF processes? [
no
]: y
24
R3#
conf
t
25
R3(config)#router
ospf
3
26
/接著清除這個(gè)手動配置的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進(jìn)程/
31
R3#clear
ip
ospf
process
32
Reset ALL OSPF processes? [
no
]: y
33
34
/這時(shí)候再次查看協(xié)議,現(xiàn)在RID變成了最大激活的物理接口IP地址了/
35
R3#
show
ip
protocols
36
Routing Protocol is
"ospf 3"
37
...
38
Router ID 123.1.1.3
h.DR和BDR選舉規(guī)則
首先用下面的圖(圖5)來說明一下為什么多路訪問的以太網(wǎng)中需要選舉DR和BDR,選舉它們有什么好處:

在上圖的多路訪問的網(wǎng)絡(luò)中,如果沒有選舉DR和BDR,為了交互路由信息,每臺路由器都需要和其他路由建立鄰接關(guān)系,就會有10個(gè)鄰接關(guān)系,如果其中一臺路由離開,要和所有的路由斷開鄰接關(guān)系,新的路由加入,也需要和所有路由建立鄰接關(guān)系,這樣會影響收斂效率。
如果選舉了DR和BDR,那么所有DROther路由器只需要和DR以及BDR建立鄰接關(guān)系即可,DROther之間的關(guān)系停留在Two-Way狀態(tài),如果網(wǎng)絡(luò)上有路由條目更新,DROther向組播地址224.0.0.6發(fā)出,224.0.0.6是DR和BDR的組播地址,DR接收到這個(gè)更新后,再用224.0.0.5組播地址向其他的DROhter發(fā)送LSA。這樣不僅加快的網(wǎng)絡(luò)收斂速度,也節(jié)約了網(wǎng)絡(luò)帶寬的占用。
在多路訪問網(wǎng)絡(luò)中需要選舉DR和BDR,比如廣播型多路訪問的網(wǎng)絡(luò)以太網(wǎng)、令牌環(huán)網(wǎng)、FDDI;非廣播型多路訪問的網(wǎng)絡(luò)幀中繼、X.25、SMDS。點(diǎn)對點(diǎn)或點(diǎn)對多點(diǎn)網(wǎng)絡(luò)不需要選舉,如PPP或HDLC封裝的點(diǎn)對點(diǎn)線路。
DR和BDR選舉規(guī)則:
1)OSPF路由器選擇網(wǎng)絡(luò)中接口優(yōu)先級最高的路由器為DR,接口優(yōu)先級次高的路由器為BDR,以太網(wǎng)接口默認(rèn)的優(yōu)先級都為1。2)如果優(yōu)先級相同,將使用RID最高的為DR,次高的為BDR。
按照上面的選舉規(guī)則,查看R3的鄰居表:
1
/發(fā)現(xiàn)R3的鄰居表的顯示中,并沒有像DR和BDR選舉規(guī)則中描述的那樣,反而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
這是因?yàn)?,DR和BDR的選舉在設(shè)計(jì)的時(shí)候考慮到網(wǎng)絡(luò)的穩(wěn)定性,并沒有使用搶占機(jī)制。假設(shè)此時(shí)R1、R2、R3同時(shí)啟動,因?yàn)閮?yōu)先級都為1,所以按照路由的RID,應(yīng)該R3成為DR,R2成為BDR,R1是DROther,但是前面的配置中,R3的OSPF進(jìn)程重新啟動過,相當(dāng)于DR離開,此時(shí)身為BDR的R2升級成為DR,而身為DROther的R1升級成為BDR,如果此時(shí)R2也重啟了進(jìn)程,那么身為BDR的R1升級成為DR,身為DROther的R3升級成為BDR,R2變成了DROther,而R3此時(shí)如果重啟OSPF,R2將從DROther升級成為BDR,就出現(xiàn)了現(xiàn)在顯示的這個(gè)樣子。其實(shí)就是一個(gè)頂替機(jī)制,DR離開BDR頂替DR,DROther再頂替BDR的位置。
可以通過下面的命令讓R3永遠(yuǎn)是DR:
01
/將R1和R2的以太網(wǎng)的優(yōu)先級調(diào)成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的鄰居表,現(xiàn)在R1和R2都停留在了2WAY狀態(tài),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的拓?fù)浔?發(fā)現(xiàn)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
這個(gè)時(shí)候如果R3出現(xiàn)了故障Down掉了,R1和R2將不能通過以太網(wǎng)正常的交換OSPF信息。另外必須強(qiáng)調(diào)一點(diǎn),DR和BDR的選舉是基于接口的,比如一臺路由器的某個(gè)接口可能在那個(gè)網(wǎng)段是DR,但另外一個(gè)接口在另外一個(gè)網(wǎng)段卻是BDR或者DROther,這都是有可能的。
i.度量值計(jì)算方法
OSPF中使用的度量值是"花費(fèi)(Cost)",默認(rèn)OSPF使用100Mb/s作為參考帶寬,使用100Mb/s除以實(shí)際鏈路帶寬,得出的值取整(對于小于0的結(jié)果,取1),就是那條鏈路上OSPF的度量值,即"花費(fèi)"。
比如串行線路的帶寬是1.544M,快速以太網(wǎng)的帶寬是100M,計(jì)算他們的"花費(fèi)":
串行線路的花費(fèi)=100M/1.544≈64 (取整,且不四舍五入)快速以太網(wǎng)線路花費(fèi)=100M/100M=1
繼續(xù)上面(圖4)的實(shí)驗(yàn),將R1和R2的快速以太網(wǎng)接口的優(yōu)先級再次調(diào)整成1,并且開啟R3的lo0接口,然后我們查看R1的OSPF路由條目驗(yàn)證這一點(diǎn):
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的默認(rèn)管理距離,2是花費(fèi),
10
- 去往
"2.2.2.0/24"
的花費(fèi)是2,就是快速以太網(wǎng)的花費(fèi)加上回環(huán)接口的花費(fèi),
11
- 因?yàn)榛丨h(huán)接口的帶寬非常高,用100M除會小于0,所以取1。
12
*/
關(guān)閉R1的快速以太網(wǎng)接口,再次查看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"
因?yàn)閿?shù)據(jù)都要經(jīng)過串行線路,此時(shí)的花費(fèi)變成了65,
07
"3.3.3.0 [110/66]"
這個(gè)66是串行線路花費(fèi)64加上以太網(wǎng)花費(fèi)1,再加上回環(huán)地址花費(fèi)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
可以通過下面的方法修改計(jì)算花費(fèi)的參考帶寬:
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
- 路由器提示我們,在所有的路由上都執(zhí)行這條命令,讓它們擁有相同的參考帶寬。
9
*/
將所有路由的參考帶寬全部設(shè)置成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網(wǎng)絡(luò)的6577舉例計(jì)算花費(fèi):
R1和R2相連的串行鏈路花費(fèi)=10000M/1.544M≈6476(取整且不四舍五入)R2去往R3中間是快速以太網(wǎng)線路,花費(fèi)=10000M/100M=100R3上的Lo1接口的花費(fèi)=10000M/8000M≈1(取整且不四舍五入)
所以結(jié)果就是這三條線路花費(fèi)的總和,即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.驗(yàn)證實(shí)例
OSPF鏈路的驗(yàn)證分為兩種,一種明文驗(yàn)證,一種MD5驗(yàn)證,默認(rèn)OSPF鏈路沒有使用驗(yàn)證,在沒有使用任何驗(yàn)證前,通過下面的命令來查看一下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上發(fā)過來OSPF報(bào)文如上,各字段的解釋如下:
08
09
"v:2"
表示OSPFv2版本。
10
"t:1"
表示Type,即類型,類型1是Hello報(bào)文。
11
"l:48"
長度Length是48。
12
"rid:2.2.2.2"
發(fā)送整個(gè)報(bào)文的路由器的RID。
13
"aid:0.0.0.0"
表示所在區(qū)域是0(
area
0)。
14
"chk:E694"
表示驗(yàn)證和。
15
"aut:0"
表示驗(yàn)證,0表示空驗(yàn)證,1表示明文驗(yàn)證,2表示MD5驗(yàn)證。
16
"auk:"
驗(yàn)證相關(guān)的內(nèi)容,因?yàn)闆]有使用驗(yàn)證,所以沒有值。
17
"from Serial0/0"
表示從s0/0接口接收到的OSPF分組。
18
*/
下面首先介紹OSPF明文驗(yàn)證配置,首先再次打開前面的試驗(yàn)(圖4)中關(guān)閉的R1的fa1/0接口,然后在R1、R2、R3上配置驗(yàn)證;
明文驗(yàn)證的配置步驟是:
1)在所有參與OSPF進(jìn)程的接口上配置使用明文密碼。2)在OSPF進(jìn)程中聲明使用明文驗(yàn)證。
01
/在每個(gè)參與OSPF進(jìn)程的接口上配置明文密碼/
02
R1(config)#
int
fa 1/0
03
/*fa1/0接口驗(yàn)證密碼
"ccna1234"
*/
04
R1(config-if)#
ip
ospf
authentication
key
ccna1234
05
R1(config-if)#
int
s 0/0
06
/*s0/0接口驗(yàn)證密碼
"ccna"
*/
07
R1(config-if)#
ip
ospf
authentication
key
ccna
08
/在OSPF進(jìn)程中開啟區(qū)域0的明文驗(yàn)證/
09
R1(config-if)#router
ospf
1
10
R1(config-router)#
area
0
authentication
11
R1(config-router)#
end
12
13
/在R2上也開啟明文驗(yàn)證,鏈路兩端配置的密碼必須相同/
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上面開啟明文驗(yàn)證/
23
R3(config)#
int
fa 1/0
24
/前面的度量值實(shí)驗(yàn)中關(guān)閉了這個(gè)端口,現(xiàn)在重新打開它/
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"
,和多路訪問的以太網(wǎng)接口的密碼不一樣,
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"
,說明開啟了明文驗(yàn)證/
試著取消R1 fa1/0的明文驗(yàn)證,然后使用下面的命令查看路由器輸出:
01
/取消R1的fa1/0明文驗(yàn)證/
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
/查看鄰接關(guān)系輸出/
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
/*看到了驗(yàn)證不匹配的提示
"Mismatch Authentication Key"
*/
不需要將R1的fa1/0接口驗(yàn)證恢復(fù),接著下面的實(shí)驗(yàn),配置MD5驗(yàn)證(點(diǎn)對點(diǎn)線路兩端必須配置相同的密碼):
01
/R1配置MD5驗(yàn)證/
02
R1(config)#
int
s 0/0
03
/刪除剛才配置的明文驗(yàn)證/
04
R1(config-if)#
no
ip
ospf
authentication
key
05
/配置MD5驗(yàn)證/
06
R1(config-if)#
ip
ospf
message-digest
key
1 md5 ccna123
07
/fa1/0接口在上面的試驗(yàn)中已經(jīng)刪除了原來的明文驗(yàn)證/
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
/取消區(qū)域的明文驗(yàn)證/
12
R1(config-router)#
no
area
0
authentication
13
/使用MD5驗(yàn)證/
14
R1(config-router)#
area
0
authentication
message-digest
15
R1(config-router)#
end
16
17
/R2配置MD5驗(yàn)證/
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
/可以直接覆蓋明文驗(yàn)證/
26
R2(config-router)#
area
0
authentication
message-digest
27
R2(config-router)#
end
28
29
/R3配置MD5驗(yàn)證/
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"
,驗(yàn)證類型是MD5,keyid是1/
此時(shí)拓?fù)渲械乃新酚啥伎梢越粨QOSPF信息,并且是MD5驗(yàn)證模式;繼續(xù)下面的實(shí)驗(yàn),配置默認(rèn)路由。
b.默認(rèn)路由實(shí)例
在R1上新建一個(gè)回環(huán)接口lo1,IP設(shè)置成11.11.11.11,因?yàn)镽1并沒有將所有接口都發(fā)布到OSPF進(jìn)程中,所以lo1不會被其他路由器學(xué)習(xí)到,下面將這個(gè)新增加的接口設(shè)置成R1的默認(rèn)路由出口,并且宣告給其他路由:
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
/創(chuàng)建默認(rèn)路由指向lo1接口/
06
R1(config)#
ip
route
0.0.0.0 0.0.0.0 lo1
07
R1(config)#router
ospf
1
08
/發(fā)布默認(rèn)路由/
09
R1(config-router)#
default-information
originate
10
R1(config-router)#
end
11
12
/查看R2的路由表,可以看到多出一條
"OE2"
的默認(rèn)路由*/
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學(xué)習(xí)到的路由,E2表示該路由是OSPF外部類型2的路由,OSPF使用E1和E2標(biāo)記外部路由,E1表示除計(jì)算外部來的花費(fèi)外,還要計(jì)算OSPF內(nèi)部花費(fèi),而E2則只計(jì)算外部花費(fèi),不計(jì)算OSPF域內(nèi)花費(fèi),這就是這條默認(rèn)路由的花費(fèi)為1的原因。如果此時(shí)關(guān)閉R1的lo1接口,其他路由上這條默認(rèn)路由將消失,可以使用下面的命令讓R1始終對外發(fā)布默認(rèn)路由:
1
R1(config)#router
ospf
1
2
R1(config-router)#
default-information
originate
always
3
R1(config-router)#
end
使用這條命令配置之后R1關(guān)閉lo1接口,其他路由上還是會存在這條默認(rèn)路由。