STP工作原理 - kummer話你知

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ò)崩潰。

由于泛洪導(dǎo)致網(wǎng)絡(luò)報文轉(zhuǎn)發(fā)環(huán)路

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

已知單播導(dǎo)致的MAC震蕩

  1. PCB發(fā)送單播報文給PCA,該報文源Mac為MacB,目的Mac為MacA。
  2. SW1從B接口收到該報文,所以SW1認為MacB對應(yīng)的出接口為B
  3. 該單播報文也會被SW2轉(zhuǎn)發(fā),從A端口進入SW1,這樣SW1又認為MacB對應(yīng)的出接口為A。
  4. 改過程反復(fù)出現(xiàn),導(dǎo)致SW1的MAC表不停震蕩。

STP如何解決問題

下圖是一個有環(huán)路的網(wǎng)絡(luò)演示例子,我們看看STP如何在這個網(wǎng)絡(luò)中計算出一個生成樹,并將會導(dǎo)致環(huán)路的鏈路阻塞。


一個有環(huán)路的網(wǎng)絡(luò)
  • 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)先級最小的交換機當人跟橋。

選出整個網(wǎng)絡(luò)的根節(jié)點
  • 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ò)中的RP,DP和阻塞端口的完整示例

在整個網(wǎng)絡(luò)消除環(huán)路,穩(wěn)定后,應(yīng)該處于這樣一種狀態(tài)

  1. 根橋在周期性的發(fā)送Hello BPDU
  2. 這些BPDU報文從根往葉子周期性發(fā)送(基于根橋的?;钪芷冢?br> 非根橋周期性的從RP端口收到這些BPDU(如果有必要,更新本地信息后),
    從DP端口將這些報文往樹的葉子方向
  3. 對于阻塞接口,應(yīng)該能周期性的收到DP發(fā)送過來的報文。

拓撲變化后的響應(yīng)

  1. 從上面過程可以看到,BPDU會周期性的從樹根往葉子發(fā)送。
  2. 每一個端口的最優(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報文格式

各字段的含義

在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é)點。

初始狀態(tài),自立山頭

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

發(fā)現(xiàn)強者,歸屬強者

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

歸順中央,統(tǒng)一全網(wǎng)

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樹。

樹長滿整個網(wǎng)絡(luò)(左邊是物理視圖,右邊是樹的邏輯實體)
注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)。
STP端口狀態(tài)機
STP端口狀態(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ā)送

BPDU發(fā)送時機

  1. 對于根橋,主動發(fā)送BPDU:根據(jù)Hello周期,主動通過所有DP發(fā)送BPDU
  2. 非根橋,中繼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)。

拓撲變化的實例分析

  1. 根橋宕機
    根橋如果down機的話,所有網(wǎng)絡(luò)都收不到?;顖笪?,到了MaxAge后,網(wǎng)絡(luò)重新選舉。
    (皇上駕崩,天下大亂,群雄逐鹿,重立新主)

  2. 某條鏈路break,比如下圖:SW1是ROOT,SW1和SW3之間cost 是100,其他cost 都是20.所以正常情況下,會將SW1和SW3之間的鏈路剪枝。如果SW1和SW2之間的鏈路出現(xiàn)故障,我們看看重新收斂過程如何。

一個例子
  1. 出現(xiàn)故障的鏈路是SW2的RP端口鏈路,SW2無法從他的RP端口收包根橋的?;頑PDU.
  2. 因為SW2也無法從其他端口收到BPDU?;睿砸欢螘r間過后,SW2認為網(wǎng)絡(luò)中沒有根了(實際上是因為信息的缺失而導(dǎo)致錯誤的認為)。SW2開始自立為王(根橋)。
  3. SW4發(fā)現(xiàn)根橋發(fā)生了變化,但他也不知道具體是什么情況,領(lǐng)導(dǎo)(上游節(jié)點)既然這么說了,就跟著領(lǐng)導(dǎo)走吧。他也宣稱根橋變成了SW2。并把這一信息向外擴散。
  4. 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ù)天下太平。

參考資料:

Cisco:網(wǎng)絡(luò)拓撲變化
STP與RSTP的比較

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容