0×1.冗余鏈路中存在的問題
這一部分使用下面這個拓?fù)鋱D(圖1)來講解一下鏈路冗余容易造成的三個問題:

如圖1所示SW1和SW2之間有兩條線路相連,它們之間任何一條鏈路出現(xiàn)故障另外一條線路可以馬上頂替出現(xiàn)故障的那條鏈路,這樣可以很好的解決單鏈路故障引起的網(wǎng)絡(luò)中斷,但在此之前有下面三個需要考慮的問題。
a.廣播風(fēng)暴
以太網(wǎng)交換機(jī)傳送的第二層數(shù)據(jù)幀不像路由器傳送的第三層數(shù)據(jù)包有TTL(Time To Live),如果有環(huán)路存在第二層幀不能被適當(dāng)?shù)慕K止,他們將在交換機(jī)之間永無止境的傳遞下去。結(jié)合交換機(jī)的工作原理,來看一下圖1中廣播風(fēng)暴是如何形成的:
1)PC1發(fā)出一個廣播幀(可能是一個ARP查詢),SW1收到這個廣播幀,SW1將這個廣播幀從除接收端口的其他端口轉(zhuǎn)發(fā)出去(即發(fā)往fa0/2、fa0/23、fa0/24)。2)SW2從自己的fa0/23和fa0/24都會收到SW1發(fā)過來的相同的廣播幀,SW2再將這個廣播幀從除接收端口外的所有其他接口發(fā)送出去(SW2將從fa0/23接收的廣播幀發(fā)往其他三個端口fa0/24、fa0/1、fa0/2,從fa0/24接收到的也會發(fā)往其他三個端口fa0/23、fa0/1、fa0/2)。3)這樣這個廣播幀又從fa0/23以及fa0/24傳回了SW1,SW1再用相同的方法傳回SW2,除非物理線路被破壞,否則PC1-4將不停的接收到廣播幀,最終造成網(wǎng)絡(luò)的擁塞甚至癱瘓。
b.MAC地址表不穩(wěn)定
廣播風(fēng)暴除了會產(chǎn)生大量的流量外,還會造成MAC地址表的不穩(wěn)定,在廣播風(fēng)暴形成過程中:
1)PC1發(fā)出的廣播幀到達(dá)SW1,SW1將根據(jù)源MAC進(jìn)行學(xué)習(xí),SW1將PC1的MAC和對應(yīng)端口fa0/1寫入MAC緩存表中。2)SW1將這個廣播幀從除接收端口之外的其他端口轉(zhuǎn)發(fā)出去,SW2接收到兩個來自SW1的廣播(從fa0/23和fa0/24),假設(shè)fa0/23首先收到這個廣播幀,SW2根據(jù)源MAC進(jìn)行學(xué)習(xí),將PC1的MAC和接收端口fa0/23存入自己的MAC緩存表,但是這時候又從fa0/24收到了這個廣播幀,SW1將PC1的MAC和對應(yīng)的fa0/24接口存入自己的MAC緩存表。3)SW2分別從自己的這兩個接口再將這個廣播幀發(fā)回給SW1,這樣PC1的MAC地址會不停的在兩臺交換機(jī)的fa0/23和fa0/24之間變動,MAC地址緩存表也不斷的被刷新,影響交換機(jī)的性能。
c.重復(fù)幀拷貝
冗余拓?fù)涑藭韽V播風(fēng)暴以及MAC地址的不穩(wěn)定,還會造成重復(fù)的幀拷貝:
1)假設(shè)PC1發(fā)送一個單播幀給PC3,這個單播幀到達(dá)SW1,假設(shè)SW1上還沒有PC3的MAC地址,根據(jù)交換機(jī)的原理,對未知單播幀進(jìn)行泛洪轉(zhuǎn)發(fā),即發(fā)往除接收端口外的所有其他端口(fa0/2、fa0/23、fa0/24)。2)SW2分從自己的fa0/23和fa0/24接收到這個單播幀,SW3知道PC3連接在自己的fa0/1接口上,所以SW1將這兩個單播幀都轉(zhuǎn)發(fā)給PC3。3)PC1只發(fā)送了一個單播幀,PC3卻收到了兩個單播幀,這會給某些網(wǎng)絡(luò)環(huán)境比如流量統(tǒng)計帶來不精確計算等問題。
0×2.STP介紹
基于冗余鏈路中存在的這些問題,STP被設(shè)計出來用來解決這些問題,下面介紹STP的工作原理。
a.STP算法
STP通過擁塞冗余路徑上的一些端口,確保到達(dá)任何目標(biāo)地址只有一條邏輯路徑,STP借用交換BPDU(Bridge Protocol Data Unit,橋接數(shù)據(jù)單元)來阻止環(huán)路,BPDU中包含BID(Bridge ID,橋ID)用來識別是哪臺計算機(jī)發(fā)出的BPDU。在STP運(yùn)行的情況下,雖然邏輯上沒有了環(huán)路,但是物理線上還是存在環(huán)路的,只是物理線路的一些端口被禁用以阻止環(huán)路的發(fā)生,如果正在使用的鏈路出現(xiàn)故障,STP重新計算,部分被禁用的端口重新啟用來提供冗余。
STP使用STA(Spanning Tree Algorithm,生成樹算法)來決定交換機(jī)上的哪些端口被堵塞用來阻止環(huán)路的發(fā)生,STA選擇一臺交換機(jī)作為根交換機(jī),稱作根橋(Root Bridge),以該交換機(jī)作為參考點(diǎn)計算所有路徑。
b.根交換機(jī)選舉
首先要知道什么是BID(Bridge ID,橋ID),因?yàn)楦粨Q機(jī)的選舉是基于BID的,BID由三部分組成——優(yōu)先級、發(fā)送交換機(jī)的MAC地址、Extended System ID(擴(kuò)展系統(tǒng)ID,可選項(xiàng));如下圖(圖2)所示:

在同一個廣播域中的所有交換機(jī)都參與選舉根交換機(jī),當(dāng)一臺交換機(jī)啟動時,它假設(shè)自己是根交換機(jī),并默認(rèn)每隔2秒發(fā)送一次"次優(yōu)BPDU"幀,BPDU幀中的Root ID(根交換機(jī)的BID)和本機(jī)的BID相同。在一個廣播域中的交換機(jī)互相轉(zhuǎn)發(fā)BPDU幀,并且從接收到的BPDU中讀取Root ID,如果讀取到的Root ID比本交換機(jī)的BID小,交換機(jī)更新Root ID為這個較小的Root ID,然后繼續(xù)轉(zhuǎn)發(fā)修改后的BPDU;如果接收的BPDU中的Root ID比本交換機(jī)的BID大,那么繼續(xù)將自己的BID作為Root ID向外發(fā)送BPDU,直到最后在同一個生成樹實(shí)例中擁有一致的Root ID,這個Root ID對應(yīng)了這個廣播域中某臺交換機(jī)的BID(并且這個BID一定是這個廣播域最小的),這臺交換機(jī)就被選作根交換機(jī)。
下面用一個實(shí)例來演示一下根交換機(jī)的選舉,在"Cisco Packet Tracer 6.2"中搭建下面的拓?fù)洌℅NS3+IOU環(huán)境同樣可以完成這個實(shí)驗(yàn),之所以用Cisco Packet Tracer是因?yàn)樗梢愿又庇^的看到哪個接口在STP的作用下被關(guān)閉了):

線連接好后等待幾十秒鐘,它們會自動選舉出根交換機(jī),使用下面的命令驗(yàn)證:
01
/*
02
- 在SW1上查看生成樹信息,因?yàn)镾W1、SW2、SW3上面都沒有劃分其他的VLAN,
03
- 所以默認(rèn)只有VLAN0001的生成樹信息。
04
05
"Spanning tree enabled protocol ieee"
,
06
- 表示交換機(jī)使用的生成樹協(xié)議是
"PVST+"
,這也是思科默認(rèn)的生成樹協(xié)議。
07
08
"Root ID"
后面是VLAN1中根交換機(jī)的BID參數(shù),
09
- Priority 32769,表示根交換機(jī)的優(yōu)先級是32769,
10
- Address是根交換機(jī)的MAC地址,
11
"This bridge is the root"
,表示當(dāng)前這臺交換機(jī)就是根交換機(jī)。
12
13
"Hello Time 2sec Max Age 20sec Forward Delay 15sec"
14
- BPDU發(fā)送間隔默認(rèn)2秒,最大存在時間是20秒,轉(zhuǎn)發(fā)延時是15秒。
15
16
"Bridge ID"
后面的參數(shù)是本交換機(jī)的BID參數(shù),
17
- 因?yàn)镾W1就是根交換機(jī),所以下面的參數(shù)和
"Root ID"
是一樣的,
18
- 其中
"priority 32768 sys-id-ext 1"
,表示SW1的優(yōu)先級是32768,
19
- Extended System ID是1,所以總優(yōu)先級就是32768+1=32769。
20
21
- 所以SW1的BID=SW1的優(yōu)先級+SW1的MAC地址=32769+0001.9681.2683
22
- 接下來查看SW2和SW3的生成樹信息,就會知道為什么SW1可以被選舉成根交換機(jī)了。
23
*/
24
SW1#
show
spanning-tree
25
VLAN0001
26
Spanning tree enabled protocol ieee
27
Root ID Priority 32769
28
Address 0001.9681.2683
29
This bridge is the root
30
Hello Time 2 ec Max Age 20sec Forward Delay 15sec
31
32
Bridge ID Priority 32769 (
priority
32768 sys-id-ext 1)
33
Address 0001.9681.2683
34
Hello Time 2sec Max Age 20sec Forward Delay 15sec
35
Aging Time 20
36
37
Interface Role Sts Cost Prio.Nbr Type
38
39
Fa0/1 Desg FWD 19 128.1 P2p
40
Fa0/2 Desg FWD 19 128.2 P2p
41
Fa0/3 Desg FWD 19 128.3 P2p
42
43
/*
44
- 查看SW2的生成樹信息,
45
46
- 可以看到SW2的BID中,優(yōu)先級是32769,和SW1相同,
47
- 但SW2的MAC地址是0030.A310.3975,大于SW1的MAC地址,
48
- 因?yàn)锽ID=優(yōu)先級+MAC地址,
49
- SW1的BID要小于SW2的BID,
50
- 所以SW1為根交換機(jī)。
51
*/
52
SW2#
show
spanning-tree
53
VLAN0001
54
Spanning tree enabled protocol ieee
55
56
/這里是根交換機(jī),也就是SW1的BID信息/
57
Root ID Priority 32769
58
Address 0001.9681.2683
59
Cost 19
60
Port 2(FastEthernet0/2)
61
Hello Time 2sec Max Age 20sec Forward Delay 15sec
62
63
/這里是SW2的BID/
64
Bridge ID Priority 32769 (
priority
32768 sys-id-ext 1)
65
Address 0030.A310.3975
66
Hello Time 2sec Max Age 20sec Forward Delay 15sec
67
Aging Time 20
68
69
/查看SW3的生成樹信息,優(yōu)先級相同,同樣是因?yàn)镸AC地址比SW1大/
70
SW3#
show
spanning-tree
71
VLAN0001
72
Spanning tree enabled protocol ieee
73
Root ID Priority 32769
74
Address 0001.9681.2683
75
Cost 19
76
Port 1(FastEthernet0/1)
77
Hello Time 2sec Max Age 20sec Forward Delay 15sec
78
79
Bridge ID Priority 32769 (
priority
32768 sys-id-ext 1)
80
Address 00E0.8F76.269C
81
Hello Time 2sec Max Age 20sec Forward Delay 15sec
82
Aging Time 20
通過這個實(shí)例,結(jié)合前面說的根交換機(jī)選舉原理,就能很容易的理解根交換機(jī)是如何在一個廣播域中被選舉出來的了。
上面這種情況是默認(rèn)連線后不做任何修改根交換機(jī)的選舉情況,可以通過下面的命令將某臺交換機(jī)的優(yōu)先級改小,或者設(shè)置成動態(tài)優(yōu)先級(即永遠(yuǎn)比其它交換機(jī)的優(yōu)先級小),這樣這臺擁有較小優(yōu)先級的交換機(jī)將成為根交換機(jī)。
結(jié)合上面的拓?fù)鋱D(圖3),將SW3的優(yōu)先級改小,從而達(dá)到手動指定一臺根交換機(jī)的目的:
01
/首先我隨便配置一個優(yōu)先級/
02
SW3(config)#
spanning-tree
vlan 1
priority
1000
03
04
/它提示我,只能是4096的倍數(shù),可以是下面的這些值/
05
% Bridge Priority must be in increments of 4096.
06
% Allowed values are:
07
0 4096 8192 12288 16384 20480 24576 28672
08
32768 36864 40960 45056 49152 53248 57344 61440
09
10
/*
11
- 本例設(shè)置成4096,注意設(shè)置針對的是VLAN1,
12
- 不同的VLAN優(yōu)先級可以不同,
13
- 不同VLAN的STP選舉出來的根交換機(jī)也可以不同,
14
- 比如SW3現(xiàn)在是VLAN1的根交換機(jī),
15
- 假設(shè)還存在一個VLAN2,并且在SW1上使用這條命令:
16
spanning-tree
vlan 2
priority
4096
17
- 那么SW1就將成為VLAN2的根交換機(jī),前提是VLAN2下有端口。
18
*/
19
SW3(config)#
spanning-tree
vlan 1
priority
4096
20
SW3(config)#
end
21
22
/過個一兩秒,查看SW3的生成樹信息,發(fā)現(xiàn)他已經(jīng)成為了根交換機(jī)。/
23
SW3#
show
spanning-tree
24
VLAN0001
25
Spanning tree enabled protocol ieee
26
Root ID Priority 4097
27
Address 00E0.8F76.269C
28
This bridge is the root
29
Hello Time 2sec Max Age 20sec Forward Delay 15sec
30
31
Bridge ID Priority 4097 (
priority
4096 sys-id-ext 1)
32
Address 00E0.8F76.269C
33
Hello Time 2sec Max Age 20sec Forward Delay 15sec
34
Aging Time 20
使用下面的命令可以讓交換機(jī)自動動態(tài)的調(diào)整自己的優(yōu)先級為整個廣播域最小,使用這條命令讓SW2成為vlan1的根交換機(jī):
01
/首先清除SW3上面手動配置的優(yōu)先級/
02
SW3(config)#
no
spanning-tree
vlan 1
priority
03
04
/在SW2上配置自動調(diào)整優(yōu)先級,讓SW2動態(tài)調(diào)整/
05
SW2(config)#
spanning-tree
vlan 1 root
primary
06
07
/等待幾秒鐘,查看SW2的生成樹信息,發(fā)現(xiàn)根交換機(jī)變成了自己/
08
SW2#
show
spanning-tree
09
VLAN0001
10
Spanning tree enabled protocol ieee
11
Root ID Priority 16385
12
Address 0030.A310.3975
13
This bridge is the root
c.端口花費(fèi)和路徑花費(fèi)
根交換機(jī)被選舉出來后,計算其他交換機(jī)到根交換機(jī)的花費(fèi),STA考慮兩種花費(fèi),端口花費(fèi)和路徑花費(fèi),路徑花費(fèi)是從根交換機(jī)出發(fā)到最終交換機(jī)前進(jìn)方向進(jìn)入的端口花費(fèi)總和,也就是說在上面的拓?fù)鋱D圖三中,假設(shè)SW1是根交換機(jī),想要改變SW3到根交換機(jī)SW1的花費(fèi),應(yīng)該在SW3的fa0/1來改變,而不是在SW1的fa0/3端口上改變。
如果一臺交換機(jī)有多條路徑到達(dá)根交換機(jī),這臺交換機(jī)會選擇路徑花費(fèi)最小的那條,下面是默認(rèn)的端口花費(fèi)參照表:

這個參照表只是端口默認(rèn)的花費(fèi),端口花費(fèi)是可以手動修改的,因?yàn)?Cisco Packet Tracer 6.2"不支持修改端口花費(fèi),修改端口花費(fèi)的實(shí)驗(yàn)使用GNS3來進(jìn)行,拓?fù)洌▓D5)如下:

01
IOU3#
show
spanning-tree
02
03
VLAN0001
04
Spanning tree enabled protocol ieee
05
Root ID Priority 32769
06
Address aabb.cc00.0100
07
/*
08
- 可以看到IOU3到根交換機(jī)的花費(fèi)是100,
09
- 這說明IOU3的e0/2接口速率是10Mb/s。
10
*/
11
Cost 100
12
Port 3 (Ethernet0/2)
嘗試修改IOU3的e0/2接口到根交換機(jī)的花費(fèi):
01
IOU3#
conf
t
02
/將IOU3的e0/2接口花費(fèi)改成300/
03
IOU3(config)#
int
e0/2
04
IOU3(config-if)#
spanning-tree
cost 300
05
IOU3(config-if)#
end
06
07
/*
08
- 再次查看IOU3的生成樹信息,發(fā)現(xiàn)花費(fèi)居然變成了200,
09
- 這是為什么呢?不是應(yīng)該為300嗎?
10
- 另外還發(fā)現(xiàn)下面的Port端口也發(fā)生了變化,
11
- 沒有修改前是e0/2,現(xiàn)在是e0/3,
12
- 這說明去往根交換機(jī)的數(shù)據(jù)是通過IOU3的e0/3發(fā)給IOU2再轉(zhuǎn)發(fā)給IOU1的,
13
- 這是因?yàn)槲覀儗OU3的e0/2的花費(fèi)修改成了300,
14
- 然而,通過IOU3的e0/3發(fā)給IOU2再轉(zhuǎn)發(fā)給IOU1的花費(fèi)只有200,
15
- 即IOU3的e0/3的默認(rèn)花費(fèi)100,加上IOU2的e0/0的默認(rèn)花費(fèi)100,
16
- 前面也提到了,交換機(jī)選取花費(fèi)最小的那條路徑去往根交換機(jī)。
17
*/
18
IOU3#
show
spanning-tree
19
20
VLAN0001
21
Spanning tree enabled protocol ieee
22
Root ID Priority 32769
23
Address aabb.cc00.0100
24
Cost 200
25
Port 4 (Ethernet0/3)
d.BPDU結(jié)構(gòu)淺析
前面提到的交換機(jī)之間通過轉(zhuǎn)發(fā)BPDU來選擇根交換機(jī),這里將BPDU幀的結(jié)構(gòu)簡單的介紹一下:

BPDU包含12個字段,如上圖所示,部分字段解釋如下:
Flags:標(biāo)記域,包含TC(Topology Change,拓?fù)涓淖儯┍忍匚唬琓CA(Topology Change Acknowledgment,拓?fù)涓淖兇_認(rèn))比特位。Root ID:包含了根交換機(jī)的BID。Cost of path:到根交換機(jī)的路徑花費(fèi)。Bridge ID:轉(zhuǎn)發(fā)BPDU的交換機(jī)的BID。Port ID:轉(zhuǎn)發(fā)BPDU的交換機(jī)的PID,PID等于端口優(yōu)先級(默認(rèn)128)加端口號,后面會介紹到。Message age:BPDU已經(jīng)存在的時間。Max age:BPDU最大存在時間。Hello time:根交換機(jī)發(fā)送配置信息的間隔時間,默認(rèn)2秒。Forward Delay:轉(zhuǎn)發(fā)延時,默認(rèn)15秒。
e.STP端口角色
1)根端口(Root Port,RP):每個非根交換機(jī)上有且僅有一個根端口,稍后的生成樹選舉中會詳細(xì)介紹根端口的選舉過程。
2)指派端口(Designated Port,DP):網(wǎng)絡(luò)上除根端口外,所有允許轉(zhuǎn)發(fā)流量的端口,每個網(wǎng)段都有一個指派端口,根交換機(jī)上的端口都是指派端口。
3)非指派端口:既不是根端口也不是指派端口,這種端口雖然是激活的但是會被堵塞(Blocking)用來阻止環(huán)路,根端口和指派端口都處于轉(zhuǎn)發(fā)(Forwarding)狀態(tài)。
4)禁用端口:被管理員使用"shutdown"命令關(guān)閉的端口稱作禁用端口,禁用端口不參與生成樹算法。
f.端口狀態(tài)和BPDU時間
互連交換機(jī)通過在一個廣播域交換BPDU幀構(gòu)建一個邏輯上無環(huán)的路徑,當(dāng)一臺交換機(jī)啟動后,如果一個交換機(jī)端口直接轉(zhuǎn)換到轉(zhuǎn)發(fā)狀態(tài)可能會造成暫時性的環(huán)路。為了使用這個邏輯生成樹,交換機(jī)需要在五種狀態(tài)間轉(zhuǎn)換,轉(zhuǎn)換會歷經(jīng)三種BPDU時間。
下面是STP中的五種端口狀態(tài):
1)Down(禁用)狀態(tài),可以使用"no shutdown"命令和插入網(wǎng)線來激活。2)Blocking(阻塞)狀態(tài),鏈路激活后轉(zhuǎn)入阻塞狀態(tài),這個狀態(tài)大約停留20秒,主要用來確定該端口的角色;如果判斷出該端口是非指派端口,則將保持在這一狀態(tài),即阻塞,如果處在阻塞狀態(tài)的端口接收不到BPDU了,也會轉(zhuǎn)入下一狀態(tài);如果判斷出是其他端口角色,則轉(zhuǎn)入下一狀態(tài)。3)Listening(偵聽)狀態(tài),這個狀態(tài)大約停留15秒,除了接收BPDU外,還向鄰居發(fā)送BPDU,通知鄰居它將參與激活拓?fù)洹?)Learning(學(xué)習(xí))狀態(tài),大約停留15秒,開始學(xué)習(xí)MAC地址。5)Forwarding(轉(zhuǎn)發(fā))狀態(tài),端口可以轉(zhuǎn)發(fā)數(shù)據(jù)幀。
BPDU的時間有三種:Hello Time、Max Age、Forward Delay;
1)Hello時間控制了發(fā)送配置BPDU的時間間隔,默認(rèn)2秒。這是根交換機(jī)生成BPDU并向非根交換機(jī)發(fā)送的間隔。2)非根交換機(jī)接收到根交換機(jī)發(fā)送來的BPDU,再從除接收端口以外的其他端口轉(zhuǎn)發(fā)出去,如果在2-20秒里面由于網(wǎng)絡(luò)故障沒有新的BPDU從根交換機(jī)發(fā)送過來,非根交換機(jī)將停止向外發(fā)送從根交換機(jī)接收到的BPDU。如果這種情況持續(xù)20秒,也就是最大存活期,非根交換機(jī)就使原儲存的BPDU無效,并開始尋找新的根端口。所謂最大存活期就是非根交換機(jī)丟棄BPDU前用來備份儲存它的時間。3)轉(zhuǎn)發(fā)延時是交換機(jī)在偵聽狀態(tài)到學(xué)習(xí)狀態(tài)所花的時間,默認(rèn)是15秒。
從上面的敘述中我們可能會發(fā)現(xiàn),一臺啟動STP的交換機(jī),每個端口從UP到Forwarding所需的時間大約是50秒左右,而普通的二層交換機(jī)端口UP到Forwarding瞬間就能完成。這會帶來一個問題,那就是如果這臺啟動STP的交換機(jī)的接口連接的是一個終端設(shè)備,比如計算機(jī),那么端口加電啟動后計算機(jī)就要等上50秒才能發(fā)送數(shù)據(jù),這很不合理,可以使用下面的命令將支持STP的交換機(jī)與終端相連的端口設(shè)置成快速端口,這樣端口從UP到Forwarding也能一瞬間完成了。但要注意,僅在連接計算機(jī)的端口上使用快速端口的功能,不要在和其他交換機(jī),集線器網(wǎng)橋相連的端口上使用這個功能,否則很容易造成環(huán)路。
1
/假設(shè)這臺交換機(jī)的fa0/1到10口都連接的是計算機(jī)/
2
Switch(config)#
int
range fa 0/1 - 10
3
Switch(config-if-range)#
spanning-tree
portfast
0×3.STP收斂
STP的收斂就是整個網(wǎng)絡(luò)達(dá)到穩(wěn)定的狀態(tài),選舉出了根交換機(jī),并決定出所有端口的角色,排除所有的潛在環(huán)路。
a.生成樹的選舉
這一小節(jié)是這篇文章最重要的部分,上面的所有理論都會在這一小節(jié)得到解釋和應(yīng)用,STP最終收斂成為一個沒有環(huán)路的網(wǎng)絡(luò)需要滿足下面四點(diǎn):
每個廣播域只能有一個根交換機(jī)。每個非根交換機(jī)有且只有一個根端口。每個網(wǎng)段有且只能有一個指派端口。既不是根端口也不是指派端口的端口會被阻塞。
下面來看看生成樹的選舉過程,一共分為四步:
1)選舉根交換機(jī)
交換機(jī)之間通過發(fā)送BPDU來選舉根交換機(jī),擁有最小BID的交換機(jī)將成為根交換機(jī),每個廣播域只能有一個根交換機(jī)。
2)選舉根端口
每個非根交換機(jī)有且只有一個根端口,選舉根端口依照下面的順序:
首先,最低花費(fèi)的端口將成為根端口;在花費(fèi)相同的情況下比較發(fā)送者的BID,BID小的將成為根端口,請看下面這張拓?fù)鋱D;

圖中SW1被選舉成根交換機(jī),交換機(jī)之間的鏈路都是100Mb/s,所以SW2的根端口是SW2的fa0/2接口,SW3的根端口是SW3的fa0/1接口,因?yàn)樗麄儚倪@個接口去根交換機(jī)的花費(fèi)都是19,小于通過SW4去根交換機(jī)的花費(fèi)。那么SW4的根端口是哪個呢?不論從自己的哪個接口去往根交換機(jī)(經(jīng)過SW2或SW3),花費(fèi)都是一樣(38),所以在花費(fèi)相同的情況下比較發(fā)送者的BID,也就是比較SW2和SW3的BID,顯然SW2的BID(32768+2222.2222.2222)小于SW3的BID(32768+3333.3333.3333),所以SW4將自己和SW2相連的接口fa0/4選舉成為根端口。
在發(fā)送者BID相同的情況下,比較發(fā)送者的PID,請看下面這張圖:

假設(shè)此時在SW1上查看生成樹信息:
1
SW1#
show
spanning-tree
2
/*
3
- 這一部分信息就是SW1上面的端口信息,其中Prio下面的就是端口ID,
4
- 可以看到SW1的fa0/1默認(rèn)端口ID是128.1,小于fa0/2的端口ID。
5
*/
6
Interface Role Sts Cost Prio.Nbr Type
7
8
Fa0/1 Desg FWD 19 128.1 P2p
9
Fa0/2 Desg FWD 19 128.2 P2p
從輸出可以看到,SW1上面的fa0/1擁有較小的端口ID,它對應(yīng)了SW2的fa0/2端口,所以SW2的fa0/2端口被選舉成為根端口。
如果發(fā)送者的PID也相同,那么比較接收者的PID,看下面這種情況:

上圖中,SW1的fa0/1連接在一臺集線器上,SW2的fa0/1和fa0/2也連接在這臺集線器上,線路均為100Mb/s,假設(shè)SW1擁有較小的BID被選舉成根交換機(jī),SW2現(xiàn)在要選舉根端口,首先根據(jù)前面說的,比較花費(fèi),SW2從兩個端口到根交換機(jī)SW1的花費(fèi)都相同;然后SW2比較發(fā)送者BID,發(fā)送者(SW1)的BID也相同;SW2再比較發(fā)送者PID,發(fā)現(xiàn)發(fā)送者PID也相同(都為SW1的fa0/1端口);這個時候,SW2比較接收者,也就是自己的PID,將自己PID最小的那個端口選舉成根端口。
可以根據(jù)SW2的生成樹信息輸出判斷,fa0/1擁有更小的PID,所以它被選舉成為根端口:
01
SW2#
show
spanning-tree
02
/*
03
- 下面這一部分可以看到fa0/1擁有更小的PID 128.1,
04
- Root FWD 表示這個端口被選舉成為了根端口,并且狀態(tài)是轉(zhuǎn)發(fā),
05
- Altn BLK 表示這個端口既不是根端口也不是指派端口,被阻塞。
06
*/
07
Interface Role Sts Cost Prio.Nbr Type
08
09
Fa0/1 Root FWD 19 128.1 Shr
10
Fa0/2 Altn BLK 19 128.2 Shr
11
12
/*
13
- 這里補(bǔ)充一個知識點(diǎn),端口的優(yōu)先級默認(rèn)為128,
14
- 而這個端口優(yōu)先級是可以手動修改的,
15
- 可以將fa0/2的優(yōu)先級通過下面的命令改成100,
16
- STP重新收斂后,F(xiàn)a0/1將被阻塞,F(xiàn)a0/2將被選舉成為根端口,
17
- 端口優(yōu)先級的取值范圍一般為0-192或0-255,
18
- Cisco Packet Tracer中不支持這一條命令,可以在GNS3中測試。
19
*/
20
SW2(config)#
int
fa 0/2
21
SW2(config-if)#
spanning-tree
port-
priority
100
22
/在GNS3+IOU環(huán)境中,重新調(diào)整端口優(yōu)先級后需要手動觸發(fā)一次根交換機(jī)的選舉才能讓端口改變狀態(tài),比如手動在根交換機(jī)上配置一個較小的優(yōu)先級/
到這里,選舉根端口的全部可能性都講解完了。下面講解指派端口的選舉。
3)選舉指派端口
每個網(wǎng)段有且只有一個指派端口。其實(shí),每個網(wǎng)段都有一個指派交換機(jī),指派交換機(jī)上如果有多個端口,再從多個端口中選舉出一個成為指派端口,指派端口的選舉依照下面的順序:
比較花費(fèi);

上圖中,假設(shè)SW1被選舉成了根交換機(jī),因?yàn)槊總€網(wǎng)段都有一個指派端口,在SW1和SW3相連的線路上,由于SW1本身是根交換機(jī),SW1的fa0/1端口到自己的花費(fèi)是0,所以SW1的fa0/1接口被選舉成指派端口(根交換機(jī)上的所有端口都是指派端口);同理在SW1和SW2相連的網(wǎng)段上,SW1的fa0/2也被選舉成了指派端口;而在SW2和SW3相連的網(wǎng)段上,由于SW1和SW2之間是1Gb/s鏈路,SW2去往根交換機(jī)的花費(fèi)(4)要小于SW3去往根交換的花費(fèi)(19),所以SW2是這個網(wǎng)段上的指派交換機(jī),SW2的fa0/3將成為這個網(wǎng)段的指派端口。再根據(jù)前面的根端口的選舉可以知道SW2的fa0/2是根端口,SW3的fa0/1是根端口,SW3的fa0/3端口因?yàn)椴皇歉丝冢膊皇侵概啥丝冢员蛔枞?br> 花費(fèi)相同則比較接收者的BID(這次不是發(fā)送者了);

接收者的BID也相同則比較接收者的PID;

01
SW2#
show
spanning-tree
02
VLAN0001
03
Spanning tree enabled protocol ieee
04
Root ID Priority 24577
05
Address 0090.21DE.9A5B
06
Cost 19
07
Port 2(FastEthernet0/2)
08
Hello Time 2sec Max Age 20sec Forward Delay 15sec
09
10
Bridge ID Priority 32769 (
priority
32768 sys-id-ext 1)
11
Address 0004.9A05.9A31
12
Hello Time 2sec Max Age 20sec Forward Delay 15sec
13
Aging Time 20
14
15
Interfac Role Sts Cost Prio.Nbr Type
16
17
Fa0/2 Root FWD 19 128.2 P2p
18
Fa0/3 Desg FWD 19 128.3 Shr
19
Fa0/4 Altn BLK 19 128.4 Shr
20
/可以看到默認(rèn)的PID fa0/3比fa0/4小,所以fa0/4被阻塞,fa0/3是指派端口/
4)阻塞端口
既不是根端口也不是指派端口的端口將被阻塞。
b.STP拓?fù)渥兓?br>
當(dāng)交換機(jī)檢測到端口發(fā)生了變化時,交換機(jī)將通知根交換機(jī)拓?fù)渥兓闆r,根交換機(jī)再將這一情況擴(kuò)散到整個網(wǎng)絡(luò),有三種特殊的BPDU用來完成這些工作:TCN(Topology Change Notification)BPDU-拓?fù)涓淖兺ㄖ狟PDU、TCA(Topology Change Acknowledgement)BPDU-拓?fù)涓淖兇_認(rèn)BPDU、TC(Topology Change)BPDU,下圖演示了這一過程;

上圖中,左邊SW5首先檢測到了拓?fù)渥兓鼜母丝谙騍W2發(fā)送TCN,SW2使用TCA向SW5確認(rèn),然后SW2產(chǎn)生一個TCN從自己的根端口發(fā)送給SW1,也就是根交換機(jī),根交換機(jī)SW1收到這個TCN后,使用TCA向SW2確認(rèn)。一旦根交換機(jī)知道了這一拓?fù)渥兓鼘⑾蛲鈴V播發(fā)送TC位被設(shè)置的BPDU,就是上圖右邊的情況,最后整個廣播域都知道了這一變化。
0×4.STP負(fù)載均衡實(shí)驗(yàn)
實(shí)驗(yàn)在GNS3+IOU環(huán)境中完成,下圖中IOU1-2是運(yùn)行在IOU虛擬機(jī)中的兩臺交換機(jī),接口連線如圖所示:

01
/首先將IOU1和IOU2相連的兩條線路配置成主干/
02
IOU1#
conf
t
03
IOU1(config)#
int
e0/0
04
IOU1(config-if)#
swi
mod
tr
05
IOU1(config-if)#
swi
tr enc dot
06
IOU1(config-if)#
swi
tr all vl all
07
IOU1(config-if)#
int
e0/1
08
IOU1(config-if)#
swi
mod
tr
09
IOU1(config-if)#
swi
tr enc dot
10
IOU1(config-if)#
swi
tr all vl all
11
IOU1(config-if)#
exit
12
13
IOU2#
conf
t
14
IOU2(config)#
int
e0/0
15
IOU2(config-if)#
swi
mod
tr
16
IOU2(config-if)#
swi
tr enc dot
17
IOU2(config-if)#
swi
tr all vl all
18
IOU2(config-if)#
int
e0/1
19
IOU2(config-if)#
swi
mod
tr
20
IOU2(config-if)#
swi
tr enc dot
21
IOU2(config-if)#
swi
tr all vl all
22
IOU2(config-if)#
exit
23
24
/將IOU1配置成VTP Server,IOU2配置成VTP Client/
25
IOU1(config)#
vtp
mode
server
26
IOU1(config)#
vtp
domain www.qingsword.com
27
IOU1(config)#
vtp
version
2
28
IOU1(config)#
vtp
pass
123456
29
30
IOU2(config)#
vtp
mod
cl
31
IOU2(config)#
vtp
do www.qingsword.com
32
IOU2(config)#
vtp
pass
123456
33
34
/在VTP Server上增加Vlan2/
35
IOU1(config)#vlan 2
36
IOU1(config-vlan)#name vlan2
37
IOU1(config-vlan)#
exit
38
39
/確保IOU2學(xué)習(xí)到了這個Vlan2后,將IOU1配置成Vlan1的根交換機(jī),將IOU2配置成Vlan2的根交換機(jī)/
40
IOU1(config)#
spanning-tree
vlan 1 root
primary
41
42
IOU2(config)#
spanning-tree
vlan 2 root
primary
43
44
/*
45
- 根據(jù)前面介紹的STP收斂,
46
- 可以分析出哪些端口會被阻塞,
47
- 因?yàn)樗伎平粨Q機(jī)默認(rèn)使用的STP協(xié)議為PVST+,
48
- 這種協(xié)議為每一個VLAN生成一個生成樹。
49
*/
50
IOU1#
show
spanning-tree
51
/VLAN1的生成樹,在本實(shí)例中IOU1是Vlan1的根交換機(jī)/
52
VLAN0001
53
Spanning tree enabled protocol ieee
54
Root ID Priority 24577
55
Address aabb.cc00.0100
56
This bridge is the root
57
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
58
59
Bridge ID Priority 24577 (
priority
24576 sys-id-ext 1)
60
Address aabb.cc00.0100
61
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
62
Aging Time 300 sec
63
64
Interface Role Sts Cost Prio.Nbr Type
65
66
Et0/0 Desg FWD 100 128.1 Shr
67
Et0/1 Desg FWD 100 128.2 Shr
68
69
/這里是VLAN2的生成樹,IOU2是根交換機(jī)/
70
VLAN0002
71
Spanning tree enabled protocol ieee
72
Root ID Priority 24578
73
Address aabb.cc00.0200
74
Cost 100
75
Port 2 (Ethernet0/1)
76
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
77
78
Bridge ID Priority 32770 (
priority
32768 sys-id-ext 2)
79
Address aabb.cc00.0100
80
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
81
Aging Time 300 sec
82
83
/IOU1的e0/0端口在VLAN2生成樹實(shí)例中被阻塞/
84
Interface Role Sts Cost Prio.Nbr Type
85
86
Et0/0 Altn BLK 100 128.1 Shr
87
Et0/1 Root FWD 100 128.2 Shr
這樣就實(shí)現(xiàn)了VLAN的負(fù)載均衡和冗余備份;線路沒有故障前VLAN1的數(shù)據(jù)從下面的路徑走,VLAN2的數(shù)據(jù)從上面的路徑走,當(dāng)任意一條路徑出現(xiàn)故障的時候,STP重新收斂,剩下的那條線路將承擔(dān)VLAN1和VLAN2的全部流量。