問題
爲了提升網絡的可用性,須要進行冗餘和備份。可是冗餘路徑會產生環路html
環路會致使如下問題網絡
廣播風暴
:因爲交換機會對廣播、多播、和未知目標MAC的單播包進行泛洪,在存在環路的狀況下,很短的時間內就會產生風暴
多幀拷貝
、MAC地址表不穩定
:當交換機剛剛啓動時,MAC地址表是空的,因此,全部的單播幀都會進行泛洪操做。可是若是存在環路的話,交換機在特定狀況下,會從不一樣的接口收到相同的MAC地址,這樣的話,MAC地址表將不穩定
STP
(spanning tree protocal,IEEE802.1D)就是經過軟件防止環路的產生,經過邏輯的禁用接口,使得環路在邏輯上不存在;當線路出現故障時,將禁用的接口啓用,使得網絡可以發揮物理冗餘路徑帶來的高可用性數據結構
STP協議的工做原理
STP協議的原則以下:post
- 每一個廣播域中只有一個根網橋,根網橋的接口都是指定接口
- 每個非根網橋上都有一個根接口,根接口就是到達根網橋最近(帶寬最高,開銷最小)的接口
- 每一個網段中只有一個指定接口(發送方的橋ID較小的,或者端口優先級較小,或者端口ID較小的)
- 非指定接口不使用
假如上圖的Switch X是根網橋,那麼它的兩個接口都是指定接口;Switch Y是非根網橋,因爲100BASE的帶寬更高,因此Switch Y上面的接口是根接口;上下兩個segement中,s1和s2都已經有指定接口了,因此Switch Y下面的接口既不是根接口,也不是指定接口,那麼將其阻斷。學習
上述的過程是交換機經過STP協議和交換BPDU
(Bridge Protocol Data Unit)橋接協議數據單元,自動協商獲得的。BPDU每2秒鐘發送一次。url
BPDU的數據結構spa
Root ID(8Bytes)
:根網橋ID,每一個交換機經過橋ID進行標識,橋ID由橋優先級+MAC地址組成(64個字節)。橋優先級的默認值爲32768,最大值爲65535。橋ID最小的爲根網橋code
Cost of path(4Bytes)
:接口的Cost值,端口速率對應的開銷值以下:htm
Bridge ID(8Bytes)
:本網橋(交換機)的橋IDblog
Port ID(2Bytes)
:端口編號
Hellotime(2Bytes)
:BPDU間隔發送時間,默認爲2秒
Max age
:詳見下面
Forward delay
:詳見下面
上述四個字段,在交換機交換BPDU的過程當中就可以協商出結果。
在STP協議故障轉移過程當中,交換機接口狀態有以下四個狀態
當某個指定接口出現故障時,須要將原先的非指定接口轉爲指定接口。如何檢測故障呢?
一種狀況是,直接端口故障,交換機可以當即得知這樣的故障,則將Blocking的非指定接口當即切換到Listening狀態
另外一種狀況是,線路故障,交換機沒法直接檢測到,此時經過BPDU檢測。正常狀況下兩臺交換機之間會每兩秒鐘收到對方的BPDU,若是在Max age
時間後,仍然沒法收到BPDU的話,須要進行重選舉,將原先Blocking的非指定接口,切換到Listening狀態。
Listening狀態持續Forward Delay
時間,這段時間後,選舉完成。以後進入Learning狀態,交換機在該端口上進行學習MAC地址,可是不轉發數據,以防止對未知單播幀的廣播,這個時間持續Forward Delay時間;最後進入正常的Forwarding狀態
通常狀況下根據超時時間的設置,最長有可能須要通過30-50秒,STP協議才能從新選舉完成
總結:
- Blocking:非指定接口的狀態,即不轉發數據也不學習MAC地址
- Forwarding:指定接口或根接口,轉發數據和學習MAC地址
- Listening:進入重選舉的狀態
- Learning:重選舉完成後,進入MAC地址學習,但不轉發數據
下面是一個例子
- SWR的網橋優先級最小,因此SWR爲根網橋,其接口爲指定接口
- SWA、SWD的上面的兩個接口到SWR的開銷最小(都是19),因此都是根接口;同理,能夠獲得SWB和SWC的根接口
- SWA和SWD下面的端口都是其各自segement的指定接口(每一個segment有且只有一個指定接口)
- SWB和SWC組成的segement尚未指定接口,此時因爲SWB的橋優先級較小,因此SWB側的接口爲指定接口,而SWC側的接口即爲非指定接口,進入Blocking狀態
PortFast
若是終端設備直接鏈接在交換機上,也須要等待30秒的話,會出現問題,好比DHCP超時。因此,能夠配置交換機的接口爲PortFast模式,PortFast的接口不會介入STP選舉的過程,不須要等待30秒的選舉過程。可是不能用在Trunck接口上,由於若是用在Trunck接口上啓用PortFast,交換機之間沒法進行STP選舉,極易產生環路。因此PortFast通常只用在直連終端的「接入接口」。