STP生成樹協議筆記之(三) : 協議報文的抓包解析
為了計算生成樹,交換機之間需要交換相關的信息和參數,這些信息和參數被封裝在BPDU(Bridge Protocol Data Unit)中。
BPDU的類型
BPDU有兩種類型:配置BPDU和TCN BPDU。
配置BPDU描述本設備的配置信息,包含了橋ID、路徑開銷和端口ID等參數。STP協議通過在交換機之間傳遞配置BPDU來選舉根交換機,以及確定每個交換機端口的角色和狀態。在初始化過程中,每個橋都主動發送配置BPDU。在網絡拓撲穩定以后,只有根橋主動發送配置BPDU,其他交換機在收到上游傳來的配置BPDU后,才會發送自己的配置BPDU。
TCN BPDU是指下游交換機感知到拓撲發生變化時向上游發送的拓撲變化通知。
STP幀格式
字段內容 |
說明 |
Protocol Identifier |
協議ID=“0” |
Protocol Version Identifier |
協議版本標識符,STP為0,RSTP為2,MSTP為3。 |
BPDU Type |
BPDU類型,MSTP為0x02。 0x00:STP的Configuration BPDU 0x80:STP的TCN BPDU(Topology Change Notification BPDU) 0x02:RST BPDU(Rapid Spanning-Tree BPDU)或者MST BPDU(Multiple Spanning-Tree BPDU) |
Flags |
對於“標記域”(Flags),第一個bit(左邊、高位bit)表示“TCA(拓撲改變響應)”,最后一個bit(右邊、低位bit)表示“TC(拓撲改變)”。 |
Root Identifier |
根橋的橋ID。網橋ID都是8個字節——前兩個字節是網橋優先級,后6個字節是網橋MAC地址。 |
Root Path Cost |
根路徑開銷,本端口累計到根橋的開銷。 |
Bridge Identifier |
發送者的橋ID,本交換機的橋ID。 |
Port Identifier |
發送端口的PID,發送該BPDU的端口ID。 |
Message Age |
配置BPDU在網絡中傳播的生存期。 |
Max Age |
配置BPDU在設備中能夠保存的最大生存期。 |
Hello Time |
配置BPDU發送的周期(發送兩個相鄰BPDU間的時間間隔)。 |
Forward Delay |
端口狀態遷移的延時(控制Listening和Learning狀態的持續時間)。 |
抓包分析BPDU數據包內容
實驗的拓撲圖如上。一開始,所有的交換機都會認為自己是根橋,自己的所有端口都是指定端口,參與轉發配置BPDU報文。
圖中紅框內的是一些STP協議比較重要的時間參數:
Hello Time是指運行STP協議的設備發送配置BPDU的時間間隔,用於檢測鏈路是否存在故障。交換機每隔Hello Time時間會向周圍的交換機發送配置BPDU報文,以確認鏈路是否存在故障。當網絡拓撲穩定后,該值只有在根橋上修改才有效。默認的Hello Time的值是2秒。
Message Age : 如果配置BPDU是根橋發出的,則Message Age為0。否則,Message Age是從根橋發送到當前橋接收到BPDU的總時間,包括傳輸延時等。實際實現中,配置BPDU報文每經過一個交換機,Message Age增加1。
Max Age:是指BPDU報文的老化時間,可在根橋上通過命令人為改動這個值。Max Age通過配置BPDU報文的傳遞,可以保證Max Age在整網中一致。非根橋設備收到配置BPDU報文后,會將報文中的Message Age和Max Age進行比較:如果Message Age小於等於Max Age,則該非根橋設備會繼續轉發配置BPDU報文。如果Message Age大於Max Age,則該配置BPDU報文將被老化掉。該非根橋設備將直接丟棄該配置BPDU,並認為是網絡直徑過大,導致了根橋連接失敗。默認的Max Age值是20秒。
Forward Delay:當拓撲發生變化,新的配置消息要經過一定的時延才能傳播到整個網絡,這個時延稱為Forward Delay,一般指從listening狀態到learning狀態,或是從leaning狀態到Forwarding狀態所需要的時間,協議默認的Forward Delay值是15秒。
(1)通過抓包點A(LSW4的G0/0/2端口)可知,此時LSW4默認認為自己是根橋,所以發送的BPDU中Root Identifier填寫的是自己的橋ID,Root Path Cost(根路徑開銷)填的是0,Message Age中填的也是0。接着將這個BPDU發送給LSW2。其余的交換機也會重復這個操作。
(2)LSW2接收到LSW4的BPDU報文,查看報文中的Root Identifier字段,發現該報文優先級被他本身要高,所以將自己的BPDU報文中的Root Identifier字段從自身改為LSW4的橋ID,Message Time加一,同時計算根路徑開銷(端口開銷默認為20000),再發給其他交換機。如圖為抓包點B(LSW2的G0/0/12)的報文截圖。
(3)等到所有的交換機都完成了選舉,進入穩定的狀態,則只會身為根橋的LSW4會每隔Hello Time時間發送配置一次配置BPDU,告知整個STP網絡根橋正常運行。
如果拓撲發生了變化(如根橋故障,鏈路故障等),STP又是如何感知到且作出改變的呢?
STP拓撲發生變化時的處理方式
情況一:根橋故障
在穩定的STP拓撲里,非根橋會定期收到來自根橋的BPDU報文。如果根橋發生了故障,停止發送BPDU報文,下游交換機就無法收到來自根橋的BPDU報文。如果下游交換機一直收不到BPDU報文,Max Age定時器就會超時(Max Age的默認值為20秒,約為10次Hello Time默認值的時間),從而導致已經收到的BPDU報文失效,此時,非根交換機會互相發送配置BPDU報文,重新選舉新的根橋。根橋故障會導致50秒左右的恢復時間,恢復時間約等於Max Age加上兩倍的Forward Delay收斂時間。
需要:Max Age + 2*Forward Delay = 50 秒
驗證:根橋已經重新選舉為LSW1
情況二:直連鏈路故障
此例中,LSW1和LSW3使用了兩條鏈路互連,其中一條是主用鏈路,另外一條是備份鏈路。生成樹正常收斂之后,如果檢測到LSW1的根端口(G0/0/15)鏈路發生物理故障,則其會按照STP協議規則重新選舉根端口,則其Alternate端口(G0/0/8)會遷移到Listening、 Learning、Forwarding狀態,經過2倍的Forward Delay后恢復到轉發狀態。
需要: 2*Forward Delay = 30 秒
驗證:LSW1的根端口已重新選舉為G0/0/8
情況三:非直連鏈路故障
如上圖,根橋交換機LSW4與LSW3之間的鏈路發生了某種故障(非物理層故障),LSW3因此在Max Age時間內收不到來自LSW4的BPDU,則自己作為新的根橋開始發送BPDU。LSW2也會繼續從原根橋LSW4接收BPDU報文,因此會忽略LSW3發送的BPDU報文。
由於LSW2的預備端口(Alternate)端口再也不能收到包含原根橋ID的BPDU報文。其Max Age定時器超時后,LSW2會切換Alternate端口為指定端口並且轉發來自其根端口的BPDU報文給LSW3。LSW3在收到優先級比自己高的BPDU報文后,放棄宣稱自己是根橋並開始收斂端口為根端口。非直連鏈路故障后,由於需要等待Max Age加上兩倍的Forward Delay時間,端口需要大約50秒才能恢復到轉發狀態。
需要:Max Age + 2*Forward Delay = 50 秒
驗證:我們對LSW3的G0/0/10端口進行抓包分析
時間節點一:根橋宣告為LSW4,BPDU是從LSW4發送過來的。根路徑為LSW4-LSW3,則根路徑開銷為20000。
時間節點二:LSW3超時沒有收到根橋的配置BPDU,所以宣告自己為根橋。
時間節點三:LSW3收到來自LSW2發來的配置BPDU,發現自己的橋ID優先級較低,重新選舉自己的根端口和指定端口。
情況四:拓撲改變導致MAC地址表錯誤
在交換網絡中,交換機依賴MAC地址表轉發數據幀。缺省情況下,MAC地址表項的老化時間是300秒。如果生成樹拓撲發生變化,交換機轉發數據的路徑也會隨着發生改變,此時MAC地址表中未及時老化掉的表項會導致數據轉發錯誤,因此在拓撲發生變化后需要及時更新MAC地址表項。
本例中,LSW6中的MAC地址表項定義了通過端口G0/0/3可以到達主機A,通過端口G0/0/2可以到達主機B。由於LSW7的根端口G0/0/2產生故障,導致生成樹拓撲重新收斂,在生成樹拓撲完成收斂之后,從主機A到主機B的幀仍然不能到達目的地。這是因為MAC地址表項老化時間是300秒,主機A發往主機B的幀到達LSW6后,LSW6會繼續通過根端口G 0/0/1轉發該數據幀。
拓撲變化過程中,根橋通過下游交換機的TCN BPDU報文獲知生成樹拓撲里發生了故障。根橋生成TC用來通知其他交換機加速老化現有的MAC地址表項。
拓撲變更以及MAC地址表項更新的具體過程如下:
1、LSW7感知到網絡拓撲發生變化后,會不間斷地向LSW6發送TCN BPDU報文。
2、LSW6收到LSW7發來的TCN BPDU報文后,會把配置BPDU報文中的Flags的TCA位設置1,然后發送給LSW7,告知LSW7停止發送TCN BPDU報文。
3、LSW6向根橋LSW5轉發TCN BPDU報文。
4、LSW5把配置BPDU報文中的Flags的TC位設置為1后發送,通知下游設備把MAC地址表項的老化時間由默認的300秒修改為Forwarding Delay的時間(默認為15秒)。
5、最多等待15秒之后,LSW6中的錯誤映射關系會被自動清除。此后,LSW6就能通過G0/0/2端口把從主機A到主機B的幀正確地進行轉發。
補充Tips:
關於BPDU的flags字段
Flags字段占8bits(位)的空間,其中有效位只有高位(最左邊)和低位(最右邊)的1bit。
TCN報文:Topology Change Notification報文,即拓撲改變通知報文,當設備A感知到STP拓撲發生了變化時,會向其他設備B發送TCN BPDU報文,代表:“我發現拓撲變化了,通知你一下”。
低位的叫TC(Topology Change),即“拓撲改變”位,常用於根橋通知下游交換機拓撲發生了改變。代表:“我們STP的拓撲改變了,請下游交換機刷新一下MAC地址表”
高位的叫TCA(Topology Change Acknowledge),即“拓撲改變響應”位,當設備B收到設備A發送過來的TCN BPDU報文,B知道拓撲發生了變化。然后B會:將此報文轉發給根橋,然后生成一個TCA置為1的BPDU報文,回復給設備A,代表“我已確認收到你發的通知報文,你可以停止發了”。
利用實驗來驗證:如圖所示抓包點為LSW7的指定端口G0/0/1口
Step 1:拓撲趨於穩定,此時LSW7會通過指定端口G0/0/1轉發根橋的配置BPDU
BPDU flags: 0x00 =》 配置 BPDU
Step 2:此時,人工將LSW5和LSW7之間的鏈路刪除,形成拓撲改變的現象。
LSW7感知到拓撲的變化,則發送TCN BPDU報文通知對端交換機LSW6。
BPDU flags:0x80 =》 TCN BPDU報文
Step 3 : LSW6收到TCN BPDU報文后,會回復一個響應報文(TCA=1)給LSW7,提示其已經收到了。
Step 4:LSW6繼續向根橋轉發TCN BPDU報文,根橋收到后,向下游交換機發送將TC=1的報文,提示他們將MAC地址表的老化時間改為15秒,起到加速收斂的作用。
Step 5:拓撲收斂后,網絡重新穩定。
最后的STP簡單配置會在下一節給出。
STP協議筆記匯總:
STP生成樹協議筆記之(一) : 背景和原理
https://www.cnblogs.com/zylSec/p/14615481.html
STP生成樹協議筆記之(二) : 端口角色選舉STP
https://www.cnblogs.com/zylSec/p/14618328.html
STP生成樹協議筆記之(三) : 協議報文的抓包解析
https://www.cnblogs.com/zylSec/p/14627690.html
STP生成樹協議筆記之(四) : 協議基礎配置
https://www.cnblogs.com/zylSec/p/14628274.html