STP工作原理 - kummer話你知

STP解決什么問題

生成樹協議(Spanning-Tree Protocol,以下簡稱STP)是一個用于在局域網中消除環路的協議。運行該協議的交換機通過彼此交互信息而發現網絡中的環路,并適當對某些端口進行阻塞以消除環路。由于局域網規模的不斷增長,STP已經成為了當前最重要的局域網協議之一。

二層網絡環路會引發哪些問題

環路導致網絡報文風暴:
由于在二層網絡中,廣播,組播,未知單播都采用了泛洪的方式,如果網絡中存在環路,會導致報文無限復制,直到最終網絡崩潰。

由于泛洪導致網絡報文轉發環路

環路導致MAC表震蕩
如上圖,在報文復制的過程中,SwitchB會發現PC1的報文一會兒從上面接口收到,一會兒從下面接口收到,反復震蕩,導致MAC表不穩定。
即使是已知單播,也可能會導致問題,如下圖:

已知單播導致的MAC震蕩

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

STP如何解決問題

下圖是一個有環路的網絡演示例子,我們看看STP如何在這個網絡中計算出一個生成樹,并將會導致環路的鏈路阻塞。


一個有環路的網絡
  • 1. 選根橋:首先各交換機根據優先級和MAC地址,選出一個BID最小的交換機,作為整個網絡的根。

相關術語:
網橋:比較早期的網絡中,稱交換機為網橋。在某些場景中網橋和交換機會交替使用。
網橋ID:BID—網橋的優先級+網橋MAC。
根橋:BID(網橋ID)最小的網橋定為根橋。在沒有配置優先級的網絡中,根橋將有MAC地址最小的網橋擔任。如果網絡中配置了各個交換機的優先級,則由優先級最小的交換機當人跟橋。

選出整個網絡的根節點
  • 2. 確定根端口、指定端口、可選端口

根端口和指定端口和可選端口的內涵:
根端口(RP-RootPort),交換機上最優的端口。

  • 根端口的概念是針對交換機的,是指(一個非根橋的STP)交換機上離根橋最近的端口。
  • 一個STP交換機上有且僅有一個RP。
  • 對于根橋發出的報文來看,流量從根端口進入交換機

指定端口(DP-DesignatedPort),鏈路上的最優端口。

  • 指定端口的概念是針對于某鏈路的,指定端口是鏈路上離根橋最近的端口。
  • 一個鏈路上有且僅有一個DP。
  • 對于根橋發出的報文來看,流量從指定端口流出交換機。

可選端口(AP-AlternatedPort):, 非最優端口

  • 即非根端口,也非指定端口,說明該端口不在生成樹上,則該端口需要阻塞。所以可選端口也稱為阻塞端口。

我們看看根端口RP和指定端口DP的簡單示例,對RP和DP有一個直觀的認識。指定端口DP就是樹中父節點上的端口,根端口RP就是樹中子節點上的端口。


一顆生成樹中的根端口和指定端口
  • 3. 關閉所有阻塞端口的流量轉發功能
    相當于把可能形成環路的端口流量轉發功能全部關閉(俗稱破環或剪枝),通過這樣的操作,將物理上的一個網狀拓撲改造為一個邏輯上的樹狀拓撲。從而消除網絡環路。

看看完整的示例,包括根端口RP,指定端口DP和可選端口AP。STP通過關閉AP端口的轉發功能,將物理上的網狀拓撲,轉變為邏輯上的樹狀拓撲。從而消除網絡環路。


網絡中的RP,DP和阻塞端口的完整示例

在整個網絡消除環路,穩定后,應該處于這樣一種狀態

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

拓撲變化后的響應

  1. 從上面過程可以看到,BPDU會周期性的從樹根往葉子發送。
  2. 每一個端口的最優BPDU都有一個有效期,如果超過這個有效期有沒收到BPDU,則認為該BPDU已經無效。嘗試重新收斂。

*---
*---

更多的細節

1. 協議基礎:報文格式

要實現STP功能,網橋之間必須要進行一些信息的交互,這些信息交互單元就稱為配置消息BPDU(BridgeProtocolDataUnit)。STPBPDU是一種二層報文,目的MAC是多播地址01-80-C2-00-00-00,所有支持STP協議的網橋都會接收并處理收到的BPDU報文。該報文的數據區里攜帶了用于生成樹計算的所有有用信息。具體如下:

BPDU報文格式

各字段的含義

在BPDU中,最核心的字段是根橋ID,跟路徑成本,發送網橋ID,端口ID四個字段。這四個字段組成四元組,用來比較兩個BPDU的“好壞”。四元組越小,說明越好。
注:發送網橋ID,端口ID僅僅在路徑成本相同時發揮作用

字段名 字段含義
協議ID: 該值總為0。
版本號: STP的版本(為IEEE 802.1d時值為0)。
報文類型: BPDU類型(配置BPDU=0,TCN BPDU=80)。
標記域: LSB(最低有效位)=TCN標志;MSB(最高有效位)=TCA標志。
根網橋ID: 根信息由2字節優先級和6字節ID組成。
這個信息組合標明已經被選定為根網橋的設備標識。
根路徑成本: 路徑成本為到達根網橋交換機的STP開銷。
表明這個BPDU從根網橋傳輸了多遠,成本是多少。
這個字段的值用來決定哪些端口將進行轉發,哪些端口將被阻斷。
發送網絡橋ID: 發送該BPDU的網橋信息。由網橋的優先級和網橋ID組成。
端口ID: 發送該BPDU的網橋端口ID。
計時器: 計時器用于說明生成樹用多長時間完成它的每項功能。
這些功能包括報文老化時間、最大老化時間、訪問時間和轉發延遲。
最大老化時間: 網橋將將根橋看做不可用前保留根ID的最大時間。
訪問時間: 根網橋連續發送BPDU的時間間隔。
轉發延遲: 網橋在監聽學習狀態所停留的時間。

2. 協議運行過程

  • 自認老大(根橋):最初,每一臺交換機都認為自己是根橋,嘗試向外通告這一信息。
  • 周期通告:STP交換機在每一個端口上定期(2s)發送BPDU報文
  • 發現強者,歸順強者:每臺交換機除了發送BPDU外,也從所有端口上接收BPDU,一旦在某端口上收聽到比自己發的還要“好”的BPDU,那么這個端口就提取該BPDU中的某些信息,更新自己的信息。并停止在該鏈路上發送BPDU。
    收到更好的BPDU后需要更新的信息包括:
    • 自己認為的根橋BID(總體決策):從所有端口中最好的BPDU中獲得。
    • 本路由器的根端口(RP,總體決策):從所有端口中最好的BPDU中獲得。
    • 鏈路上的指定端口(DP,端口決策):如果從該端口收到更好的BPDU,則說明別人李根橋更近,則自己端口不是DP,否則則認為自己是DP。

再次強調一下,比較BPDU的“好壞”的方式(自己的或其他交換機的),都是根據上面提到的四元組來完成的,即最低橋ID、最低根路徑成本,最低發送者BID,最低端口ID。該端口緩存他人BPDU后,自己則立即停止發送BPDU。
當發送BPDU的時候,交換機填充Sender BID字段的總是自己的BID,而填充Root BID字段的是“當前我所認為是根橋的”BID。

  • 最終收斂:此過程一直持續,直到最終網絡收斂:最優的根橋最終被選舉出來,并且RP,DP端口也被確定下來。整個網絡歸順到一顆以最優BID為根的生長樹上來。

3. 具體過程分析:選舉根橋

1. 初始狀態,自立山頭:,雖然A的BID最小,但初始狀態還沒有互通信息,各自自立山頭,此時正確的樹上僅有孤零零的一個根節點。

初始狀態,自立山頭

2. 發現強者,歸順強者:通過BPDU的對外通告,樹逐漸向外生長,收復C和D兩個節點,但B節點還不再王化之內。

發現強者,歸屬強者

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

歸順中央,統一全網

4. 具體過程分析:最佳樹的生成與RP和DP的確定

整個網絡的破環與剪枝過程與選舉根橋過程類似,都是從根橋出發,這棵樹逐步向外生長,直到最后長滿整個網絡。
1. 天地初開,一片混沌:此時正確的樹上僅一個跟節點,其他節點的信息都是錯誤或不可信的。

天地初開,一片混沌(左邊是物理視圖,右邊是樹的邏輯實體)

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

樹開始向外生長(左邊是物理視圖,右邊是樹的邏輯實體)

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

樹長滿整個網絡(左邊是物理視圖,右邊是樹的邏輯實體)
注1:當然樹的生長并不是一帆風順的,有時候由于網絡時延或定時器的原因,
某些節點可能會加入錯誤的分枝,但最終這些誤入歧途的節點都能重新找到正確的分枝加入

注2:雖然我們上面為了說明簡單,將根節點的選舉和DP,RP的確定分兩個階段來說明,
實際協議運行過程中,并沒有明確的區分這兩個階段。他們是統一在“最佳BPDU傳遞”這
個統一的協議處理流程中的。

5. 拓撲變化后的收斂

與拓撲變化后的收斂密切相關的幾個基本概念:
1. 端口狀態機
STP交換機端口一共有五個狀態:

  • Disable:表示端口還沒有使能
  • Blocking:表示端口是AP(即非DP,也非RP),不能進行報文轉發工作。
  • Listening,Learning,Forwarding:表示端口是DP或RP,可以進行報文轉發工作,但如果端口當選DP或RP就開始轉發工作的話,可能網絡中還有環路。(這是因為此時網絡還沒有完全收斂,可能自己的信息還不全,做出的決策時錯誤的;也有可能雖然自己的是正確決策,但別人還沒有獲得完整的信息,別人的決策不正確。),為了避免這種情況發生,STP采用了延遲轉發工作的決定,等待網絡完全穩定收斂下來后才進入轉發工作狀態。
STP端口狀態機
STP端口狀態機說明

2.幾個相關定時器

  • Hello Timer:STP交換機發送BPDU的時間間隔。當網絡拓撲穩定之后,該計時器的修改只有在根橋修改才有效。根橋會在之后發出的BPDU中填充適當的字段以向其他非根橋傳遞該計時器修改信息。但當拓撲變化之后,TCN BPDU的發送不受這個計時器的管理。
  • Forwarding Delay Timer:指一個端口Listening 和Learning的各自時間,默認為15秒,即Listening狀態持續15秒,隨后Learning狀態再持續15秒。這兩個狀態下的端口會處于Blocking狀態,這是STP用于避免臨時環路的關鍵。
  • Max Age:端口的BPDU老化的時間,前文已經探討過。端口會根據接收到的BPDU存儲所接收到的最好的四個信息(根橋BID、累計根路徑開銷、發送者BID和發送端口PID)。每次接收到合適的BPDU,端口都會啟動這個Max Age計時器。超過這個Max Age時間端口接收不到合適BPDU,就會認為該BPDU已經失效。這個時間默認為20秒。

3. 拓撲變化后重新收斂需要解決那些問題

  • 讓網絡邏輯拓撲重新恢復成一顆完整的樹。

網絡拓撲變化后,可能新增了鏈路,導致樹上又引入了環,此時需要重新破環。
也可能樹中某些鏈路斷了,導致樹的斷裂,此時需要啟用原來被刪鏈路,恢復樹的連通性。
甚至是根橋down掉了,需要重新選擇根橋。

解決方法:其實重新生成STP樹沒有什么特別的,其過程與初始收斂過程完全相同。
有一點需要說明的是:如果DR端口down了,或者根橋down了,需要等待MaxAge時間,
到了MAXAge時間后,通過BPDU的老化機制將無效BPDU刪除,并重新嘗試生成新的BPDU。

![Uploading Paste_Image_518231.png . . .]

  • 即使恢復了STP樹,拓撲變化可能會MAC表錯誤,需要盡快清除這些錯誤MAC,否則流量仍然不能恢復。

比如:一個網絡最初如下:假設網橋 B1 阻塞了通向 B4 的鏈路。A 和 B 是具有已建立連接的兩個工作站。流量從 A 到 B 進入 B1、B2、B3,然后進入 B4。


最初網絡拓撲

現在,假設 B2 和 B3 之間的鏈路發生故障。在 B1 以轉發模式將其端口應用于 B4 之前,A 和 B 之間的通信會中斷(使用默認參數的情況下最長中斷 50 秒),這個比較容易理解。但是我們發現,即使B1-B4之間鏈路打開了,A->B的通訊仍然無法恢復,這是因為當 A 要向 B 發送幀時,B1 交換機上MAC表錯誤導致的,(B1仍然認為主機B的出接口是B2),數據包將被發送到黑洞。當B要到達A. Communication丟失在五分鐘,直到A和B MAC地址的條目老化。


錯誤的MAC表導致轉發黑洞

解決方法:為了盡快恢復流量轉發,STP引入了變更通知和應答消息
在常規 STP 操作中,網橋一直從其根端口上的根網橋接收配置 BPDU。但是,它從未派出BPDU往根網橋。為此,引入了稱為拓撲更改通知 (TCN) BPDU 的特殊 BPDU。因此,當網橋需要對拓撲更改發出信號時,它開始在其根端口上發送 TCN。指定的網橋接收并確認 TCN,還為自己的根端口生成另一個 TCN。此過程將一直持續,直到 TCN 發現根網橋為止。
TCN 是非常簡單的 BPDU,不包含網橋每 hello_time 秒(這是本地配置的 hello_time,不是配置 BPDU 中指定的 hello_time)發送的任何信息。指定的網橋通過立即發回設置了拓撲更改確認 (TCA) 位的正常配置 BPDU 來確認 TCN。通知拓撲更改的網橋不停地發送其 TCN,直到指定的網橋確認它為止。因此,指定的網橋將應答 TCN,即使不從其根網橋接收配置 BPDU 也是如此。

變更通知上報,直到樹根

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

BPDU從根向下發送

BPDU發送時機

  1. 對于根橋,主動發送BPDU:根據Hello周期,主動通過所有DP發送BPDU
  2. 非根橋,中繼BPDU:從RP收到BPDU,從所有DP發送出去。

什么時候認為是拓撲發生了變化

1.網橋至少有一個指定端口,并且某端口從其他(Blocking、Listening、Learning)狀態轉到Forwading狀態。
2.某端口由Forwading、Learning狀態轉到Blocking狀態。

拓撲變化的實例分析

  1. 根橋宕機
    根橋如果down機的話,所有網絡都收不到保活報文,到了MaxAge后,網絡重新選舉。
    (皇上駕崩,天下大亂,群雄逐鹿,重立新主)

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

一個例子
  1. 出現故障的鏈路是SW2的RP端口鏈路,SW2無法從他的RP端口收包根橋的保活BPDU.
  2. 因為SW2也無法從其他端口收到BPDU保活,所以一段時間過后,SW2認為網絡中沒有根了(實際上是因為信息的缺失而導致錯誤的認為)。SW2開始自立為王(根橋)。
  3. SW4發現根橋發生了變化,但他也不知道具體是什么情況,領導(上游節點)既然這么說了,就跟著領導走吧。他也宣稱根橋變成了SW2。并把這一信息向外擴散。
  4. SW3收到SW4的宣告,發現不對,SW1應該比SW2更強,并且自己離SW1更近,隨即SW3宣告SW1應該是老大,并自己變成該網段的DP,開始在該網段上發送BPDU。隨后大軍壓境,重新收復SW4和SW2.最終恢復天下太平。

參考資料:

Cisco:網絡拓撲變化
STP與RSTP的比較

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容