1. 程式人生 > >生成樹與快速生成樹(STP、RSTP)原理

生成樹與快速生成樹(STP、RSTP)原理

STP生成樹(IEEE 802.1D)

  1. 為什麼需要生成樹?
    鏈路聚合技術只有線路的冗餘,沒有裝置的冗餘,如果要做裝置上的冗餘,就可以做生成樹。表面上看生成樹的作用是做裝置冗餘時,防止成環的一種途徑,但實際上可以避免做生成樹,使用堆疊技術和虛擬化技術來達到防止出現環路的作用(將兩個裝置做成一個裝置,使得整個拓撲還是一個樹狀結構),所以生成樹並不是必須項,但如果擔心交換機出現環路風險,就一定要使用生成樹。從冗餘角度來講,生成樹是不會帶來冗餘的,是因為冗餘出現了環路才使用生成樹的,並不是一個冗餘關係。
  2. 如果出現環路,怎麼使用生成樹來處理?
    交換網路出環的概率是非常大的,尤其是在企業網中,網路環境複雜,管理上的不嚴格是隨處可見的,所以大部分的企業網都會使用生成樹。環路會引發幾個現象:廣播風暴、MAC地址表反覆重寫,都會對交換機造成嚴重損害,都會迅速的把裝置搞成資源不足的情況,不管說是轉發資源還是MAC表的記憶體資源問題,都會造成宕機,導致資料無法通過交換機。
  3. 交換機如何防環?
    將拓撲結構做成樹狀結構,防止出環,凡是阻礙成樹的線路全部砍掉。
    生成樹是一種依靠BPDU資訊來形成交換機間通訊的技術

BPDU

在這裡插入圖片描述

  • 協議ID:表明哪一種生成樹
  • 版本:生成樹的版本(如cisco的pvst/pvst+)
  • Message type:BPDU的包的種類(配置BPDU、拓撲變更BPDU)
  • Flags:標記
  • Root ID:根ID
  • Cost of path:到達根的開銷,頻寬越大,開銷越小,疊加值
  • Bridge ID:自己的橋ID
  • Port ID:描述埠的兩個引數,埠優先順序、埠MAC
  • Message age:按照時間算,最大20s(Max age)
  • Hellotime:2s
  • Forward delay:15s

20s+15s*2=50s,即原始生成樹的切換時間
第一個20s的來源是BPDU最遲被收集到的時間,轉發延時牽扯到偵聽和學習,指的是一個數據包(無論是BPDU資料包還是普通資料包)在一個有限的交換網路中從一個交換機到達另一個交換機的轉發時間最長是15s。

原始生成樹的運算過程

總的來說,在最開始的時候,每個交換機會發送BPDU,收集完BPDU後開始選舉,選完根交換機選根埠,選舉完成後收斂完成。
傳送BPDU之前,交換機的介面會同步它的全域性BPDU引數,即交換機將BPDU同步給介面,介面將BPDU儲存後向外發送,到達對端介面的時候,對端介面由於同步了自己的全域性BPDU,會將自己的BPDU與收到的BPDU進行比對(BID),比對後同步較優的BPDU,此時交換機會認為較優BPDU的傳送者是本地的根交換機,同時介面會同步全域性BPDU後再同步給其他介面,因為週期的存在,其他介面會根據週期傳送所同步的BPDU,一直擴散。只要保證自己所發出的BPDU一定能被其他裝置接收到,全網一定會同步出一個唯一的根ID,這就是選根的過程,也因此必須等待20s,否則可能會導致某一條BPDU沒有同步結束,此時選的根就不一定是一個準確的根。如果想加快收斂,可以手動將max age改小,但不建議改動,後期生成樹因為更改了選舉方法,故不會有這樣的問題。
根介面:裝置對端的介面會被同步,被同步後會計算cost-path,遠端裝置的BPDU同步時,會疊加cost-path,其他裝置的介面在同步BPDU比對RID時會發現RID相同,接著會比對cost-path,裝置在同步全域性BPDU時,會保留最優的cost-path,此時被同步cost-path的介面即為根介面。如果cost-path依舊相等,就比對對方的BID,因為此時全域性BPDU被對端裝置同步了,此時的BID就是對端的BID,大部分人會認為是因為對端的BID越小,就越能成為下一代根,但實際上這是從結果推匯出來的結論,存在邏輯上的問題

然後比對對端的port ID(port優先順序/port MAC),在port優先順序相同時比對MAC,MAC值小為優。

如果要修改引數以達到更改原有線路的目的,cost-path一般在本端修改,PID優先順序在對端介面修改。

SW(config-if)#spanning-tree vlan 1 ? 
Cost			Change an interface’s per VLAN spanning tree path cost 
Port-priority		Change an interface’s spanning tree port priority

根的選舉

根據BID的引數來選,越小越優,先看優先順序後看MAC

根埠選舉

越小越優

  1. cost-path
  2. 對端BID 橋優先順序和橋MAC
  3. 對端的PID 埠優先順序

指定埠的選舉

一條線路上只能有一個指定埠
BID本交換機成根的可能性越大越能成為指定介面

狀態介面跳轉

為什麼要有狀態切換?
狀態切換的其中一個目的是要保證生成樹在收斂完成之前沒有環路,如果出現環路,資料有可能會無法傳遞,導致生成樹無法收斂。狀態切換就是為了保證不會出環並且按照既定步驟完成生成樹的收斂。

  1. blocking 不能收也不能傳送資料及BPDU,但可以監聽BPDU 20s(max age)
  2. Listening 收集BPDU資訊選舉,本質是選舉根介面,可以傳送BPDU 15s(forward delay)
  3. Learning 可以傳送普通資料,但不能轉發,學習介面轉發的MAC地址 15s(forward delay)
  4. Forwarding 可以轉發資料及BPDU

其他的生成樹都是在STP生成樹的基礎上改進的,STP生成樹最大的問題還是收斂過程太長,所以改進的方向也是以此為主

RSTP(IEEE 802.1w)

Cisco的快速生成樹和公有的快速生成樹還是有所區別的:公有的快速生成樹是所有的VLAN在一棵樹內,cisco的快速生成樹是每一個VLAN一棵樹。

RSTP的增強

STP的速度是由四個狀態跳轉決定的。可以改進的地方是blocking狀態,此處20s花在收集BPDU上了,是一種完全不能收發資料的狀態,在此的改進是讓生成樹在blocking之前就完成BPDU的收集,不需要再花20s,直接跳轉到listening狀態,隨時收發BPDU,此時在四個狀態上的優化已經到達極限。
RSTP刪除了3種埠狀態,增加了2種埠角色,並且把埠的屬性充分按照狀態和角色解耦,使其可以更加精確地描述埠,從而使得初學者更容易學習協議,同時加快拓撲收斂。通過埠角色的增補,卷花了生成樹協議的理解及部署。
RSTP的埠角色一共有4種:根埠、指定埠、替換(Alternate)埠、備份(Backup)埠,將非指定埠重新定義成替換和備份兩種角色,根據這兩種角色就可以做到快速的切換。
根埠和指定埠的作用通STP協議中定義,替換埠和備份埠的描述如下:
從配置BPDU報文傳送角度來看:替換埠就是由於學習到其它網橋傳送的配置BPDU報文而阻塞的埠,就是該埠與其他交換機構成了一個大環。交換機判斷環路的方式是收到了一個其他交換機發送回來的一個本由自己發出的BPDU從而確定出現環路,進而被阻塞成為替換埠;備份埠就是由於學習到自己傳送的配置BPDU報文而阻塞的埠,並沒有通過其他交換機轉發。替換埠是一種裝置的備份埠,備份埠是一種類似於介面的備份埠。
從使用者流量角度來看:替換埠提供了從指定橋到根的另一條可切換路徑,是一種已經確定角色的備份根埠的介面,當根端口出現問題,會自動切換到替換埠,在切換的過程中不會再進行選根,就意味著可以再節約15s,也不再需要再花15s去學習,而是將原來的根埠的BPDU資訊改為當前埠,就可以節約學習的時間,並且將總體的收斂時間縮短到2s之內,而且絕對不會出現環路;備份埠作為指定埠的備份,提供了另一條從根橋到相應網段的備份通路,也是被確定角色的埠,不會出現環路,學習和選根階段也如同替換埠一樣被省略。給一個RSTP域內所有埠分配角色的過程就是整個拓撲收斂的過程。

埠狀態的重新劃分

RSTP的狀態規範把原來的5中狀態縮減為3種。根據埠是否轉發使用者流量和學習MAC地址來劃分:

  1. 如果不轉發使用者流量也不學習MAC地址,那麼埠狀態就是Discarding狀態
  2. 如果不轉發使用者流量但是學習MAC地址,那麼埠狀態就是Learning狀態
  3. 如果急轉發使用者流量又學習MAC地址,那麼埠狀態就是Forwarding狀態

配置BPDU的處理髮生變化

拓撲穩定後配置BPDU報文的傳送方式:根橋按照Hello Timer規定的時間間隔傳送配置BPDU。其他非根橋裝置在收到上游裝置傳送過來的配置BPDU後們才會觸發發出配置BPDU,此方式使得STP協議計算複雜切緩慢。RSTP對此進行了改進,即在拓撲穩定後,無論非根橋裝置是否接收到橋傳來的配置BPDU報文,非根橋裝置仍然按照Hello Timer規定的時間間隔傳送配置BPDU,該行為完全由每臺裝置自主進行。

更短的BPDU超時計時

如果一個埠連續3個Hello Time時間內沒有收到上游裝置傳送過來的配置BPDU,那麼該裝置認為與此鄰居之間的協商失敗。而不像STP那樣需要先等待一個Max age。

處理次優BPDU

當一個埠收到上游的指定橋發來的RST BPDU報文時,該埠會將自身儲存的RST BPDU與收到的RST BPDU進行比較。如果該埠儲存的RST BPDU的優先順序高於收到的RST BPDU,那麼該埠會直接丟棄收到的RST BPDU,立即迴應自身儲存的RST BPDU。當上遊裝置收到下游裝置迴應的RST BPDU後,上游裝置會根據收到的RST BPDU報文中相應的欄位立即更新自己儲存的RST BPDU。由此,RSTP處理次等BPDU報文不再依賴於任何定時器通過超時解決拓撲收斂,從而加快了拓撲收斂。

快速收斂

Proposal/Agreement機制

當一個埠被選舉成為指定埠之後,在STP中,該埠至少要等待一個Forward Delay(Learning)時間才會遷移到Forwarding狀態。而在RSTP中,此埠會先進入DIscarding狀態,再通過Proposal/Agreement機制快速進入Forward狀態。這種機制必須在點到點全雙工鏈路上使用。

  1. 每一個VLAN一棵生成樹 BIDextend system ID是vlan ID
  2. 介面狀態改變,收斂時間減少
    Discarding ->learning ->forwarding 15+15=30s
  3. 埠角色改變 代替埠和備份埠
  4. BPDU的改變 TCN 建議機制
  5. 網路型別 1.p-to-p 2.share 3.edge

在這裡插入圖片描述
1.proposing:當一個指定埠處於Discarding或Learning狀態時,該變數置位,並向下遊交換裝置傳遞Proposal位被置位的RST BPDU。
2.Proposed:當埠收到對端的指定埠發來的攜帶proposal的RST BPDU時,該邊浪置位。該變數指示本網段上的指定埠希望儘快進入forwarding狀態。
3.Sync:當proposed被置位以後,收到proposal的根埠會依次為自己的其他埠置位sync變數,而收到proposal的非邊緣埠則會進入discarding狀態。
4.Synced:當埠轉到discarding狀態後,會將自己的synced變數置位。Alternate埠、backup埠和邊緣埠會馬上置位該變數。根埠監視其他埠的synced,當所有其他埠的synced全被置位,根埠會將自己的synced置位,然後傳回RST BPDU,其中agreement位被置位。
5.Agreed:當指定埠接收到一個RST BPDU時,如果該BPDU中的agreement位被置位且埠角色欄位是跟埠,該變數被置位。Agreed變數一旦被置位,指定埠馬上轉入forwarding狀態。

1.p0和p1兩個埠馬上都先成為指定埠,傳送RST BPDU。
2.A的p1口收到更優的RST BPDU,馬上意識到自己將成為根埠,而不是指定埠,停止傳送RST BPDU。
3.ROOT的p0進入discarding狀態,於是傳送的RST BPDU中把proposal置1.
4.A收到根橋傳送來的攜帶proposal的RST BPDU,開始將自己的所有埠進入sync變數置位。
5.P2已經阻塞,狀態不變;p4是邊緣埠,不參與運算;所以只需要阻塞費邊緣指定埠p3.
6.P2,p3,p4都進入discarding狀態之後,各埠的synced變數置位,根埠p1的synced也置位,於是便向p0返回agreement位置位的迴應RST BPDU。該RST BPDU攜帶和剛才根橋發過來的BPDU一樣的資訊,除了agreement位置位之外(proposal位清零)。
7.當s1判斷出這是對剛剛發出的proposal的迴應,於是埠p0馬上進入forwarding狀態。