STP解決什么問題
生成樹協(xié)議(Spanning-Tree Protocol,以下簡稱STP)是一個用于在局域網(wǎng)中消除環(huán)路的協(xié)議。運行該協(xié)議的交換機通過彼此交互信息而發(fā)現(xiàn)網(wǎng)絡(luò)中的環(huán)路,并適當對某些端口進行阻塞以消除環(huán)路。由于局域網(wǎng)規(guī)模的不斷增長,STP已經(jīng)成為了當前最重要的局域網(wǎng)協(xié)議之一。
二層網(wǎng)絡(luò)環(huán)路會引發(fā)哪些問題
環(huán)路導(dǎo)致網(wǎng)絡(luò)報文風(fēng)暴:
由于在二層網(wǎng)絡(luò)中,廣播,組播,未知單播都采用了泛洪的方式,如果網(wǎng)絡(luò)中存在環(huán)路,會導(dǎo)致報文無限復(fù)制,直到最終網(wǎng)絡(luò)崩潰。

環(huán)路導(dǎo)致MAC表震蕩
如上圖,在報文復(fù)制的過程中,SwitchB會發(fā)現(xiàn)PC1的報文一會兒從上面接口收到,一會兒從下面接口收到,反復(fù)震蕩,導(dǎo)致MAC表不穩(wěn)定。
即使是已知單播,也可能會導(dǎo)致問題,如下圖:

- PCB發(fā)送單播報文給PCA,該報文源Mac為MacB,目的Mac為MacA。
- SW1從B接口收到該報文,所以SW1認為MacB對應(yīng)的出接口為B
- 該單播報文也會被SW2轉(zhuǎn)發(fā),從A端口進入SW1,這樣SW1又認為MacB對應(yīng)的出接口為A。
- 改過程反復(fù)出現(xiàn),導(dǎo)致SW1的MAC表不停震蕩。
STP如何解決問題
下圖是一個有環(huán)路的網(wǎng)絡(luò)演示例子,我們看看STP如何在這個網(wǎng)絡(luò)中計算出一個生成樹,并將會導(dǎo)致環(huán)路的鏈路阻塞。

- 1. 選根橋:首先各交換機根據(jù)優(yōu)先級和MAC地址,選出一個BID最小的交換機,作為整個網(wǎng)絡(luò)的根。
相關(guān)術(shù)語:
網(wǎng)橋:比較早期的網(wǎng)絡(luò)中,稱交換機為網(wǎng)橋。在某些場景中網(wǎng)橋和交換機會交替使用。
網(wǎng)橋ID:BID—網(wǎng)橋的優(yōu)先級+網(wǎng)橋MAC。
根橋:BID(網(wǎng)橋ID)最小的網(wǎng)橋定為根橋。在沒有配置優(yōu)先級的網(wǎng)絡(luò)中,根橋?qū)⒂蠱AC地址最小的網(wǎng)橋擔(dān)任。如果網(wǎng)絡(luò)中配置了各個交換機的優(yōu)先級,則由優(yōu)先級最小的交換機當人跟橋。

- 2. 確定根端口、指定端口、可選端口
根端口和指定端口和可選端口的內(nèi)涵:
根端口(RP-RootPort),交換機上最優(yōu)的端口。
- 根端口的概念是針對交換機的,是指(一個非根橋的STP)交換機上離根橋最近的端口。
- 一個STP交換機上有且僅有一個RP。
- 對于根橋發(fā)出的報文來看,流量從根端口進入交換機
指定端口(DP-DesignatedPort),鏈路上的最優(yōu)端口。
- 指定端口的概念是針對于某鏈路的,指定端口是鏈路上離根橋最近的端口。
- 一個鏈路上有且僅有一個DP。
- 對于根橋發(fā)出的報文來看,流量從指定端口流出交換機。
可選端口(AP-AlternatedPort):, 非最優(yōu)端口
- 即非根端口,也非指定端口,說明該端口不在生成樹上,則該端口需要阻塞。所以可選端口也稱為阻塞端口。
我們看看根端口RP和指定端口DP的簡單示例,對RP和DP有一個直觀的認識。指定端口DP就是樹中父節(jié)點上的端口,根端口RP就是樹中子節(jié)點上的端口。

-
3. 關(guān)閉所有阻塞端口的流量轉(zhuǎn)發(fā)功能
相當于把可能形成環(huán)路的端口流量轉(zhuǎn)發(fā)功能全部關(guān)閉(俗稱破環(huán)或剪枝),通過這樣的操作,將物理上的一個網(wǎng)狀拓撲改造為一個邏輯上的樹狀拓撲。從而消除網(wǎng)絡(luò)環(huán)路。
看看完整的示例,包括根端口RP,指定端口DP和可選端口AP。STP通過關(guān)閉AP端口的轉(zhuǎn)發(fā)功能,將物理上的網(wǎng)狀拓撲,轉(zhuǎn)變?yōu)檫壿嬌系臉錉钔負?。從而消除網(wǎng)絡(luò)環(huán)路。

在整個網(wǎng)絡(luò)消除環(huán)路,穩(wěn)定后,應(yīng)該處于這樣一種狀態(tài)
- 根橋在周期性的發(fā)送Hello BPDU
- 這些BPDU報文從根往葉子周期性發(fā)送(基于根橋的?;钪芷冢?br>
非根橋周期性的從RP端口收到這些BPDU(如果有必要,更新本地信息后),
從DP端口將這些報文往樹的葉子方向 - 對于阻塞接口,應(yīng)該能周期性的收到DP發(fā)送過來的報文。
拓撲變化后的響應(yīng)
- 從上面過程可以看到,BPDU會周期性的從樹根往葉子發(fā)送。
- 每一個端口的最優(yōu)BPDU都有一個有效期,如果超過這個有效期有沒收到BPDU,則認為該BPDU已經(jīng)無效。嘗試重新收斂。
*---
*---
更多的細節(jié)
1. 協(xié)議基礎(chǔ):報文格式
要實現(xiàn)STP功能,網(wǎng)橋之間必須要進行一些信息的交互,這些信息交互單元就稱為配置消息BPDU(BridgeProtocolDataUnit)。STPBPDU是一種二層報文,目的MAC是多播地址01-80-C2-00-00-00,所有支持STP協(xié)議的網(wǎng)橋都會接收并處理收到的BPDU報文。該報文的數(shù)據(jù)區(qū)里攜帶了用于生成樹計算的所有有用信息。具體如下:

各字段的含義
在BPDU中,最核心的字段是根橋ID,跟路徑成本,發(fā)送網(wǎng)橋ID,端口ID四個字段。這四個字段組成四元組,用來比較兩個BPDU的“好壞”。四元組越小,說明越好。
注:發(fā)送網(wǎng)橋ID,端口ID僅僅在路徑成本相同時發(fā)揮作用
| 字段名 | 字段含義 |
|---|---|
| 協(xié)議ID: | 該值總為0。 |
| 版本號: | STP的版本(為IEEE 802.1d時值為0)。 |
| 報文類型: | BPDU類型(配置BPDU=0,TCN BPDU=80)。 |
| 標記域: | LSB(最低有效位)=TCN標志;MSB(最高有效位)=TCA標志。 |
| 根網(wǎng)橋ID: | 根信息由2字節(jié)優(yōu)先級和6字節(jié)ID組成。 這個信息組合標明已經(jīng)被選定為根網(wǎng)橋的設(shè)備標識。 |
| 根路徑成本: | 路徑成本為到達根網(wǎng)橋交換機的STP開銷。 表明這個BPDU從根網(wǎng)橋傳輸了多遠,成本是多少。 這個字段的值用來決定哪些端口將進行轉(zhuǎn)發(fā),哪些端口將被阻斷。 |
| 發(fā)送網(wǎng)絡(luò)橋ID: | 發(fā)送該BPDU的網(wǎng)橋信息。由網(wǎng)橋的優(yōu)先級和網(wǎng)橋ID組成。 |
| 端口ID: | 發(fā)送該BPDU的網(wǎng)橋端口ID。 |
| 計時器: | 計時器用于說明生成樹用多長時間完成它的每項功能。 這些功能包括報文老化時間、最大老化時間、訪問時間和轉(zhuǎn)發(fā)延遲。 |
| 最大老化時間: | 網(wǎng)橋?qū)⒏鶚蚩醋霾豢捎们氨A舾鵌D的最大時間。 |
| 訪問時間: | 根網(wǎng)橋連續(xù)發(fā)送BPDU的時間間隔。 |
| 轉(zhuǎn)發(fā)延遲: | 網(wǎng)橋在監(jiān)聽學(xué)習(xí)狀態(tài)所停留的時間。 |
2. 協(xié)議運行過程
- 自認老大(根橋):最初,每一臺交換機都認為自己是根橋,嘗試向外通告這一信息。
- 周期通告:STP交換機在每一個端口上定期(2s)發(fā)送BPDU報文
-
發(fā)現(xiàn)強者,歸順強者:每臺交換機除了發(fā)送BPDU外,也從所有端口上接收BPDU,一旦在某端口上收聽到比自己發(fā)的還要“好”的BPDU,那么這個端口就提取該BPDU中的某些信息,更新自己的信息。并停止在該鏈路上發(fā)送BPDU。
收到更好的BPDU后需要更新的信息包括:- 自己認為的根橋BID(總體決策):從所有端口中最好的BPDU中獲得。
- 本路由器的根端口(RP,總體決策):從所有端口中最好的BPDU中獲得。
- 鏈路上的指定端口(DP,端口決策):如果從該端口收到更好的BPDU,則說明別人李根橋更近,則自己端口不是DP,否則則認為自己是DP。
再次強調(diào)一下,比較BPDU的“好壞”的方式(自己的或其他交換機的),都是根據(jù)上面提到的四元組來完成的,即最低橋ID、最低根路徑成本,最低發(fā)送者BID,最低端口ID。該端口緩存他人BPDU后,自己則立即停止發(fā)送BPDU。
當發(fā)送BPDU的時候,交換機填充Sender BID字段的總是自己的BID,而填充Root BID字段的是“當前我所認為是根橋的”BID。
- 最終收斂:此過程一直持續(xù),直到最終網(wǎng)絡(luò)收斂:最優(yōu)的根橋最終被選舉出來,并且RP,DP端口也被確定下來。整個網(wǎng)絡(luò)歸順到一顆以最優(yōu)BID為根的生長樹上來。
3. 具體過程分析:選舉根橋
1. 初始狀態(tài),自立山頭:,雖然A的BID最小,但初始狀態(tài)還沒有互通信息,各自自立山頭,此時正確的樹上僅有孤零零的一個根節(jié)點。

2. 發(fā)現(xiàn)強者,歸順強者:通過BPDU的對外通告,樹逐漸向外生長,收復(fù)C和D兩個節(jié)點,但B節(jié)點還不再王化之內(nèi)。

3. 通告全網(wǎng),天下歸心:隨著根橋的勢力范圍擴大,已歸順節(jié)點(如圖中的C和D)也幫著A對外宣傳根橋是A,最終該信息傳遍全網(wǎng),天下歸心,大家都臣服在A的STP樹下。至此,全網(wǎng)就有了一個統(tǒng)一的根,即BID最小的A。

4. 具體過程分析:最佳樹的生成與RP和DP的確定
整個網(wǎng)絡(luò)的破環(huán)與剪枝過程與選舉根橋過程類似,都是從根橋出發(fā),這棵樹逐步向外生長,直到最后長滿整個網(wǎng)絡(luò)。
1. 天地初開,一片混沌:此時正確的樹上僅一個跟節(jié)點,其他節(jié)點的信息都是錯誤或不可信的。

2. 樹開始向外“生長”:離根最近的交換機首先收到根節(jié)點的召喚(根節(jié)點會發(fā)送“最優(yōu)”的BPDU),加入到樹上來。產(chǎn)生了正確的RP,DP信息。

3. 樹“生長”至整個網(wǎng)絡(luò):隨著樹的進一步生長,節(jié)點一個接一個的加入到樹上來(通過向外發(fā)布“更好”的BPDU吸引其他節(jié)點加入)。最終遍布整個網(wǎng)絡(luò),形成了一顆全網(wǎng)的STP樹。

注1:當然樹的生長并不是一帆風(fēng)順的,有時候由于網(wǎng)絡(luò)時延或定時器的原因,
某些節(jié)點可能會加入錯誤的分枝,但最終這些誤入歧途的節(jié)點都能重新找到正確的分枝加入
注2:雖然我們上面為了說明簡單,將根節(jié)點的選舉和DP,RP的確定分兩個階段來說明,
實際協(xié)議運行過程中,并沒有明確的區(qū)分這兩個階段。他們是統(tǒng)一在“最佳BPDU傳遞”這
個統(tǒng)一的協(xié)議處理流程中的。
5. 拓撲變化后的收斂
與拓撲變化后的收斂密切相關(guān)的幾個基本概念:
1. 端口狀態(tài)機
STP交換機端口一共有五個狀態(tài):
- Disable:表示端口還沒有使能
- Blocking:表示端口是AP(即非DP,也非RP),不能進行報文轉(zhuǎn)發(fā)工作。
- Listening,Learning,F(xiàn)orwarding:表示端口是DP或RP,可以進行報文轉(zhuǎn)發(fā)工作,但如果端口當選DP或RP就開始轉(zhuǎn)發(fā)工作的話,可能網(wǎng)絡(luò)中還有環(huán)路。(這是因為此時網(wǎng)絡(luò)還沒有完全收斂,可能自己的信息還不全,做出的決策時錯誤的;也有可能雖然自己的是正確決策,但別人還沒有獲得完整的信息,別人的決策不正確。),為了避免這種情況發(fā)生,STP采用了延遲轉(zhuǎn)發(fā)工作的決定,等待網(wǎng)絡(luò)完全穩(wěn)定收斂下來后才進入轉(zhuǎn)發(fā)工作狀態(tài)。


2.幾個相關(guān)定時器
- Hello Timer:STP交換機發(fā)送BPDU的時間間隔。當網(wǎng)絡(luò)拓撲穩(wěn)定之后,該計時器的修改只有在根橋修改才有效。根橋會在之后發(fā)出的BPDU中填充適當?shù)淖侄我韵蚱渌歉鶚騻鬟f該計時器修改信息。但當拓撲變化之后,TCN BPDU的發(fā)送不受這個計時器的管理。
- Forwarding Delay Timer:指一個端口Listening 和Learning的各自時間,默認為15秒,即Listening狀態(tài)持續(xù)15秒,隨后Learning狀態(tài)再持續(xù)15秒。這兩個狀態(tài)下的端口會處于Blocking狀態(tài),這是STP用于避免臨時環(huán)路的關(guān)鍵。
- Max Age:端口的BPDU老化的時間,前文已經(jīng)探討過。端口會根據(jù)接收到的BPDU存儲所接收到的最好的四個信息(根橋BID、累計根路徑開銷、發(fā)送者BID和發(fā)送端口PID)。每次接收到合適的BPDU,端口都會啟動這個Max Age計時器。超過這個Max Age時間端口接收不到合適BPDU,就會認為該BPDU已經(jīng)失效。這個時間默認為20秒。
3. 拓撲變化后重新收斂需要解決那些問題
- 讓網(wǎng)絡(luò)邏輯拓撲重新恢復(fù)成一顆完整的樹。
網(wǎng)絡(luò)拓撲變化后,可能新增了鏈路,導(dǎo)致樹上又引入了環(huán),此時需要重新破環(huán)。
也可能樹中某些鏈路斷了,導(dǎo)致樹的斷裂,此時需要啟用原來被刪鏈路,恢復(fù)樹的連通性。
甚至是根橋down掉了,需要重新選擇根橋。
解決方法:其實重新生成STP樹沒有什么特別的,其過程與初始收斂過程完全相同。
有一點需要說明的是:如果DR端口down了,或者根橋down了,需要等待MaxAge時間,
到了MAXAge時間后,通過BPDU的老化機制將無效BPDU刪除,并重新嘗試生成新的BPDU。
![Uploading Paste_Image_518231.png . . .]
- 即使恢復(fù)了STP樹,拓撲變化可能會MAC表錯誤,需要盡快清除這些錯誤MAC,否則流量仍然不能恢復(fù)。
比如:一個網(wǎng)絡(luò)最初如下:假設(shè)網(wǎng)橋 B1 阻塞了通向 B4 的鏈路。A 和 B 是具有已建立連接的兩個工作站。流量從 A 到 B 進入 B1、B2、B3,然后進入 B4。
最初網(wǎng)絡(luò)拓撲
現(xiàn)在,假設(shè) B2 和 B3 之間的鏈路發(fā)生故障。在 B1 以轉(zhuǎn)發(fā)模式將其端口應(yīng)用于 B4 之前,A 和 B 之間的通信會中斷(使用默認參數(shù)的情況下最長中斷 50 秒),這個比較容易理解。但是我們發(fā)現(xiàn),即使B1-B4之間鏈路打開了,A->B的通訊仍然無法恢復(fù),這是因為當 A 要向 B 發(fā)送幀時,B1 交換機上MAC表錯誤導(dǎo)致的,(B1仍然認為主機B的出接口是B2),數(shù)據(jù)包將被發(fā)送到黑洞。當B要到達A. Communication丟失在五分鐘,直到A和B MAC地址的條目老化。
錯誤的MAC表導(dǎo)致轉(zhuǎn)發(fā)黑洞
解決方法:為了盡快恢復(fù)流量轉(zhuǎn)發(fā),STP引入了變更通知和應(yīng)答消息
在常規(guī) STP 操作中,網(wǎng)橋一直從其根端口上的根網(wǎng)橋接收配置 BPDU。但是,它從未派出BPDU往根網(wǎng)橋。為此,引入了稱為拓撲更改通知 (TCN) BPDU 的特殊 BPDU。因此,當網(wǎng)橋需要對拓撲更改發(fā)出信號時,它開始在其根端口上發(fā)送 TCN。指定的網(wǎng)橋接收并確認 TCN,還為自己的根端口生成另一個 TCN。此過程將一直持續(xù),直到 TCN 發(fā)現(xiàn)根網(wǎng)橋為止。
TCN 是非常簡單的 BPDU,不包含網(wǎng)橋每 hello_time 秒(這是本地配置的 hello_time,不是配置 BPDU 中指定的 hello_time)發(fā)送的任何信息。指定的網(wǎng)橋通過立即發(fā)回設(shè)置了拓撲更改確認 (TCA) 位的正常配置 BPDU 來確認 TCN。通知拓撲更改的網(wǎng)橋不停地發(fā)送其 TCN,直到指定的網(wǎng)橋確認它為止。因此,指定的網(wǎng)橋?qū)?yīng)答 TCN,即使不從其根網(wǎng)橋接收配置 BPDU 也是如此。

將事件廣播到網(wǎng)絡(luò)
只要根網(wǎng)橋得知網(wǎng)絡(luò)中有拓撲更改事件,就會開始發(fā)送設(shè)置了拓撲更改 (TC) 位的配置 BPDU。這些 BPDU 將由網(wǎng)絡(luò)中設(shè)置了此位的每個網(wǎng)橋轉(zhuǎn)發(fā)。因此,所有網(wǎng)橋都注意到拓撲更改情況,并可以將其老化時間縮短到 forward_delay。網(wǎng)橋在轉(zhuǎn)發(fā)和阻塞端口上接收拓撲更改 BPDU。
TC 位在 max_age + forward_delay 秒(默認情況下為 20+15=35 秒)內(nèi)由根網(wǎng)橋設(shè)置。

BPDU發(fā)送時機
- 對于根橋,主動發(fā)送BPDU:根據(jù)Hello周期,主動通過所有DP發(fā)送BPDU
- 非根橋,中繼BPDU:從RP收到BPDU,從所有DP發(fā)送出去。
什么時候認為是拓撲發(fā)生了變化
1.網(wǎng)橋至少有一個指定端口,并且某端口從其他(Blocking、Listening、Learning)狀態(tài)轉(zhuǎn)到Forwading狀態(tài)。
2.某端口由Forwading、Learning狀態(tài)轉(zhuǎn)到Blocking狀態(tài)。
拓撲變化的實例分析
根橋宕機
根橋如果down機的話,所有網(wǎng)絡(luò)都收不到?;顖笪?,到了MaxAge后,網(wǎng)絡(luò)重新選舉。
(皇上駕崩,天下大亂,群雄逐鹿,重立新主)某條鏈路break,比如下圖:SW1是ROOT,SW1和SW3之間cost 是100,其他cost 都是20.所以正常情況下,會將SW1和SW3之間的鏈路剪枝。如果SW1和SW2之間的鏈路出現(xiàn)故障,我們看看重新收斂過程如何。

- 出現(xiàn)故障的鏈路是SW2的RP端口鏈路,SW2無法從他的RP端口收包根橋的?;頑PDU.
- 因為SW2也無法從其他端口收到BPDU?;睿砸欢螘r間過后,SW2認為網(wǎng)絡(luò)中沒有根了(實際上是因為信息的缺失而導(dǎo)致錯誤的認為)。SW2開始自立為王(根橋)。
- SW4發(fā)現(xiàn)根橋發(fā)生了變化,但他也不知道具體是什么情況,領(lǐng)導(dǎo)(上游節(jié)點)既然這么說了,就跟著領(lǐng)導(dǎo)走吧。他也宣稱根橋變成了SW2。并把這一信息向外擴散。
- SW3收到SW4的宣告,發(fā)現(xiàn)不對,SW1應(yīng)該比SW2更強,并且自己離SW1更近,隨即SW3宣告SW1應(yīng)該是老大,并自己變成該網(wǎng)段的DP,開始在該網(wǎng)段上發(fā)送BPDU。隨后大軍壓境,重新收復(fù)SW4和SW2.最終恢復(fù)天下太平。

