網工筆記(二):STP生成樹

在網絡二層協議中,STP生成樹應算是最難懂最能給網絡製造麻煩的一位,可以說不經歷過STP故障造成的網絡崩潰也不算見過世面的網工。網絡技術經歷了那麼多年的創新迭代,儘管有些新的技術架構號稱可以無需使用STP,但我所接觸到的頂級科技公司的數據中心網絡依然會使用STP。值得一提的是在虛擬網絡裏,譬如說用NSX,的確是沒有STP,但這是另外一個課題了。

今天我們來複習一下STP生成樹,以下是本文的提綱。

  • 基本原理
  • STP中的報文BPDU
  • 根橋和根端口的選舉
  • 拓撲的變更
  • STP的幾種模式
  • 排錯清單

 基本原理

 一般網絡系統中都會搭建有多臺的交換機,交換機之間會有冗餘鏈路,STP的提出就是用來解決局域網(二層網絡)中的環路問題的。二層上的報文是沒有TTL的(就是說沒有毀滅計時器),如果網絡有環路,報文就會被反覆傳播最後造成二層網的風暴。 STP通過阻斷一些端口,達到打破環路的目的,從而讓整個網絡拓撲邏輯上成爲一個樹狀結構。

STP生成樹的生成過程大概如下:

  1. 選舉根橋(Root Bridge)-- 根橋交換機位於整個邏輯樹的根部,並由此確定那些交換機處於下游。
  2. 選舉根端口(Root Port)-- 一旦根橋確定,其他交換機會計算出自身的端口中那一個(並只有一個)端口去往根橋的路徑,並以該端口爲根端口。
  3. 選舉指定端口(Designated Port) -- 交換機用於轉發BPDU(STP報文)的端口, 每個網段有且只能有一個指定端口。
  4. 阻斷端口(Blocking Port),阻斷一些端口達到斷開環路的目的。

特別指出的是在根橋上的所有端口都是指定端口。

上圖是從書ENCOR350-401[1]引用而來,它很好的展示了STP各種端口的狀況,DP指的就是Designated Port, RP爲Root Port。從上圖可見,designated port一般都連着root port, 其對應連着的交換機爲處於下游的交換機。

STP中的報文BPDU

在STP協議中發送的報文叫Bridge Protocol Data Unit, 簡稱爲BPDU。根橋根端口的選舉都依賴於交換機之間發送的BPDU報文,可以說局域網生成樹的建立和維持都要使用BPDU報文。BPDU報文的類型有兩種:

  1. Configuration BPDU -- 這類報文用於確定根橋,根端口,指定端口和阻斷端口。
  2. Topology change notification (TCN) BPDU -- 這類報文用於交換機之間通知拓撲發生了變更。拓撲變更是常見現象,例如某一個交換機中原先連接的端口突然中斷,TCN BPDU就會被髮出。

在抓包時你能在BPDU報文中看到以下幾個參數,後文會對這些參數進行解析:

  • Bridge ID -- 根橋ID。
  • Local bridge identifier -- 交換機自身的橋ID(交換機也被稱作橋bridge)。
  • System  Priority -- 系統權重,在交換機上可配置的一個權重值,可用於影響根橋的計算。
  • root cost path -- 到根橋的距離。
  • System Extention ID -- 這個其實就是VLAN ID。 
  • Hello time -- BPDU報文發送的間距,默認值爲2秒。

根橋和根端口的選舉

選舉根橋是建立局域網樹狀拓撲(生成樹)的開始。當一個交換機初始化時,它會先把自己定爲根橋,然後發送BPDU報文來跟相鄰的交換機一起確定誰是根橋。其選擇方法是基於根橋的ID,具體說就是比誰的ID更小。

  • Bridge ID = System Priority + VLAN ID  + MAC地址
  • System Priority = 4096 x N
  • Bridge Priority =  System Priority + VLAN ID
  • Default Priority = 32768

這裏需要特別說明的是priority的計算問題,priority即是權重,在STP中這個權重值總是4096的倍數(4096 x N),默認值是32768。在BPDU報文裏往往看到的權重值(Bridge Priority)是32769,那是因爲在BPDU 中權重值需加上VLAN ID,在VLAN 1中,報文裏的權重就爲32769,在VLAN 10,那麼權重就是32778。

由於根橋選舉是看誰的Bridge ID更小,所以mac地址值小的交換機就更有可能成爲根橋,這樣設計的原因是mac地址小的機器會是更老的機器在網絡中存在的時間也可能更早,更願意選擇這些已經在網絡拓撲裏的機子作爲根橋。以下是查詢根橋的命令。

# show spanning-tree root

                                        Root    Hello Max Fwd
Vlan                   Root ID          Cost    Time  Age Dly  Root Port
---------------- -------------------- --------- ----- --- ---  ------------
VLAN0001         32769 5000.0003.0000         0    2   20  15
VLAN0020         32769 5000.0004.0000         4    2   20  15  Gi0/0

在一個局域網裏確認根橋後,其他的非根橋交換機各自計算自己的根端口。根端口通過按以下順序比較相應的參數來確定的。

  1. 首先比較端口的root path cost值,path cost是該端口到根橋的代價,值小優先。Root path cost的計算是通過根橋往下發BPDU報文而獲得的,根橋發出的BPDU的cost值爲0,通過1G的接口,cost值加4。
  2. 其次比較端口對應的權重(priority)值,值小優先。
  3. 比較端口的mac地址值,值小優先。
  4. 如果多個接口具有同樣的參數,那麼比較那個接口與相連的路由器有較優的權重,值小優先。
  5. 最後比較端口的端口 ID,值小優先, 例如接口Gi1/0/1比接口Gi2/0/1小即選Gi1/0/1爲根端口。

在上面命令show spanning-tree root的輸出中,VLAN 1的root path cost爲0,root port爲空值,可知該交換機自身是VLAN 1的根橋。

在網絡部署時,通常會刻意地設計出根橋和根端口,管理員通過配置權重來影響根橋的選舉,通過配置patch cost來影響根端口和指定端口(Designated Port)的選舉。

拓撲的變更

造成拓撲變更的原因有多種,例如交換機端口中斷,又例如在網絡中新增了交換機,在這些情況下生成樹需要被重新計算。正常狀態下Configuration BPDU從根橋發出到達其它交換機;當拓撲變更發生時,則由發現變更的交換機發出TCN BPDU。 拓撲的變更的過程如下:

  • 網絡中某交換機發現拓撲變更,隨即從根端口向根橋發出TCN BPDU。上游的交換機接收到TCN BPDU後向源交換機發acknowledgement,向根橋轉發TCN BPDU(通過根端口)。
  • 根端口接收到TCN BPDU後,生成新的Configuration BPDU,設置拓撲變更的flag,以泛洪(flooding)的方式把該報文發送給所有的交換器。
  • 當交換機接收到有拓撲變更flag的Configuration BPDU時,會把mac地址表的計時器設爲15秒,所有15秒以內未被使用過的地址都會被清空。

當mac地址表被清空會造成一段時間內的unknown unicast的泛洪,會影響交換機一段時間內的性能。當恢復到穩定狀態,mac地址表的計時器會恢復到正常,默認下是300秒。

 接口的翻滾(flapping)會造成生成樹頻繁的拓撲變更,隨之帶來的是mac地址表不斷地被清空,這當然不是一種理想的狀態。在STP下可以把一些端口類型爲edge port,一般用於連接服務器,需要手動用portfast配置。目的是爲了讓服務器端的down機狀態不會造成STP的拓撲變更,並且能讓連接服務器的端口能夠更快地處於啓動狀態。

STP的幾種模式

STP的第一個協議爲802.1D,在該協議下一個端口從admin down到能夠轉發報文大概需要30秒的時間,當中需要經歷如下幾個狀態:

  1. 阻塞狀態(blocking): 這時端口不轉發報文,不參與mac learning,只接收BPDU報文,但不發送BPDU。
  2. 偵聽狀態(listening): 這時能BPDU報文,這個狀態要持續15秒。
  3. 學習狀態(learning): 這時可以參與mac learning, 但是依然不能轉發報文。
  4. 轉發狀態(forwarding): 可以轉發報文。

802.1D這個協議的一個主要問題就是它的scalability, 對於一個大型網絡,它需要很長的時間才能讓所有的端口處於工作的狀態。於是RSTP(Rapid STP)協議被提出,即爲802.1W。思科提出的PVST和PVST+都是建立在802.1W的基礎上的。在RSTP中,報文只有三種狀態,沒有了阻塞狀態和偵聽狀態,取而代之的是discarding狀態  -- 不轉發報文不學習mac地址,只接收和發送BPDU。另外,RSTP也重新定義了端口的一些角色,在RSTP下的端口角色有:Root Port, Designated Port, Alternative Port 和 Backup Port。

 PVST和PVST+是基於RSTP,主要想法是每一個VLAN生成一個獨立的STP生成樹,一個VLAN中的拓撲變更不會影響到所有的VLAN。但是在VLAN樹比較多的情況下,給每一個VLAN計算生成樹開銷很大,於是就有了MST模式,把多個VLAN放在同一個實例(instance)下計算生成樹。 在交換機上可用以下命令可以查看STP的模式。

# show run | inc span
spanning-tree mode pvst

排錯清單

以下幾個命令是在STP中排錯時比較常用的命令。

如果一個接口狀態和設置都正常的狀況下,但就是沒有流量,一個最可能的問題就是STP把該端口阻斷了。查看STP的阻斷端口show spanning-tree blockedports

#sh spanning-tree blockedports

Name                 Blocked Interfaces List
-------------------- ------------------------------------
VLAN0001             Gi0/1

Number of blocked ports (segments) in the system : 1

show spanning-tree root 查看根橋根端口和root path cost。如果需要可以使用root guard,loop guard, BPDU guard和BPDU filter等屬性來影響根橋根端口的選舉。Root guard的作用是在designate root上做保護,防止designate root變成根端口;當designate port接收到更高級的BPDU時會把自己設爲error disable。對應地loop guard用於根端口和altrernative port防止其成爲上游端口(designate port)。該命令的輸出例子在前文提供了。

show spanning-tree summary快速查看STP的概覽設置。

#sh spanning-tree summary
Switch is in pvst mode
Root bridge for: none
Extended system ID                      is enabled
Portfast Default                        is disabled
Portfast Edge BPDU Guard Default        is disabled
Portfast Edge BPDU Filter Default       is disabled
Loopguard Default                       is disabled
PVST Simulation Default                 is enabled but inactive in pvst mode
Bridge Assurance                        is enabled but inactive in pvst mode
EtherChannel misconfig guard            is enabled
Configured Pathcost method used is short
UplinkFast                              is disabled
BackboneFast                            is disabled

Name                   Blocking Listening Learning Forwarding STP Active
---------------------- -------- --------- -------- ---------- ----------
VLAN0001                     0         0        0          4          4
VLAN0020                     0         0        0          2          2
---------------------- -------- --------- -------- ---------- ----------
2 vlans                      0         0        0          6          6

在排查拓撲變更造成的問題可以用show spanning-tree detail,該命令輸出上次變更的時間和發出變更的端口。要找到拓撲變更的源頭需要登錄到每一臺交換機上用以該命名一臺臺往下查。減低拓撲變更造成影響的方法有1)翦除多餘的VLAN (vlan puring);2) 對終端服務器使用portfast;3)使用MST。

#sh spanning-tree detail 

VLAN0001 is executing the ieee compatible Spanning Tree protocol
  Bridge Identifier has priority 32768, sysid 1, address 5000.0003.0000
  Configured hello time 2, max age 20, forward delay 15
  Current root has priority 32768, address 5000.00d7.ee0b
  Root port is 3 (GigabitEthernet0/2), cost of root path is 4
  Topology change flag not set, detected flag not set
  Number of topology changes 1 last change occurred 00:30:19 ago
          from GigabitEthernet1/1
  Times:  hold 1, topology change 35, notification 2
          hello 2, max age 20, forward delay 15
  Timers: hello 0, topology change 0, notification 0, aging 300

 Port 3 (GigabitEthernet0/2) of VLAN0001 is root forwarding
   Port path cost 4, Port priority 128, Port Identifier 128.3.
   Designated root has priority 32768, address 5000.00d7.ee0b
   Designated bridge has priority 32768, address 5000.00d7.ee0b
   Designated port id is 128.2, designated path cost 0
   Timers: message age 2, forward delay 0, hold 0
   Number of transitions to forwarding state: 1
   Link type is point-to-point by default
   BPDU: sent 34, received 885

參考文獻

[1] CCNP & CCIE Enterprize Core, ENCOR 350-401, ciscopress

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章