上一篇STP主要介紹了802.1d的標準生成樹,它最大的問題就是收斂時間太慢了,通常需要30s-50s才能完成收斂。本篇介紹3種收斂模式,及Uplinkfast / Backbonefast / Portfast解決方案。
STP收斂:(有3種收斂方式)
直連鏈路收斂:收斂時間30s
以上圖爲例。正常情況下SW1是根橋,SW2的f0/2被阻塞。現在如果SW1和SW2間直連的鏈路down掉,那端口也down掉。端口up/down會導致SW1會發出TC報文通知全網將MAC地址表老化,SW2的f0/5口根端口消失後,需要選新的根端口,經過15s的Listening時間後,原本被阻塞的f0/2口被選爲新的根端口,再經過15s的Learning時間學習MAC地址後進入Forwarding狀態。總時間是30s。因此例如原本SW1上連PC1,SW2上連PC2,兩臺PC通過SW1和SW2間直連鏈路通起來。直連鏈路down後,兩臺PC會有30s無法通信,30s後經SW3恢復通信。
非直連鏈路收斂:收斂時間50s
如拓撲圖中SW1和SW2間連了HUB。那HUB掛了後,SW1和SW2的f0/5口仍舊是OK的,仍舊能每隔2s發送BPDU。即鏈路down了,但端口沒有down。此時原本SW2的f0/5口每隔2s會收到SW1的BPDU,現在鏈路down了,SW1雖然仍舊在發送,SW2卻收不到。STP裏介紹BPDU報文字段時介紹過,Message age會計時,Max age爲20s。20s後SW2的f0/5口仍舊沒有收到新的BPDU,就知道該鏈路出問題了。就用f0/2口的BPDU,經過15s的Listening,選舉f0/2口爲根端口,再經過15s的Learning時間學習MAC地址後進入Forwarding狀態。總時間是50s。因此例如原本SW1上連PC1,SW2上連PC2,兩臺PC通過SW1和SW2間經HUB通起來。HUB掛了後,兩臺PC會有50s無法通信,50s後經SW3恢復通信。
不重要的鏈路收斂:收斂時間30s
即上圖中鏈路都正常,任意交換機上連PC。將PC接入或拔掉,就是不重要的鏈路發生變化。好比你要上網就電腦網線接一下,不用了就將網線拔掉。這種鏈路的變化肯定不會導致網線拓撲里根端口發生變化,但就如STP裏TCN報文的例子所說,端口只要檢測到up/down,就會向根橋發送TCN報文。根橋會向全網發送TC報文通知全網將MAC地址表老化,經Listening,Learning各30s後重新進入Forwarding。所以每次PC接上網線要等30s才能上網。
解決方案:UplinkFast
UplinkFast是思科私有協議,提供了非根橋的交換機上快速切換根端口的能力(根橋上不能配置UplinkFast端口)。拓撲圖中SW2上配置成UplinkFast後,f0/2口可以跳過Listening和Learning直接Forwarding,將收斂時間減少到1s以內。通常只在接入層交換機上配置UplinkFast,且該交換機至少有一個端口處於被阻塞狀態,鏈路失效必須發生在根端口時纔有意義。例如常在有雙上行去往根橋的交換機上配置成UplinkFast。
一旦被配置成UplinkFast,交換機會自動調整一些STP參數,因此要謹慎。因爲STP參數自動調整後可能會引起STP拓撲的變化:
1.交換機的優先級會增加到比缺省值要高(32768+4096),以保證交換機不會被選爲根橋(根橋沒有任何根端口)
2.交換機上所有端口的cost值會增加3000(19+3000),以保證交換機端口不會被選爲指定端口
配置命令很簡單:
SW2(config)#spanning-tree uplinkfast //交換機上全局配置成UplinkFast
SW2#show spanning-tree uplinkfast //可以查看交換機上根端口和備份根端口
如果是直連鏈路收斂,主鏈路發生故障後,SW2的f0/2口直接Forwarding,將30s收斂時間減少到了1s。如果是非直連鏈路收斂(SW1和SW2間連着HUB),HUB故障後,SW2的f0/2口徑20s的Max age時間後直接Forwarding,將50s的收斂時間減少到了20s。最後,UplinkFast通常只在老式交換機上用,新式交換機常用802.1w和802.1s。
解決方案:BackboneFast
UplinkFast解決的是自身根端口直連收斂。BackboneFast解決自身非直連收斂。如拓撲圖中SW1和SW3間鏈路down掉,該條鏈路對於SW2來說就是非直連鏈路。SW3檢測到故障,根端口down了,且SW2不會發送BPDU給SW3(端口f0/2被阻塞),因此SW3認爲自己是根橋,發送BPDU給SW2宣告自己是新根橋。SW2之前收到過該BPDU,因爲等級低,所以f0/2口才被阻塞,因此該BPDU會被忽略。計時器max_age超時(20s)後,最先的f0/2口的BPDU老化失效,該端口進入Listening狀態,會收到SW1和SW3發送的BPDU,顯然SW1的BPDU優先級高,SW2會發送BPDU給SW3。SW3一收到SW2的BPDU就停止發送它的BPDU。端口f0/2通過Listening和Learning狀態後進入Forwarding,花費30s。總共50s。
Backbone fast解決這個問題:剛開始和上面一樣,SW2收到SW3的次優BPDU就開始重新確認它的非指定端口(而非被動等待20s的max_age時間)。它在根端口上發送RLQ請求給根橋SW1(因爲SW3聲稱它是根橋,但SW2認爲根橋應該是SW1)。根橋SW1收到請求,馬上回復RLQ指出這個方向上仍舊有根橋SW1存在。SW2已經檢測了所有非指定端口,它仍然有到達根橋的路徑。可以立即老化掉存儲在端口f0/2上的信息。端口f0/2進入Listening併發送BPDU,節省了max_age時間。配置了BackboneFast的交換機檢測到間接鏈路失效後,阻塞端口立即Listening->Learning->Forwarding,節省了20s的max_age時間,將原本50s的收斂時間減少到了30s。
配置命令很簡單:
SW1(config)#spanning-tree backbonefast //可以只在SW2上配,但萬一其他鏈路也掛了呢?所以通常全都配
SW2(config)#spanning-tree backbonefast
SW3(config)#spanning-tree backbonefast
SW1#show spanning-tree backbonefast //查看BackboneFast的配置
最後,BackboneFast通常只在老式交換機上用,新式交換機常用802.1w和802.1s。
解決方案:PortFast
上面介紹過不重要鏈路收斂時間要30s,因此插拔一個終端後30s後才能接入網絡,實在太慢了。PortFast接口不需要經歷Listening和Learning,可以直接Forwarding,收斂時間減少到了1s以內。而且PortFast口的Up/Down都不會產生TCN報文導致全網Mac地址表老化重新收斂了。
交換機上PortFast端口的Up/Down不會產生TCN報文導致全網Mac地址表老化重新收斂,收斂時間從30s減少到了1s內,R1瞬間就接入了網絡。原理是PortFast口表明該端口是接入層交換機的端口,且端口不參與STP計算,肯定不會形成環路。
可以看到上面有一端自動生成的warning警告信息:PortFast口不要接交換機,只能接非交換設備,如路由器或PC等。如果PortFast口接了交換機,因爲不進行重新選舉,可能會形成環路。因此一旦交換機上某端口被配成PortFast口後,該端口如果收到BPDU立刻變回普通端口。因爲收到BPDU就意味着該端口連接到了交換機上,那它PortFast的能力就需要被取消。
最後PortFast口可以如上在端口下配,也可以全局配。全局配的話,交換機會自動爲Access口啓用PortFast功能,而Trunk口不會啓用PortFast功能。如果你想對Trunk口也生效(當然該Trunk口肯定不是接交換機的,而是接其他設備,比如單臂路由的接口接路由器)那隻能到端口下配,命令後加上trunk即可:SW1(config-if)#spanning-tree portfast trunk