802.1D STP

STP(spanning tree protocol,擴充樹協定)
IEEE代號為802.1D
在實體有互連設備上產生邏輯樹狀結構,可避免frame傳送發生loop
ps:第二層frame無ttl(time to live,存活時間)的設定,因此可能造成loop
路徑中斷可提供備援路徑(改變PORT狀態)
增加大網路環境擴充性
屬OSI layer2
ps:原為dec設計,後來ieee建立自己的版本為802.1d

stp可能產生的問題
依預設優先權自動計算stp可能使網路效能變差:
 因為效能最差或拓置位置最差的switch可能變成root bridge,
 當所有switch都需流經效能或位置最不好的root bridge時,這會變成bottleneck
解決辦法:
 將理想與備援用的switch優先權調高,使較快或位置較好的設備成為root bridge以計算較出較好的stp

stp有以下幾類 
cst(common spanning tree):也就是802.1d,一般的stp,多個VLAN一個STP,只在802.1q上運作 
pvst(per vlan spanning tree):cicso專屬協定,一個VLAN一個STP,只在ISL上運作,且無法與他廠的stp,rstp相容
pvst+:cisco專屬協定,一個VLAN一個STP,可在ISL和802.1q運作,也和其他廠牌的stp,rstp相容
RSTP(rapid stp,快速擴張樹):ieee802.1w,改良stp的收斂速度,以滿足語音和視頻的需求
MST(multiple stp,多重擴張樹):ieee802.1s,允許網管在trunk上建置多個擴張樹,並對應到一個spanning tree instance

…………………………………… 

loop可能引發的問題有:
broadstorm(廣播風爆)
multiframe(封包重覆)
table instablity(mac表不穩定)

loop流程 
假設有2switch只有port1和port2,port1與pc1網路連結,而port2與pc2網路連結(loop情況)
1
(src mac)pc1 傳送frame(unicast)到(dst mac)pc2,
根據listen規則,pc1的frame會進入switch1和switch2的port1
mac-table如下
switch1:null on port1
switch1:null on port1
2
switch1的port1收到frame,根據learn規則記錄(src mac)pc1mac on port1,並根據flood規則將frame從port2送出
switch2的port1收到frame,根據learn規則記錄(src mac)pc1mac on port1,並根據flood規則將frame從port2送出
mac-table如下
switch1:pc1mac on port1
switch1:pc1mac on port1
3
根據listen規則,switch1送出的frame會進入switch2的port2
switch2根據learn規則將記錄更改成(src mac)pc1mac on port2,並根據flood規則將frame從port1送出
根據listen規則,switch2送出的frame會進入switch1的port2
switch1根據learn規則將記錄更改成(src mac)pc1mac on port2,並根據flood規則將frame從port1送出
mac-table如下
switch1:pc1mac on port2 (mac-table更動第1次)
switch1:pc1mac on port2 (mac-table更動第1次)
4
根據listen規則,switch2送出的frame會進入switch1的port1
根據learn規則將記錄更改成(src mac)pc1mac on port1,並根據flood規則將frame從port2送出
根據listen規則,switch1送出的frame會進入switch2的port1
根據learn規則將記錄更改成(src mac)pc1mac on port1,並根據flood規則將frame從port2送出
mac-table如下
switch1:pc1mac on port1 (mac-table更動第2次)
switch1:pc1mac on port1 (mac-table更動第2次)
5
不斷重覆,mac-table會不斷改變,frame會不斷從port1和port2送出塞滿整個網路
mac-table如下
switch1:pc1mac on port1 (mac-table更動第n次)
switch1:pc1mac on port1 (mac-table更動第n次)

…………………

id type
bridge id:用來識別每一台switch,格式有以下2種
 traditional 802.1d:格式為bridge priority(16bit)+unique mac address(48bit),priority預設為32768
 802.1t:格式為priority(4bit)+vlan id/system id(12bit)+nonunique mac address(48bit)
port id:用來識別每一個port,mac位置也越大,通常port id越大  

bridge role
Root Bridge:網路中bridge id最低的設備,一個網路中只會有一個 
 ps:將設備優先權設低可做root bridge,常用在自己決定最佳化路徑時
non-root/Designated Bridge(代理橋接器):有designated port的橋接器 

port role
RP(Root Port):從此port出去會往root bridge的方向,且是抵達root bridge的最短路徑的埠
 Root Path Cost:bridge經由其root port到root bridge的路徑費用,根據path cost累計 
 Transmission Cost/Path Cost:各port皆有,訊框經該port傳進連接區域網路的費用,傳送速率越快的區域網路,和其相連接的port費用越小
DP(Designated Port):其他設備進入此port將有條最少費用的路徑到達root bridge
 ps:root bridge的其他port必為designated port,因為每個port的root path cost=0
NDP(non-Designated port):blocking state的port 

ps:
path cost
如下
bandwidth,oldcost,newcost
4Mbps ,250 ,250
10Mbps ,100 ,100
16Mbps ,63 ,62
45Mbps ,22 ,39
100Mbps ,10 ,19
155Mbps ,6 ,14
622Mbps ,2 ,6
1Gbps ,1 ,4
10Gbps ,0 ,2  tie-breaking decision process
stp決策參數,包括以下
Lowest root bridge ID
Lowest root path cost to root bridge
Lowest sender bridge ID
Lowest sender port ID stp port state

port狀態訊框BPDU時間mac位置 
Blocking(停滯狀態)  可收   無root port和designated port狀態
交換器開機時通常為此狀態
Listening(傾聽狀態) 可收/可送 暫時性
15秒結束
 剛得到root port或designated port,並在forward delay內
若此路徑不是通往root bridge的最低成本將會回到blocking狀態
Learning(學習狀態) 可收/可送 暫時性
15秒結束
可學習forward delay內未被取消root port或designated port
開始產生mac table
Forwarding(轉送狀態)可傳送可收/可送 可學習確定屬於擴張樹的一部分(root port或designated port)
可執行轉送訊框的任務,…等
Disabled(關閉狀態)    管理上的關閉,不參與STP操作

stp timer 
Forward Delay(轉送延遲時間):
一筆訊框從開始傳送到訊框經過所有橋接器所需要最長的時間,一個週期預設15sec
ps:all forward delay 30sec=listening forward delay 15sec+learning forward delay 15sec
ps:設太低可能會形成loop 
Maximum Age(BPDU保存時間):
從相鄰switch的DP來的bpdu的最大保存時間,預設20sec 
Hello Time(問候時間):
root bridge產生configure bpdu的間隔,偵測網路狀態用,預設2sec 
ps:新的stp收斂時間最多花費50sec,其中max age 20sec以及all forward delay 30sec 

…………….

建立spanning tree(所有LAN內bridge到root bridge的path cost為最小)
演算法在每個bridge上執行, 形成所有bridge間的一個通訊協定
1找出root bridge:一個lan只有一個,任一橋接器在二個forward delay內不收到比自己小的root bridge id就可確認自己是root bridge
2找出root port:一個device一個,確認自己不是root bridge後便立刻尋找自己的root port
3找出designated port:一個lan segment一個,designated port由所有和其相連接的橋接器共同來尋找
 若有多個DP可選時,則選擇順序為send-bridge id,port cost,port id
ps:若device的port即不是root port也不是designated port,則該port進入blocking state
stp收斂完成情況
每個port的狀態不是forwarding就是blocking時,且以下會成立
 此LAN有一個root bridge
 每個非root bridge有一個root port
 每個lan segment有一個designated port

root bridge election process(找出root bridge)
1
各switch啟動後,會假設自己為root bridge,
並送出bpdu,而root bridge id和sender bridge id都等於own bridge id
2
各switch收到其他switch的bpdu,
若root bridge id比自己優先權高,則將以此替換自己的root bridge id,而自己屬於nonroot bridge 
若在時間內沒有其他switch比自己優先權高,則表示自己被選為root bridge 
ps:root bridge id的值越小,優先權越高
3
此步驟會持續進行,預設每2秒偵測一次root bridge id 

nonroot bridge elected root port(找出root port)
1
root bridge送出bpdu,
root path cost=0
2
最靠近root bridge的nonroot bridge收到該bpdu後,該介面則為root port,
且root path cost+=root path,並放入bpdu內送出
3
靠近該台nonroot bridge收到該bpdu後,該介面則為root port
且root path cost+=root path,並放入bpdu內送出
4
重覆2-3步驟直到各nonroot bridge找到root port並定義好root path cost

……………………………………………….

維護擴張樹(因設備的故障或損壞可能造成斷裂)
方法主要分為兩部份:
斷裂偵測:root bridge負責提供原始訊息
擴張樹重組:取代該designated bridge角色的工作 

topology change的步驟 

Direct Topology Changes
nonroot switch a發現root port中斷時
1 發現中斷的switch傳送TCN BPDU給root bridge通知有變動
ps:nonroot switch a無法透過root port傳送TCN BPDU,因為己中斷
2 root bridge傳送config BPDU with TCN給下游switch
3 所有nonroot switch收到config BPDU with TCN後,縮短各自的BridgeTable Aging Times
4 nonroot switch a將收到config BPDU with TCN的介面設為root port
5 nonroot switch a的root port的狀態會從listening到learning(15sec),在到forwarding(15sec)
恢復連線時間total 30sec

Indirect Topology Changes
nonroot switch a發現root port無法收到bpdu,但線路正常
1 nonroot switch a等到max age後(20sec),開始準備更新bpdu
2 nonroot switch a在其他port收到bpdu(2sec),將此port設為root port
3 nonroot switch a的root port的狀態會從listening到learning(15sec),在到forwarding(15sec)
恢復連線時間total 52sec

Insignificant Topology Changes
nonroot switch a發現non-redundant的介面中斷或啟用 
1 該介面失去stp功能或恢復stp功能並依規則變為forwarding status 
2 nonroot switch a傳送TCN BPDU給root bridge通知有變動
3 root bridge傳送config BPDU with TCN給下游switch
4 所有nonroot switch收到config BPDU with TCN後,縮短各自的BridgeTable Aging Times
ps:non-redundant的介面:連接單一線路的設備,包括未做stp的switch,pc
ps:一但pc夠多,則bridgetable會一直被修改,也表示會有更多的broadcast發生 

……………..

BPDU(Bridge Protocol Data Unit,橋接器通訊協定資料單元)
bridge彼此之間送訊框的單元,設定stp用
若三次沒送BPDU表示該設備己掛,次要bridge會接手
ps:bpdu利用multicast技術,預設STP multicast address為01-80-c2-00-00-00

bpdu分為:
Configuration BPDU:
 spanning-tree的建立時各bridge用此種bpdu交換訊息
 當spanning-tree被建立後,只有root bridge能送此種bpdu 
TCN(Topology Change Notification) BPDU
 發現擴張樹有變動情況時通知root bridge,ex:斷線
 收到該bpdu的device會縮短bridge table aging times

Configuration BPDU訊框
欄位如下:
protocol id(2byte):通訊協定辨識碼,
version(1byte):IEEE 802.1D擴張樹通訊協定版本為 0000 0000
message type(1byte):BPDU種類,0000 0000為Configuration BPDU,1000 0000為TCN BPDU
flags(1byte):有架構變更旗標(第1bit)及架構變更回覆旗標(第8bit)
root bridge id(8byte):記錄傳送此BPDU的橋接器認定的root bridge的辨識碼,前2byte為可設定辨識碼, 後6byte為MAC 位址
root path cost(4byte):記錄傳送此BPDU之橋接器之root path cost
send bridge id(8byte):傳送此BPDU的橋接器的辨識碼
port id(2byte):傳送此BPDU的橋接器埠辨識碼,priority(1byte)+interface sn(1byte)
Message Age(2byte):此 BPDU 已經在網路中生存的時間 (in 256ths of a second)
Maximum Age(2byte):此 BPDU 之最大生存時限,若想減少BPDU流量可加大秒數 (in 256ths of a second)
Hello Time(2byte):root bridge產生BPDU的間隔時間,預設2秒 (in 256ths of a second)
Forward Delay(2byte):bridge使用的時間參數 (in 256ths of a second)辨別所用的通訊協定

TCN BPDU訊框
欄位如下:
protocol id(2byte):辨別所用的通訊協定,預設為0 
version(1byte):IEEE 802.1D擴張樹通訊協定版本為 0000 0000
message type(1byte):BPDU種類,0000 0000為configuration BPDU,1000 0000為TCN BPDU