1. STP協議和二層環路
在企業局域網絡中使用冗餘鏈路會帶來環路的風險,導致廣播風暴,MAC地址表震盪等各種問題,影響網絡的穩定性,好在STP(生成樹協議)協議解決了這個問題,總之STP協議可以解決冗餘鏈路帶來的環路問題,並且當交換機的某一條鏈路發生故障時,可以迅速切換到備用鏈路,保證網絡的可靠穩定性。
STP協議定義了三種端口角色:根端口(RP),指定端口(DP),非指定端口(NDP,也稱阻塞端口);同時STP協議也是基於這三種端口角色來保證當前網絡中沒有環路:
- 先選舉根橋
- 然後選舉根端口
- 再選舉指定端口
2. STP協議的選舉過程
什麼是根橋?說通俗點根橋其實就是一個交換機。
STP協議是通過構造一顆生成樹來解決網絡中的環路問題的,在每個STP網絡中都會存在一個根橋交換機,其他的則爲非根橋交換機,並且每個交換機都有一個橋ID(BID),這個BID由網橋優先級和MAC地址組成,網橋優先級是可以配置的,其範圍是0 - 65535,默認值爲32768,數值越小說明優先級越高,網橋優先級最高的交換機會被選舉爲根橋交換機,如果優先級相同,則會比較MAC地址,MAC地址越小的優先級越高,總結稱一句話就是:根橋交換機的選舉主要是依據橋ID和MAC地址(越小越優先)。
在上圖中SW1交換機的橋ID是1024,並且該橋ID在當前網絡中是最小的,那麼根據選舉根橋的規則直接選舉SW1交換機爲根橋,SW3爲備根,SW2爲非根。
STP協議除了要選舉根橋外,還要選舉端口:
根端口(RP):離根橋交換機最近的非根交換機的端口,並且每個非根交換機最多隻有一個根端口,用於接收BPUD分組。
指定端口(DP):每條鏈路上必須且只有一個指定端口,並且離根橋交換機最近,用於發送BPDU分組。
非指定端口(NDP):每個網絡拓撲必須要有一個非指定端口,用於阻塞數據防止環路。
端口的選舉主要依據以下幾個參數(所有參數值都是越小越優先):
- 先選舉Cost值最短(到根)
- 再選舉BID最小
- 在選舉鄰居PID最小
現在根據端口的選舉規則分別選舉出根端口,指定端口,非指定端口,如下圖所示:
有同學可能會疑惑爲什麼要選舉根橋和端口?由於STP協議通過構造一棵生成樹來解決網絡的環路問題,作爲根橋是要發送BPDU分組,其他設備也要接收BPDU分組,以此來維護整個生成樹網絡,這就需要通過選舉端口來決定誰來收發BPDU分組了。
1. 首先是選舉DP端口,由於根橋要發送BPDU分組,那麼根據DP端口的定義和選舉規則,SW1交換機的f0/0和f0/1都選舉爲DP端口,用於發送BPDU分組。
2. 其次是選舉RP端口,一般來講,發送BPDU分組的對面就是接收BPDU分組的,所以SW2交換機的f0/0和SW3交換機的f0/0就是RP端口,用於接收BPDU分組。
3. 最後還要從SW2的f0/1到SW3的f0/1這條鏈路中分別選舉出DP端口和NDP口,還是根據端口的選舉規則,因爲這條鏈路上的端口Cost值一樣,所以無法參考Cost值來選舉端口。需要根據BID來選舉DP,由於SW3交換機的f0/1口的BID優先級更高,那麼SW3交換機的f0/1口選舉爲DP口,那麼SW2的f0/1口就是NDP口了,用於阻塞數據分組防止環路。
總結一下STP選舉的規則:
- 一般先選舉根橋,並且根橋的所有接口都是DP(因爲根橋的接口離本身最近)
- 一般DP的對面就是RP(因爲DP用於發送BPDU分組,而RP是用於接收BPDU分組)
- 選舉流程:
- 先選舉根橋
- 再選舉DP和RP
- 最後選NDP(阻塞端口)
3. 實驗——部署STP協議
STP協議也是基於Trunk鏈路的,在部署STP協議之前,所有交換機的鏈路必須設置爲Trunk模式。
另外,思科的設備爲防止環路默認情況下都開啓了STP協議,但在工程環境下是非常不推薦使用默認的STP協議,因爲默認的STP協議在選舉端口時會隨機選舉一個端口爲阻塞端口,特別是在一個大型企業網絡中,如果默認的STP協議在匯聚層的設備上隨機選舉了一個阻塞端口,就有可能會造成大面積的網絡故障。
所有鏈路設置爲Trunk模式,略過......
配置交換機的BID,SW1爲根橋,SW2爲備根,SW3爲非根:
SW1(config)#spanning-tree vlan 1 priority 0
SW2(config)#spanning-tree vlan 1 priority 1024
SW3(config)#spanning-tree vlan 1 priority 4096
show命令查看根橋SW1交換機的STP信息:
SW1#show spanning-tree vlan 1 brief
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 0
Address cc01.08c8.0000
This bridge is the root
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 0
Address cc01.08c8.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300
//主要關注Sts字段(端口的狀態)
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet0/0 128.1 128 19 FWD 0 0 cc01.08c8.0000 128.1
FastEthernet0/1 128.2 128 19 FWD 0 0 cc01.08c8.0000 128.2
SW1#
STP協議的比較重要的幾個字段:
This bridge is the root:這句話說明,SW1交換機自己就是根橋設備。
Sts:Sts字段表示端口的狀態,一般有FWD和BLK兩種狀態,FWD表示轉發狀態(Sts字段很重要)。
Hello Time:表示hello分組的更新週期爲2秒,生命週期爲20秒,轉發延遲爲15秒
Address:MAC地址
Port ID:表示PID,越小越優先,端口的優先級默認是128,其範圍是0 ~ 255。
從上面給出的STP協議信息可以看出,SW1交換機已經選舉爲根橋了,同時SW1所有的端口都處於FWD狀態(轉發狀態)。
show命令查看根橋SW2交換機的STP信息:
SW2#show spanning-tree vlan 1 brief
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 0
Address cc01.08c8.0000 //根橋的MAC地址
Cost 19
Port 1 (FastEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 1024
Address cc02.1c80.0000 //自己的MAC地址
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet0/0 128.1 128 19 FWD 0 0 cc01.08c8.0000 128.1
FastEthernet0/1 128.2 128 19 FWD 19 1024 cc02.1c80.0000 128.2
Cost字段:備根到根橋的Cost值(所花費的開銷)。
我們可以看到SW2交換機所有的接口處於轉發狀態(FWD狀態)。
show命令查看根橋SW3交換機的STP信息:
SW3#show spanning-tree vlan 1 brief
VLAN1
Spanning tree enabled protocol ieee
Root ID Priority 0
Address cc01.08c8.0000
Cost 19
Port 1 (FastEthernet0/0)
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Bridge ID Priority 4096
Address cc03.2f4c.0000
Hello Time 2 sec Max Age 20 sec Forward Delay 15 sec
Aging Time 300
Interface Designated
Name Port ID Prio Cost Sts Cost Bridge ID Port ID
-------------------- ------- ---- ----- --- ----- -------------------- -------
FastEthernet0/0 128.1 128 19 FWD 0 0 cc01.08c8.0000 128.2
FastEthernet0/1 128.2 128 19 BLK 19 1024 cc02.1c80.0000 128.2
SW3#
重點關注Sts字段,SW3交換機的優先級是4096,並且SW3的f0/1口是處於BLK狀態(阻塞),該端口用於防止環路。
接下來設置SW1交換機爲主根,配置如下:
SW1(config)#spanning-tree vlan 1 root primary
//這句話的意思是SW1設備已經設置爲主根了
% This switch is already the root of VLAN1 spanning tree
//優先級是0
VLAN 1 bridge priority unchanged at 0
VLAN 1 bridge max aging time unchanged at 20
VLAN 1 bridge hello time unchanged at 2
VLAN 1 bridge forward delay unchanged at 15
SW1(config)#
SW2交換機爲備根,配置如下:
SW2(config)#spanning-tree vlan 1 root secondary
VLAN 1 bridge priority set to 16384
VLAN 1 bridge max aging time unchanged at 20
VLAN 1 bridge hello time unchanged at 2
VLAN 1 bridge forward delay unchanged at 15
SW2(config)#
原先自定義設置爲SW2的優先級爲1024的,但是設置SW2爲備根後,優先級變成16384了。
下面的內容是作爲補充的。
進入接口配置模式下,可以修改鏈路的Cost(開銷)值和端口的優先級,配置如下:
//修改端口的Cost值
SW1(config-if)#spanning-tree cost ?
<1-65535> Change an interface's spanning tree path cost
//修改端口的優先級
SW1(config-if)#spanning-tree port-priority ?
<0-255> Change an interface's spanning tree priority