前文我們瞭解了二層環路對網路帶來的影響,以及STP工作流程和BPDU資料包結構和相關欄位的說明,回顧請參考https://www.cnblogs.com/qiuhom-1874/p/15121317.html;今天我們主要來討論下STP具體選舉流程相關話題;
我們知道STP主要是通過構造“一棵樹”來消除二層網路中可能存在的環路,同時當活動鏈路發生故障,啟用備份鏈路,從而實現網路的可靠性;它的工作過程過程如下
1、選舉根橋的規則
根橋的選舉規則很簡單,在STP初始化時,每一臺交換機都會認為自己是根橋,都會傳送BPDU;根據各交換機傳送的BPDU中BID,首先比較各自的BID中優先順序,優先順序最小對應裝置就是根橋;如果優先順序都一樣,則比較BID中的mac地址,mac地址最小的裝置成為根橋;根橋選舉完成以後,非根橋裝置不主動傳送BPDU,只有根橋裝置主動傳送BPDU,非根橋裝置轉發BPDU;
提示:選舉根橋只是比較各交換機傳送的BPDU中的BID,BID最小為根橋(BID由優先順序和mac地址組成,先比較優先順序,再比較MAC地址);上圖中swa的優先順序最小,所以swa就是根橋;剩下的swb和swc就是非根橋裝置;
2、在非根橋裝置上選舉根埠
提示:選舉根埠是通過對應埠收到的BPDU中,根據埠的根路徑開銷(到達根橋最短路徑開銷)、對端BID、對端PID和本端PID;根路徑開銷最小的埠成為根埠;如果根路徑開銷一樣,則比較對端BID(對應埠連線的裝置);比較對端BID的規則是先比較優先順序,優先順序小者,對應埠成為根埠;如果對端BID中的優先順序一樣,則比較mac地址,對端mac地址小者成為根埠;如果對端的BID一樣,則比較對端PID,比較對端PID的規則是,先比較優先順序,再比較埠編號,對端pid中優先順序小者為根埠;如果優先順序一樣,則埠編號小者為根埠;如果對端PID也一樣,則比較本端PID,比較規則和比較對端PID一樣,先比較優先順序,優先順序小者為根埠,如果優先順序一樣,則比較埠編號,埠編號小者為根埠;
實驗:如下拓撲,三個交換機都執行STP,看看對應的根橋和根埠是怎麼選舉的;
分析:上述拓撲,首先三個交換機會選舉根橋,根橋的選舉只看BID;從上面的資訊可以看到當三個交換機傳送的BID中的優先順序都有一樣(預設都是32768),此時根橋的選舉就比較那個mac較小了,最小的是根橋;很容易判斷出s2就是根橋;那麼s1的eth0/0/1就是根埠(因為在s1上eth0/0/1到達根橋的路徑開銷為200000,而eth0/0/2到達根橋的路徑開銷為400000);同樣在s3上eth0/0/2是根埠;
驗證:檢視s2是否是根橋?
提示:可以看到在s2上檢視stp介面資訊,其中root的mac地址就是s2自己 ,說明s2就是根;
驗證:在s1上檢視對應根埠是否是eth0/0/1?
提示:可以看到在s1上,eth0/0/1是根埠;
驗證:在s3上檢視對應根埠是否是eth0/0/2?
提示:可以看到s3上eth0/0/2就是根埠;
上述實驗選舉根埠就是通過根路徑開銷來選舉的;接下來我們來看看當到達根路徑開銷相等時,又該如何選舉根埠呢?
實驗拓撲
分析:從上面拓撲的bid可以看到,當前根橋還是s2;那麼對於s3來說,eth0/0/1和eth0/0/2到達根路徑開銷都是400000,此時在s3上那個埠為根埠呢?從選舉規則來講,當根路徑開銷一樣時,則看看對端的BID;那麼確定s3的根埠就只需要比較eth0/0/1的對端s1的BID和eth0/0/2的對端s4的BID,誰小,對應的埠就是根埠;從上面的拓撲可以看到s4的BID要大於s1的BID,所以對應s3上的eth0/0/1就是根埠;
驗證:在s3上檢視是否是eth0/0/1為根埠?
提示:可以看到s3之前的eth0/0/1是阻塞的,新加了一個s4以後,對應埠的角色也發生了變化,從阻塞埠變為了根埠;其原因就是因為eth0/0/1的對端s1的BID要小於eth0/0/2的對端s4的BID;
當對端BID相同時?對應根埠該如何選擇呢?
分析:如上拓撲,根橋還是s2;那麼對於s1來說,到底那個埠才是根埠呢?首先看根路徑開銷都一樣,都是200000;看對端BID,對端BID都一樣,都是s2的BID;此時在s1上選舉根橋會看對端PID,誰小誰就是根埠;
在s2上檢視eth0/0/1和eth0/0/2的PID
提示:可以看到在s2上eth0/0/1的PID為128.1,eth0/0/2的PID為128.2;那麼對於s1來說,此時根埠就應該是eth0/0/1(原因是它的對端是s2的eth0/0/1);
驗證:在s1上檢視對應的根埠
提示:可以看到s1上根埠為eth0/0/1;從上面的實驗過程可以看到對端BID相同時,根埠的選舉會根據對端PID,對端PID小者,對應本端埠就是根埠;
當對端PID相同時,根埠又將如何選擇呢?
分析:從上面的拓撲可以確定根橋還是s2,對於s1來說eth0/0/1和eth0/0/2誰才是根橋呢?首先在s1上選舉根埠,會看根路徑開銷,兩個埠到根路徑開銷都是200000;當根路徑開銷相同時,比較對端BID,上圖中s1的對端是s2,所以BID相同;當BID相同我們需要比較對端PID,從上圖中我們可以看到s1的兩個埠的對端都是s2的eth0/0/1,所以對端PID也相同;此時在s1上選舉根埠就會看本端的PID,誰小誰就是根埠,預設情況埠的優先順序都是預設值128,比較PID就是看那個埠的埠編號小;很顯然eth0/0/1的埠編號要小一點,所以s1上的根埠為eth0/0/1;
驗證:檢視s1上的eth0/0/1,看看它是否是根埠?
提示:可以看到s1的eth0/0/1就是根埠;
3、在鏈路上選舉指定埠
選擇指定埠的規則是先看該埠轉發出來的bpdu中根路徑開銷,開銷小者為指定埠,如果開銷一樣則比較BID,BID小者為指定埠;如果BID相等則比較PID,PID小者為指定埠;
實驗:根據以下拓撲圖,選出指定埠
分析:根據stp選舉根橋的規則,上述實驗根橋一定是s3,因為根橋選舉看BID,優先順序一樣比較mac大小,小者為根橋;其次選舉根埠,根據根埠的選舉規則,在s1上根埠是eth0/0/2(因為eth0/0/2到根橋的路徑開銷為200000,而eth0/0/1到根橋的路徑開銷為400000);對於s2上來說,根埠為eth0/0/2(因為eth0/0/1到達根橋的路徑開銷為400000);接下來選擇指定埠,根據指定埠選舉規則,先看發出bpdu中的根路徑開銷;對於s1的eth0/0/1和s2的eth0/0/1直連的鏈路上,s1的eth0/0/1發出的bpdu中根路徑開銷為200000,s2的eth0/0/1發出的bpdu中根路徑開銷為200000;所以根路徑開銷一樣的情況,此時選舉指定埠就需要比較BID;因為s1的BID要小於s2的BID,所以指定埠為s1的eth0/0/1;對於根橋上的埠來說,因為它發出的bpdu中根路徑開銷為0;所以根橋上的埠都是指定埠(排除自環,如果根橋上有埠自環,自環的兩個埠中一定有一個埠處於阻塞,這樣一來根橋的埠就不是都是指定埠);
驗證:檢視s3是否是根橋?
提示:可以看到在s3上的stp相關資訊中,根橋的BID和s3的BID相同,說明s3就是根橋;
驗證:檢視s1的eth0/0/1是否是指定埠,eth0/0/2是否是根埠?
提示:可以看到s1上的eth0/0/1是指定埠,eth0/0/2是根埠;
驗證:檢視根橋的埠,看看是否都是指定埠?
提示:可以看到非自環的情況下,根橋上的所有埠都是指定埠;
實驗:當BID相同時,看看對應指定埠該如何選舉?
分析:從上面的BID就可以看到s1為根橋,s2為非根橋;對於s2來說,根埠是eth0/0/1(因為eth0/0/1、eth0/0/2和eth0/0/3的根路徑開銷都為200000,此時選舉根埠就比較對端BID,eth0/0/1對端BID就是根橋,而eth0/0/2和eth0/0/3對端BID是s2,所以eth0/0/1為根埠)那麼對於s2的eth0/0/2和eth0/0/3之間的鏈路選舉指定埠該怎麼選呢?從上面選舉指定埠的規則來講,首先比較發出bpdu中的根路徑開銷,這兩個埠的發出BPDU中的根路徑開銷都是200000;如果傳送的BPDU中根路徑開銷相同,則比較BID;eth0/0/2和eth0/0/3都是s2的埠,所以BID就是s2,兩個埠的BID也相同;此時選舉指定埠就需要比較pid;pid小者為指定埠;因為eth0/0/2的埠編號小於eth0/0/3的埠編號;所以eth0/0/2為指定埠;(因為預設PID中的優先順序都一樣,我們只需要判斷埠編號大小即可);
驗證:檢視s2各埠情況?
提示:可以看到s2的1口為根埠,2口為指定埠,3口為阻塞埠,也叫備份埠;
4、預備埠的確定
通過上述的選舉,最終沒有被選舉成為根埠或指定埠的埠,都會被確定為預備埠;該埠會一直處於阻塞狀態,只接受BPDU,不轉發資料;直到正常鏈路故障,該埠才有可能轉變為其他角色和狀態,進行資料轉發;