STP 生成樹協議
在交換機之間配置冗余鏈路是很好的做法,因為一旦某個鏈路出現了故障,冗余鏈路可以防止整個網絡的崩潰。但是網絡傳播的數據幀會在所有冗余鏈路上同時被泛洪開來,這會導致網絡環路和從而導致如下的問題:
- MAC 數據庫不穩定:當出現環路時,交換機的 MAC 地址表可能會使用廣播幀不斷更新;
- 廣播風暴:由於廣播流量是從交換機的每個端口轉發出去,所有相連的設備都必須處理環路網絡中洪泛的廣播流量;
- 幀的多重傳輸:單播幀的多個副本傳送到相同的目的站點。
路由選擇協議可以防止在網絡層形成網絡環路,然而對於因交換機之間形成的環路無能為力。生成樹協議 STP 可以防止在第 2 層交換式網絡中形成環路,STP 會特意阻塞可能導致環路的冗余路徑,以確保網絡中所有目的地之間只有一條邏輯路徑。端口處於阻塞狀態時,用戶數據將無法進入或流出該端口。不過,STP 用來防止環路的 BPDU(網橋協議數據單元)幀仍可繼續通行。一旦需要啟用此類路徑來抵消網絡電纜或交換機故障的影響,STP 就會重新計算路徑,將必要的端口解除阻塞,使冗余路徑進入活動狀態。
根網橋
以下是 STP 協議的一些術語:
- 根橋:根橋是指擁有最佳橋 ID 的網橋,網絡中所有其他決策都需要基於與根橋的關系進行選擇。
- BPDU:指網絡中所有交換機都需要相互交換的、用於根交換機選舉的信息。
- 橋 ID:STP 使用橋 ID 跟蹤網絡中的所有交換機,由橋優先級和橋MAC地址共同決定。
- 非根橋:除了根橋外的所有網橋,非根橋會與所有的網橋交換 BPDU,更新 STP 拓撲數據庫以防止環路。
- 端口開銷:存在多條鏈路時,端口開銷用於確定最佳路徑,取決於鏈路的帶寬。
具有最低 BID 的交換機將作為根網橋,一開始所有交換機自稱為根網橋,最終交換機互相交換 BPDU 達成一致。具體而言,每台交換機都會將包含其 BID 和根 ID 的 BPDU 幀轉發到廣播域中的鄰接交換機。接收方交換機將其當前根 ID 與接收到的幀中標識的根 ID 進行比較。如果接收到的根 ID 較小,則接收方交換機使用較小的根 ID 更新其根 ID,然后將含有較小根 ID 的新 BPDU 幀轉發給其他鄰接交換機,最終具有最小 BID 的交換機被確定為生成樹實例的根網橋。
為生成樹實例選出根網橋后,STA 便開始確定到根網橋的最佳路徑。交換機發送 BPDU 包括根路徑開銷,算法是將從交換機到根網橋的路徑上沿途的每個端口開銷加在一起。端口開銷由端口的運行速度決定:
鏈路速度 | 開銷 |
---|---|
10 Gbit/s | 2 |
1 Gbit/s | 4 |
100 Mbit/s | 19 |
10 Mbit/s | 100 |
端口角色
STA 確定到每台交換機的最佳路徑之后,會為相關交換機端口分配端口角色。端口角色描述了網絡中端口與根網橋的關系,以及端口是否能轉發流量。
端口角色 | 說明 |
---|---|
根端口 | 在所有非根網橋交換機上最接近根網橋的交換機端口 |
指定端口 | 允許轉發流量的非根端口,若網段的一端是根端口則另一端是指定端口,根網橋上的所有端口都是指定端口 |
替代端口和備用端口 | 替代端口和備用端口處於丟棄或阻塞模式 |
禁用端口 | 禁用端口是關閉的交換機端口 |
端口狀態
交換機完成啟動后,生成樹便立即確定。如果交換機端口直接從阻塞狀態轉換到轉發狀態,而轉換過程中沒有關於完整拓撲的信息,那么端口會臨時形成數據環路。為此 STP引入了 5 種端口狀態:
端口狀態 | 說明 |
---|---|
阻塞狀態 | 該端口是替代端口,不參與幀轉發 |
偵聽狀態 | 偵聽到根網橋的路徑 |
學習狀態 | 學習 MAC 地址,填充 MAC 地址表 |
轉發狀態 | 轉發數據幀並且發送和接收BPDU幀 |
禁用狀態 | 端口不參與生成樹,不會轉發幀 |
PVST+ 和快速 PVST+
最初的 802.1D 標准定義 STP 協議整個交換網絡只有一個生成樹實例,它有着如下 2 個缺點:
- 無法進行負載共享,一條上行鏈路必須阻塞所有 VLAN。
- CPU 閑置,只需要計算一個生成樹實例,計算該實例后 CPU 閑置。
思科開發了 PVST+,使得交換機上的一個中繼端口可以阻止某個 VLAN 並轉發其他 VLAN,以此實施第 2 層負載均衡。與傳統 STP 相比,PVST+ 環境中的交換機需要消耗更多的 CPU 進程和 BPDU帶寬,這是因為 PVST+ 將為每個 VLAN 運行一個單獨的
STP 實例。
快速 PVST+ 的工作方式和 PVST+ 差不多,不同在於快速 PVST+ 定義的端口狀態包括 3 種:丟棄、學習和轉發。如果端口被配置為替代端口或備用端口,則該端口可以立即轉換到轉發狀態,而無須等待網絡收斂。
配置 PVST+ 和快速 PVST+
實驗拓撲
地址分配表
設備 | 接口 | IP 地址 | 子網掩碼 | 默認網關 |
---|---|---|---|---|
S1 | VLAN 99 | 172.31.99.1 | 255.255.255.0 | 不適用 |
S2 | VLAN 99 | 172.31.99.2 | 255.255.255.0 | 不適用 |
S3 | VLAN 99 | 172.31.99.3 | 255.255.255.0 | 不適用 |
PC1 | NIC | 172.31.10.21 | 255.255.255.0 | 172.31.10.254 |
PC2 | NIC | 172.31.20.22 | 255.255.255.0 | 172.31.20.254 |
PC3 | NIC | 172.31.30.23 | 255.255.255.0 | 172.31.30.254 |
交換機端口分配
端口 | 作業 | 網絡 |
---|---|---|
S1 F0/6 | VLAN 30 | 172.17.30.0/24 |
S2 F0/18 | VLAN 20 | 172.17.20.0/24 |
S3 F0/11 | VLAN 10 | 172.17.10.0/24 |
配置 VLAN
使用相應的命令,在所有交換機上創建 VLAN 10、20、30、40、50、60、70、80 和 99。
S1(config)# vlan 10
S1(config-vlan)# vlan 20
S1(config-vlan)# vlan 30
S1(config-vlan)# vlan 40
S1(config-vlan)# vlan 50
S1(config-vlan)# vlan 60
S1(config-vlan)# vlan 70
S1(config-vlan)# vlan 80
S1(config-vlan)# vlan 99
S2(config)# vlan 10
S2(config-vlan)# vlan 20
S2(config-vlan)# vlan 30
S2(config-vlan)# vlan 40
S2(config-vlan)# vlan 50
S2(config-vlan)# vlan 60
S2(config-vlan)# vlan 70
S2(config-vlan)# vlan 80
S2(config-vlan)# vlan 99
S3(config)# vlan 10
S3(config-vlan)# vlan 20
S3(config-vlan)# vlan 30
S3(config-vlan)# vlan 40
S3(config-vlan)# vlan 50
S3(config-vlan)# vlan 60
S3(config-vlan)# vlan 70
S3(config-vlan)# vlan 80
S3(config-vlan)# vlan 99
為交換機端口分配 VLAN,進入對應的接口配置為接入模式划分 vlan。
S1(config)# interface f0/6
S1(config-if)# switchport mode access
S1(config-if)# switchport access vlan 30
S1(config-if)# no shutdown
S2(config)# interface f0/18
S2(config-if)# switchport mode access
S2(config-if)# switchport access vlan 20
S3(config-if)# no shutdown
S3(config)# interface f0/11
S3(config-if)# switchport mode access
S3(config-if)# switchport access vlan 10
S3(config-if)# no shutdown
使用相應的命令將每台交換機上的端口 F0/1 至 F0/4 配置為中繼端口,並將這些中繼端口分配給本地 VLAN 99。
S1(config)# interface range f0/1-4
S1(config-if-range)# switchport mode trunk
S1(config-if-range)# switchport trunk native vlan 99
S2(config)# interface range f0/1-4
S2(config-if-range)# switchport mode trunk
S2(config-if-range)# switchport trunk native vlan 99
S3(config)# interface range f0/1-4
S3(config-if-range)# switchport mode trunk
S3(config-if-range)# switchport trunk native vlan 99
為 3 台交換機的 vlan 99 配置 IP 地址:
S1(config)# interface vlan99
S1(config-if)# ip address 172.31.99.1 255.255.255.0
S2(config)# interface vlan 99
S2(config-if)# ip address 172.31.99.2 255.255.255.0
S3(config)# interface vlan 99
S3(config-if)# ip address 172.31.99.3 255.255.255.0
配置生成樹和負載均衡
使用 spanning-tree mode 命令配置交換機,以使其將 PVST 用作 STP 模式。
S1(config)# spanning-tree mode pvst
S2(config)# spanning-tree mode pvst
S3(config)# spanning-tree mode pvst
如果要配置快速 PVST+,則 spanning-tree mode 命令的模式為 rapid-pvst。
S1(config)# spanning-tree mode rapid-pvst
S2(config)# spanning-tree mode rapid-pvst
S3(config)# spanning-tree mode rapid-pvst
將 S1 配置為 VLAN 1、10、30、50 和 70 的主根,將 S3 配置為 VLAN 20、40、60、80 和 99 的主根。將 S2 配置為所有 VLAN 的次根,以此實現負載均衡。
S1(config)# spanning-tree vlan 1,10,30,50,70 root primary
S2(config)# spanning-tree vlan 1,10,20,30,40,50,60,70,80,99 root secondary
S3(config)# spanning-tree vlan 20,40,60,80,99 root primary
使用 show spanning-tree 命令驗證配置.
S1# show spanning-tree
S2# show spanning-tree
S3# show spanning-tree
配置 PortFast 和 BPDU 防護
當端口配置 PortFast 時端口會從阻塞狀態直接切換為轉發狀態,從而跳過監聽和學習狀態,使得效率提高。
S1(config)# interface f0/6
S1(config-if-range)# spanning-tree portfast
S2(config)# interface f0/18
S2(config-if-range)# spanning-tree portfast
S3(config)# interface f0/11
S3(config-if-range)# spanning-tree portfast
由於配置的 PortFast 不應該收到 BPDU,此時如果就有可能產生環路,因此可以啟用 BPDU 防護,在收到 BPDU 時把端口設置為錯誤禁用狀態來保護。
S1(config)# interface f0/6
S1(config-if)# spanning-tree bpduguard enable
S2(config)# interface f0/18
S2(config-if)# spanning-tree bpduguard enable
S3(config)# interface f0/11
S3(config-if)# spanning-tree bpduguard enable
參考資料
《思科網絡技術學院教程(第6版):擴展網絡》,[加] Bob Vachon,[美] Allan Johnson 著,思科系統公司 譯,人民郵電出版社
《CCNA 學習指南(第 7 版)》,[美] Todd Lammle 著,袁國忠 徐宏 譯,人民郵電出版社