BPDU:bridge protocol data unit,網橋協議數據單元。
網絡中全部設備使能STP後,每一臺設備都覺得本身是根橋。此時,每臺設備僅僅收發配置BPDU,而不轉發用戶流量,全部的端口都處於listening狀態,全部設備經過交換配置BPDU後,進行選舉工做,選出根橋、根端口和指定端口。算法
BPDU報文的交互過程
![在這裏插入圖片描述](http://static.javashuo.com/static/loading.gif)
根橋BID,累計根路徑開銷、發送者BID,發送端口PID構成有序組。配置BPDU會按照Hello Timer規定的時間間隔來發送。網絡
STP算法實現的基本過程
一、初始狀態
因爲每一個橋都覺得本身是根橋,因此在每一個端口所發出的BPDU中,根橋字段都是用各自的BID,root path cost字段是累計的到達根橋的開銷,發送者BID是本身的BID,端口PID是發送該BPDU端口的端口ID。ide
二、選擇根橋
網絡初始化時,網絡中全部的STP設備都自覺得根橋,根橋ID爲自身的BID,經過交換BPDU,設備之間比較BID,BID最小的設備被公認爲根橋。至此,根橋肯定。blog
三、選擇根端口和指定端口
3.1 非根橋將接收最優BPDU的那個端口定爲根端口。
最優配置消息的選擇過程
1 每一個端口將收到的配置消息與本身的配置消息進行比較
- 若是收到的配置消息優先級比較低,則將其直接丟棄,對本身的配置消息不進行任何處理;
- 若是收到的配置消息優先級較高,則用該配置消息的內容將本身配置消息的內容替換掉。
- 若是收到的配置消息優先級與本身相同, 則將其直接丟棄。
2 設備將全部端口的配置消息進行比較,選出最優的配置消息
3.2 設備根據根端口的配置消息和根端口的路勁開銷,爲每一個端口計算一個指定端口配置消息:
- RBID字段替換爲RP的收到的BPDU中的RBID字段(BPDU中原來的RBID字段爲自身BID,因爲從RP收到的BPDU中獲得了真正的RBID,將此字段進行替換)
- 根路徑開銷字段替換爲RP收到的根路徑開銷加上RP對應的路徑開銷。(原來爲0,即根橋全部端口到根橋的路徑開銷爲0)
- 發送者BID替換爲自身設備的ID
- 發送端口PID替換爲自身端口ID
3.3 設備將計算出的配置消息與角色待定端口本身的配置消息進行比較:
- 若是計算出的配置消息更優,則該端口被肯定爲指定端口,其配置消息也被計算出的配置消息替換,並週期性地向外發送;
- 若是該端口本身的配置消息更優,則不更新該端口的配置消息並將該端口阻塞,該端口將再也不轉發數據,且只接收不發送配置消息。
STP算法實現過程
![在這裏插入圖片描述](http://static.javashuo.com/static/loading.gif)
A,B,C的優先級分別爲0,1,2,A與B之間,A與C之間,B與C之間鏈路的路徑開銷分別爲5,10,4.接口
1 各設備的初始狀態
注意:四元組:{根橋ID,累計根路徑開銷,發送者BID,發送端口PID}圖片
A
端口名稱 |
端口的配置消息 |
Port A1 |
{0,0,0,pa1} |
Port A2 |
{0,0,0,pa2} |
B
端口名稱 |
端口的配置消息 |
Port B1 |
{1,0,1,pb1} |
Port B2 |
{1,0,1,pb2} |
C
端口名稱 |
端口的配置消息 |
Port C1 |
{2,0,2,pc1} |
Port C2 |
{2,0,2,pc2} |
2 各設備的比較過程及結果
A
比較過程
- Port A1收到Port B1的配置消息{1,0,1,Port B1},發現本身的配置消息{0,0,0,Port A1}更優,因而將其丟棄。
- Port A2收到Port C1的配置消息{2,0,2,Port C1},發現本身的配置消息{0,0,0,Port A2}更優,因而將其丟棄。
- DeviceA發現本身各端口的配置消息中的根橋和指定橋都是本身,因而認爲本身就是根橋,各端口的配置消息都不做任何修改,此後便週期性地向外發送配置消息。
比較結果
- Port A1:{0,0,0,Port A1}
- Port A2:{0,0,0,Port A2}
B
比較過程一
- pb1收到pa1的發來的配置消息{0,0,0,pa1},發現比本身的配置消息{1,0,1,pb1}更優,因而更新本身的配置消息。
- pb2收到pc2發來的配置消息{2,0,2,pc2},發現本身的配置消息{1,0,1,pb2}更優,因而將其丟棄。
比較結果二
- PB1:{0,0,0,PA1}
- PB2:{1,0,1,PB2}
比較過程二
- B比較本身各端口的配置消息,發現PB1的配置消息最優,因而將其指定爲根端口,,其配置消息不變。
- B根據根端口PB1的配置消息和路徑開銷,爲PB2計算出指定端口的配置消息{0,5,1,PB2},而後與BP2自己的配置消息進行比較,發現計算出的配置消息更優,因而PB2被定爲指定端口,其配置消息也被替換爲計算出的配置消息,並週期性向外發送。
計算結果二
- 根端口PB1:{0,0,0,PA1}
- 指定端口PB2:{0,5,1,PB2}
C
計算過程一
- PC1收到PA2的配置消息{0,0,0,PA2},發現其比本身的配置消息{2,0,2,PC1}更優,因而更新本身的配置消息。
- PC2收到PB2更新前的配置消息{1,0,1,PB2},發現其比本身的配置消息{2,0,2,PC2}更優,因而更新本身的配置消息。
計算結果一
- PC1:{0,0,0,PA2}
- PC2:{1,0,1,PB2}
計算過程二
- C比較本身各端口的配置消息,發現PC1的配置消息最優,因而該端口被肯定爲根端口,其配置消息不變。
- C根據根端口的配置消息和路徑開銷,爲PC2計算出指定端口的配置消息{0,10,2,PC2},而後與PC2自己的配置消息{1,0,1,PB2}進行比較,發現計算出的配置消息更優,因而PC2被肯定爲指定端口,其配置消息更新爲計算出的配置消息
計算結果二
- PC1:{0,0,0,PA2}
- PC2:{0,5,1,PB2}
計算過程三
- C比較PC1的根路徑開銷10與PC2的根路勁開銷9,發現後者更小,因而PC2的配置消息更優,因而PC2被肯定爲根端口,其配置消息不變。
- C根據根端口的配置消息和路徑開銷,爲PC1計算出指定端口的配置消息{0,9,2,PC1},而後與PC1自己的配置消息{0,0,0,PA2}進行比較,發現自己的配置消息更優,,因而PC1被阻塞,其配置消息不變。今後,,PC1再也不轉發數據,直到有觸發STP計算的新狀況出現,如B與C之間的鏈路down掉。
網絡收斂後,根橋會按照必定的時間間隔產生並向外發送配置BPDU,其餘設備收到該配置BPDU後,若是優先級比本身的配置BPDU高,則非根橋設備會根據收到的配置BPDU中攜帶的信息更新本身相應的端口存儲的配置BPDU信息,不然會丟棄該配置BPDU。rpc
STP 拓撲變化
![TCN的發送和TC的泛洪](http://static.javashuo.com/static/loading.gif)
- T點接口發生變動後,下游設備會不間端地向上遊設備發送TCN BPDU報文。
- 上游設備收到下游設備發來的TCN BPDU報文後,只有指定端口處理TCN BPDU報文,其餘端口也有可能收到TCN BPDU報文,但不會處理。
- 上游設備會將配置BPDU報文中的flags字段中的TCA位置1,而後發送給下游設備,告知下游設備中止發送TCN BPDU報文。
- 上游設備複製一份TCN BPDU報文,向根橋方向發送。
- 重複步驟1,2,3,4.直到根橋收到TCN BPDU報文。
- 根橋把配置BPDU報文中flags的TC位和TCA位同時置1 後發送,TC位置1 是爲了通知下游設備直接刪除橋MAC地址表項,TCA位置1 是爲了通知下游設備中止發送TCN BPDU報文。
說明:
- TCN BPDU報文主要用來向上遊設備乃至根橋通知拓撲變化。
- 置位的TCA標記的配置BPDU報文主要是上游設備用來告知下游設備已經知道拓撲變化,通知下游設備中止發送TCN BPDU報文。
- 置位的TC標記的配置BPDU報文主要是上游設備用來告知下游設備拓撲發生變化,請下游設備直接刪除橋MAC地址表項,從而達到快速收斂的目的。
總結
選舉方法
- 一、選擇根橋
- 二、非根橋上選擇根端口
- 三、衝突域上選擇指定端口
- 四、既不是RP也不是DP的就是AP
在穩定STP網絡中端口狀態只有2種
一、discasrding(AP)
二、forwarding(RP.DP)
最優BPDU的選擇
- 1 root id 最小
- 2 rpc積累和
- 3 bid最小
- 4 pid最小
選舉的算法
- root id 最小是根橋
- 非根橋bpdu最好的端口是RP
- 根據RP計算DP的BPDU參數,若是比指定端口的自己的BPDU參數好,則該端口爲DP端口,若是沒有比指定端口自己的BPDU參數好,則該端口爲AP。
RP失效,存在AP,網絡須要30s恢復鏈接
RP失效,不存在AP,網絡須要50s恢復鏈接