議全解析:從二層環(huán)路廣播風(fēng)暴到RSTP配置實(shí)戰(zhàn))
做網(wǎng)工這行誰還沒被廣播風(fēng)暴折騰過幾回半夜機(jī)房值班一個環(huán)路能把整棟樓業(yè)務(wù)全部打斷交換機(jī)CPU頂?shù)?9%所有的燈狂閃人還沒走到機(jī)柜跟前就已經(jīng)猜到大概了——又是二層環(huán)路。我之前在好多個維護(hù)項(xiàng)目里都碰到過類似場面。上聯(lián)口插錯、堆疊線當(dāng)成了業(yè)務(wù)線、某臺傻瓜交換機(jī)被直接搭成了三角環(huán)最后都是同一個收場廣播包在交換機(jī)之間無限循環(huán)一臺交換機(jī)給另外一臺瘋狂轉(zhuǎn)包交換機(jī)CPU過載業(yè)務(wù)全掛。真正解決問題的方法往往就落在STP這幾個字母上。STP全稱Spanning Tree Protocol生成樹協(xié)議它做的事情簡單說就是在保留冗余鏈路的同時用邏輯算法把環(huán)變成樹防止廣播風(fēng)暴和MAC地址表抖動保障二層網(wǎng)絡(luò)穩(wěn)定運(yùn)行。這篇就認(rèn)真聊聊STP的原理與配置。我盡量用大白話把生成樹從底層機(jī)制講到實(shí)際操作從BPDU報(bào)文到根橋選舉從端口狀態(tài)機(jī)到配置命令最后再列幾個我踩過的坑。不管你是剛?cè)胄械木W(wǎng)絡(luò)小白還是已經(jīng)在做維護(hù)的運(yùn)維工程師看完這篇都應(yīng)該能自己判斷怎么設(shè)計(jì)冗余鏈路、怎么配置生成樹、怎么在故障現(xiàn)場快速止血。1. STP到底在解決什么問題二層環(huán)路與廣播風(fēng)暴1.1 冗余設(shè)計(jì)為什么要故意制造物理環(huán)路正經(jīng)的網(wǎng)絡(luò)設(shè)計(jì)里鏈路冗余是必須有的。一個辦公樓的核心交換機(jī)宕機(jī)了如果下面所有接入交換機(jī)都只靠一根線連著它那核心一掛全網(wǎng)直接癱瘓。所以實(shí)際拓?fù)淅锝?jīng)常出現(xiàn)“三角形”甚至“網(wǎng)狀”結(jié)構(gòu)交換機(jī)的上聯(lián)口接兩個核心接入層交換機(jī)之間還有互聯(lián)線。物理上這種環(huán)路是故意留出來的。目的是當(dāng)某條主鏈路down掉流量能自動切到備份鏈路上讓業(yè)務(wù)繼續(xù)跑。但物理環(huán)路一旦存在二層廣播幀的問題就來了。二層數(shù)據(jù)幀和三層IP報(bào)文不一樣IP報(bào)文有TTL字段每經(jīng)過一臺路由器減1減到0就丟棄。但二層幀沒有TTL這個概念交換機(jī)收到廣播幀之后按照轉(zhuǎn)發(fā)邏輯會把它從除接收端口以外的所有端口復(fù)制出去。如果拓?fù)淅锎嬖诃h(huán)路這個廣播幀就會被每臺交換機(jī)反復(fù)復(fù)制、轉(zhuǎn)發(fā)沿著環(huán)無限循環(huán)下去。一個廣播包可以瞬間變成幾百個、幾百萬個最終占滿所有鏈路帶寬。這種被稱為“廣播風(fēng)暴”的現(xiàn)象是二層網(wǎng)絡(luò)中破壞力最大的故障之一。所以純粹從可靠性角度我們想要環(huán)路純粹從數(shù)據(jù)轉(zhuǎn)發(fā)角度環(huán)路必須禁止。STP的想法就是在所有交換機(jī)之間運(yùn)行一套算法識別出哪些端口是冗余的然后把冗余端口在邏輯上阻塞掉使全網(wǎng)變成一個沒有環(huán)路的樹形拓?fù)?。同時當(dāng)主鏈路發(fā)生故障它又能自動把原來阻塞的端口打開快速恢復(fù)通信。通俗講就是“平時堵死備用口關(guān)鍵時刻再放行”。1.2 環(huán)路真正可怕的地方廣播風(fēng)暴、MAC漂移和交換機(jī)CPU過載環(huán)路帶來的問題遠(yuǎn)不止廣播風(fēng)暴一種。我把實(shí)際故障時常見的三種“并發(fā)癥”列一下第一種廣播風(fēng)暴。廣播幀在環(huán)路中無限復(fù)制鏈路帶寬被占滿正常業(yè)務(wù)報(bào)文完全發(fā)不出去這個開頭已經(jīng)說了。第二種MAC地址表抖動。交換機(jī)是依據(jù)目的MAC查MAC地址表來決定把數(shù)據(jù)幀從哪個端口發(fā)出去的。MAC地址表記錄了某個MAC地址應(yīng)該從哪個端口到達(dá)。在環(huán)路上同一個源MAC的幀會從多個端口先后到達(dá)交換機(jī)。交換機(jī)搞不清楚這個設(shè)備到底接在哪個口MAC表就開始左右橫跳一會兒把MAC記錄寫到端口1一會兒改寫到端口2轉(zhuǎn)發(fā)效率急速下降CPU也被大量消耗在刷MAC表和報(bào)文處理上。第三種交換機(jī)CPU和轉(zhuǎn)發(fā)引擎過載。局域網(wǎng)交換機(jī)以硬件轉(zhuǎn)發(fā)為主但控制層面的CPU還是要處理很多控制報(bào)文、ARP、協(xié)議報(bào)文。廣播風(fēng)暴場景下所有報(bào)文都在泛洪CPU被按在地上摩擦控制協(xié)議都跑不動了。我見過最嚴(yán)重的一次某接入交換機(jī)CPU直接超過90%遠(yuǎn)程登錄都發(fā)卡連配置都敲不進(jìn)去。這種時候唯一的辦法就是物理斷線。在STP正常工作的網(wǎng)絡(luò)里這些問題是不會發(fā)生的。因?yàn)槿哂噫溌繁贿壿嬜枞D(zhuǎn)發(fā)路徑是唯一的廣播幀轉(zhuǎn)發(fā)一次之后不會再回到源交換機(jī)。1.3 一次深夜排障案例最后一查根因是沒開STP講一個我處理過的真實(shí)事故。某單位的一棟辦公樓半夜有人加班時網(wǎng)絡(luò)突然全斷值班電話被打爆。我趕到機(jī)房看到那臺匯聚交換機(jī)所有端口指示燈都在狂閃用串口線連上去CPU利用率95%以上。當(dāng)時第一反應(yīng)就是有環(huán)路。我port shutdown掉一個方向疑似環(huán)路的端口網(wǎng)絡(luò)立刻恢復(fù)再port up幾秒后又堵死。最后排查發(fā)現(xiàn)是樓里一個辦公室私自接了一臺小型交換機(jī)把兩根網(wǎng)線同時插在了兩臺接入交換機(jī)上形成了一個物理環(huán)路。而那臺接入交換機(jī)是某低端型號出廠默認(rèn)沒有開啟STP環(huán)路產(chǎn)生了交換機(jī)之間完全不自知廣播風(fēng)暴直接在二層炸開。這個案例看起來簡單但很能說明問題STP默認(rèn)開啟與否不同設(shè)備、不同版本之間并不一致。有的默認(rèn)開有的默認(rèn)關(guān)還有的雖然默認(rèn)開但模式選的是舊版STP收斂特別慢。所以拿到一臺交換機(jī)的第一件事就是確認(rèn)生成樹狀態(tài)而不是想當(dāng)然。2. STP怎么做到“堵路不堵車”BPDU、根橋選舉與端口角色2.1 BPDU交換機(jī)之間互發(fā)的“選舉信件”STP要工作交換機(jī)之間必須互相打招呼互通信息。這個“打招呼”的報(bào)文叫BPDUBridge Protocol Data Unit橋協(xié)議數(shù)據(jù)單元。BPDU是STP的“原料”所有選舉和判斷都依賴它。BPDU里攜帶的核心字段包括根橋ID由橋優(yōu)先級和橋MAC地址組成標(biāo)識誰是當(dāng)前的根橋。根路徑開銷發(fā)送者到達(dá)根橋的路徑總開銷。發(fā)送者橋ID發(fā)出這份BPDU的交換機(jī)自己的身份。發(fā)送者端口ID發(fā)送BPDU的端口編號。一系列計(jì)時器值Hello Time、Max Age、Forward Delay。默認(rèn)情況下交換機(jī)每個Hello Time發(fā)送一次BPDUHello Time一般是2秒。也就是說每臺交換機(jī)每隔2秒就會向自己的所有端口發(fā)送一份BPDU同時不斷接收鄰居發(fā)來的BPDU。可以想象成大家都在廣播自己的“家底”然后根據(jù)這些信息決定誰是老大、誰走哪條路。我剛接觸STP時有個誤區(qū)以為BPDU只在根橋上發(fā)送。實(shí)際上所有參與生成樹的交換機(jī)都會發(fā)BPDU因?yàn)樾畔⑿枰ハ鄠鬟f和比較而不是只有根橋發(fā)聲。2.2 根橋選舉機(jī)制詳解STP算法做決策先要選出一個“精神支柱”就是根橋也叫Root Bridge。全網(wǎng)只有一個根橋其他設(shè)備都是非根橋。根橋的工作是維持全網(wǎng)生成樹拓?fù)涞姆€(wěn)定所有路徑計(jì)算都以到達(dá)根橋的最短路徑為目標(biāo)。根橋怎么選比的是橋ID橋ID 橋優(yōu)先級 橋MAC地址。橋優(yōu)先級默認(rèn)都是32768可以配置修改范圍是0到61440而且必須是以4096為倍數(shù)遞增。比較規(guī)則很簡單先比較優(yōu)先級。數(shù)值越小優(yōu)先級越高越有可能成為根橋。優(yōu)先級相同的比較MAC地址。MAC地址越小越有可能成為根橋。選舉過程大致是這樣的每臺交換機(jī)啟動時都認(rèn)為自己是根橋通過BPDU把自己的橋ID告訴鄰居。鄰居收到這份BPDU后拿對方的根橋ID和自己記錄里的根橋ID比較。如果對方的ID更優(yōu)就放棄自己的“候選資格”轉(zhuǎn)而把對方當(dāng)成根橋再把這套信息繼續(xù)轉(zhuǎn)發(fā)給其他鄰居。這個過程持續(xù)迭代直到全網(wǎng)所有交換機(jī)記錄到的根橋ID一致根橋選舉就完成了。實(shí)際配置時我們要主動控制根橋的位置。把核心交換機(jī)或匯聚交換機(jī)設(shè)為根橋是一種標(biāo)準(zhǔn)做法比如在核心交換機(jī)上把優(yōu)先級改成4096讓它的橋ID在整個網(wǎng)絡(luò)里最小。這樣生成樹的計(jì)算結(jié)果就會圍繞核心設(shè)備展開轉(zhuǎn)發(fā)路徑更合理。如果你不手動調(diào)整優(yōu)先級那根橋可能落在某臺低端接入交換機(jī)上整網(wǎng)路徑亂七八糟網(wǎng)絡(luò)性能也受影響。2.3 根端口、指定端口與阻塞端口各司其職選完根橋接下來要做的事情就是給每個端口分配角色。STP里有三種基本端口角色根端口Root PortRP。對于每一臺非根橋交換機(jī)需要選出一個到達(dá)根橋路徑開銷最小的端口作為根端口。根端口負(fù)責(zé)這臺交換機(jī)與根橋之間的數(shù)據(jù)轉(zhuǎn)發(fā)是跟“老大”通信的唯一關(guān)口。一臺非根橋上且僅有一個根端口。指定端口Designated PortDP。每一條鏈路上都要選出到達(dá)根橋路徑更優(yōu)的那個端口作為指定端口。簡單理解指定端口就是這條鏈路的“主人”它負(fù)責(zé)把數(shù)據(jù)從這一側(cè)發(fā)向另一側(cè)。通常根橋上的端口都是指定端口。非根橋上也可以有指定端口取決于它和鄰居交換機(jī)比較時誰更優(yōu)。阻塞端口Blocked Port。既不是根端口也不是指定端口的端口邏輯上被阻塞不轉(zhuǎn)發(fā)業(yè)務(wù)數(shù)據(jù)幀。但這個端口并沒有完全“死掉”它仍然持續(xù)接收BPDU用來感知網(wǎng)絡(luò)拓?fù)渥兓?。一旦?dāng)前活躍路徑失效阻塞端口可以快速切換到轉(zhuǎn)發(fā)狀態(tài)。這三種角色合在一起保證了全網(wǎng)任意兩臺主機(jī)之間只有一條活動轉(zhuǎn)發(fā)路徑?jīng)]有環(huán)路但所有冗余端口都“枕戈待旦”隨時準(zhǔn)備頂上。2.4 路徑開銷如何影響轉(zhuǎn)發(fā)路徑端口角色和路徑選擇都離不開路徑開銷這個概念。STP為每條鏈路定義一個開銷值帶寬越大開銷越小路徑越優(yōu)。一個端口對應(yīng)的根路徑開銷等于從該端口出發(fā)到達(dá)根橋經(jīng)過的所有鏈路開銷之和。我羅列一個常見的默認(rèn)開銷對照表鏈路帶寬802.1D標(biāo)準(zhǔn)開銷擴(kuò)展標(biāo)準(zhǔn)開銷10 Mbps1002000000100 Mbps192000001 Gbps42000010 Gbps22000不同的設(shè)備廠商和標(biāo)準(zhǔn)版本開銷值的具體算法會有一點(diǎn)差異。老的802.1D標(biāo)準(zhǔn)以10Mbps鏈路開銷為100作為基準(zhǔn)推算后來為了支持更大帶寬又出來了擴(kuò)展開銷算法。不同標(biāo)準(zhǔn)算出來的開銷值可能差很多但我們選路時看的是“相對大小”而不是絕對值。手動調(diào)整鏈路開銷也是一個常用的排障手段。比如某條千兆鏈路的默認(rèn)開銷是4另一條千兆鏈路過載太厲害了想讓它別優(yōu)先走可以把它的端口開銷調(diào)大一些比如調(diào)成20STP計(jì)算路徑時自然會偏向別的鏈路。這招在調(diào)整業(yè)務(wù)流量路徑時很管用。3. STP收斂過程與時間開銷從鏈路故障到業(yè)務(wù)恢復(fù)3.1 端口狀態(tài)機(jī)的完整切換過程STP里的端口不是生下來就直接轉(zhuǎn)發(fā)數(shù)據(jù)的。它要經(jīng)歷一個狀態(tài)機(jī)從禁用、阻塞、監(jiān)聽、學(xué)習(xí)最后才進(jìn)入轉(zhuǎn)發(fā)。我把這幾個狀態(tài)分別解釋一下禁用狀態(tài)Disabled端口被手工關(guān)閉或者因?yàn)楣芾碓虿粎⑴c生成樹計(jì)算既不轉(zhuǎn)發(fā)數(shù)據(jù)也不處理BPDU。阻塞狀態(tài)Blocking端口在邏輯上被阻塞不轉(zhuǎn)發(fā)數(shù)據(jù)幀只接收BPDU被動等待拓?fù)湫畔ⅰ倖拥慕粨Q機(jī)端口或因?yàn)槌森h(huán)被選為冗余的端口通常都停在這個狀態(tài)。監(jiān)聽狀態(tài)Listening端口準(zhǔn)備參與轉(zhuǎn)發(fā)但還在接收和發(fā)送BPDU學(xué)習(xí)網(wǎng)絡(luò)拓?fù)溥@時候不會學(xué)習(xí)MAC地址也不會轉(zhuǎn)發(fā)數(shù)據(jù)幀。學(xué)習(xí)狀態(tài)Learning端口已經(jīng)開始學(xué)習(xí)MAC地址建立MAC地址表但仍然不轉(zhuǎn)發(fā)數(shù)據(jù)幀。這一步主要是為了讓交換機(jī)先“認(rèn)識”網(wǎng)絡(luò)里的設(shè)備避免轉(zhuǎn)發(fā)開始后出現(xiàn)大量未知單播泛洪。轉(zhuǎn)發(fā)狀態(tài)Forwarding端口正常工作既轉(zhuǎn)發(fā)數(shù)據(jù)幀也學(xué)習(xí)MAC地址繼續(xù)處理BPDU。狀態(tài)機(jī)變化的順序是固定的阻塞 - 監(jiān)聽 - 學(xué)習(xí) - 轉(zhuǎn)發(fā)。從阻塞到轉(zhuǎn)發(fā)通常需要經(jīng)歷兩個轉(zhuǎn)發(fā)延遲周期也就是2倍的Forward Delay每個轉(zhuǎn)發(fā)延遲默認(rèn)15秒。所以正常情況下一個端口從啟動到開始轉(zhuǎn)發(fā)數(shù)據(jù)差不多要30秒。這是舊版STP設(shè)計(jì)上最被人詬病的地方。3.2 30秒還是50秒收斂時間到底怎么算的“STP收斂要50秒”這個說法在網(wǎng)絡(luò)圈里流傳很廣但它其實(shí)描述的是鏈路故障發(fā)生后STP重新計(jì)算出新路徑所需要的最壞情況時間。我來拆一下這個50秒是怎么來的。設(shè)想一個雙鏈路冗余場景主鏈路突然斷了流量要切到備份鏈路上。但備份鏈路本來處于阻塞狀態(tài)。阻塞端口的BPDU是持續(xù)接收的。主鏈路故障后根橋的BPDU無法從這個端口到達(dá)阻塞端口要等待一段時間確定根橋徹底“失聯(lián)”這段時間就是Max Age默認(rèn)20秒。Max Age時間里如果沒有任何BPDU進(jìn)來端口判斷根橋不可達(dá)于是進(jìn)入監(jiān)聽狀態(tài)監(jiān)聽15秒然后進(jìn)入學(xué)習(xí)狀態(tài)再花15秒最后才進(jìn)入轉(zhuǎn)發(fā)狀態(tài)。20 15 15 50秒。這就是STP默認(rèn)收斂時長的由來。50秒對于普通網(wǎng)頁瀏覽來說可能還能忍一忍但對業(yè)務(wù)系統(tǒng)、語音、視頻監(jiān)控這些對連續(xù)性要求高的場景來說已經(jīng)是災(zāi)難級別的中斷了。很多人在機(jī)房做鏈路切換測試業(yè)務(wù)系統(tǒng)直接掛了查了半天才發(fā)現(xiàn)問題不在于業(yè)務(wù)軟件而是STP收斂太慢。所以在實(shí)際生產(chǎn)環(huán)境中我們一般不會老老實(shí)實(shí)讓舊版STP跑50秒收斂而是直接啟用RSTP或MSTP。這兩個擴(kuò)展協(xié)議我下面詳細(xì)說。3.3 RSTP和MSTP為什么能大幅縮短收斂時間RSTP全稱Rapid Spanning Tree Protocol快速生成樹協(xié)議是對STP的重大改進(jìn)。它把端口狀態(tài)精簡為三種丟棄、學(xué)習(xí)、轉(zhuǎn)發(fā)并且增加了幾種靈活機(jī)制來加速收斂。RSTP最關(guān)鍵的一個改進(jìn)是引入了Proposal/Agreement協(xié)商機(jī)制。鏈路建立后交換機(jī)之間可以快速握手確認(rèn)彼此的端口角色指定端口在很短的時間內(nèi)就能直接進(jìn)入轉(zhuǎn)發(fā)狀態(tài)不需要經(jīng)過漫長的監(jiān)聽和學(xué)習(xí)階段。在大多數(shù)點(diǎn)到點(diǎn)鏈路上RSTP的收斂時間可以控制在1秒以內(nèi)鏈路故障恢復(fù)基本做到業(yè)務(wù)無感。RSTP還引入了邊緣端口的概念。連接PC、打印機(jī)、服務(wù)器這些終端設(shè)備的端口可以設(shè)置成邊緣端口。邊緣端口只要UP就立刻進(jìn)入轉(zhuǎn)發(fā)狀態(tài)壓根不參與生成樹計(jì)算因?yàn)榻K端后面一般不會再有交換機(jī)和環(huán)路。MSTP全稱Multiple Spanning Tree Protocol多實(shí)例生成樹協(xié)議是在RSTP基礎(chǔ)上配合VLAN做多實(shí)例計(jì)算的協(xié)議。它允許管理員把不同的VLAN劃分到不同實(shí)例每個實(shí)例獨(dú)立計(jì)算生成樹。舉例來說VLAN 10、20走實(shí)例1VLAN 30、40走實(shí)例2。實(shí)例1阻塞掉了鏈路B實(shí)例2可以阻塞掉鏈路A兩條冗余鏈路同時利用起來既保證無環(huán)又實(shí)現(xiàn)了負(fù)載均衡。這在數(shù)據(jù)中心核心匯聚場景中特別有用。現(xiàn)在新設(shè)備基本都支持RSTP、MSTP。我個人的建議是普通局域網(wǎng)環(huán)境優(yōu)先用RSTP場景簡單、收斂快多VLAN需要負(fù)載均衡的用MSTP除非有老設(shè)備兼容性要求否則盡量別再用舊版STP了。4. STP配置實(shí)操基本命令、參數(shù)調(diào)優(yōu)與典型拓?fù)鋵?shí)例4.1 基礎(chǔ)配置開啟生成樹與選擇運(yùn)行模式先做一件事確認(rèn)交換機(jī)的生成樹模式。不同廠商的設(shè)備默認(rèn)行為差異很大有的默認(rèn)啟用STP有的默認(rèn)只啟用RSTP還有的低端設(shè)備出廠默認(rèn)關(guān)閉生成樹。拿到設(shè)備后先用查看命令檢查一下當(dāng)前狀態(tài)。我常用的查看命令大概是這樣show spanning-tree show spanning-tree summary show stp如果發(fā)現(xiàn)生成樹沒開首先全局開啟。以下是通用的開啟命令示例放在全局配置模式下執(zhí)行spanning-tree enable接下來選擇運(yùn)行模式。如果你的設(shè)備支持RSTP直接切過去spanning-tree mode rstp如果網(wǎng)絡(luò)里有多個VLAN希望做多實(shí)例負(fù)載均衡用MSTPspanning-tree mode mstp spanning-tree mst configuration instance 1 vlan 10-20 instance 2 vlan 30-40配置MSTP時注意同一套實(shí)例配置必須在這個VLAN域的所有交換機(jī)上保持一致否則實(shí)例不匹配生成樹計(jì)算會出問題。我這里把命令寫得比較概括各家設(shè)備可能會有細(xì)微差異但思路完全一樣。4.2 調(diào)整STP核心參數(shù)的正確姿勢配置根橋最直接的方式是修改橋優(yōu)先級。下面這個配置讓本機(jī)成為VLAN 1的根橋spanning-tree vlan 1 priority 4096或者通過root關(guān)鍵字讓系統(tǒng)自動把優(yōu)先級調(diào)整到最優(yōu)值spanning-tree vlan 1 root primary非根橋設(shè)備如果不想搶根橋角色優(yōu)先級就保持默認(rèn)32768或者設(shè)置得更高一些比如49152明確告訴全網(wǎng)我不參與根橋選舉。這一點(diǎn)在大型網(wǎng)絡(luò)里尤其重要不然新加一臺交換機(jī)上來可能因?yàn)镸AC地址比較小就把根橋搶走了。針對端口調(diào)整鏈路開銷和端口優(yōu)先級也能影響路徑選擇。如果希望某條鏈路不被優(yōu)先選用調(diào)大端口開銷interface gigabitethernet 0/1 spanning-tree cost 10000連接終端的下行口推薦開啟邊緣端口和BPDU保護(hù)。邊緣端口讓端口立馬上線BPDU保護(hù)防止有人在下聯(lián)口接入交換機(jī)影響整網(wǎng)生成樹。配置類似這樣interface gigabitethernet 0/1 spanning-tree portfast spanning-tree bpduguard enable注意PortFast和BPDU保護(hù)只適合配置在連接終端設(shè)備的端口上。連接其他交換機(jī)的端口千萬不能用PortFast否則交換機(jī)之間互連時如果出現(xiàn)環(huán)路STP起不到防護(hù)作用照樣廣播風(fēng)暴。調(diào)整計(jì)時器需要謹(jǐn)慎。全局的Hello Time、Max Age、Forward Delay不建議輕易改動改小了可能導(dǎo)致網(wǎng)絡(luò)由于BPDU延遲不穩(wěn)改大了收斂更慢。非特殊情況優(yōu)先通過改工作模式來縮短收斂時間別跟計(jì)時器較勁。4.3 實(shí)戰(zhàn)配置三臺交換機(jī)的冗余收斂拓?fù)鋪硪粋€完整的例子。假設(shè)有兩臺接入交換機(jī)B和C同時上聯(lián)匯聚交換機(jī)AB和C之間還有一條互聯(lián)鏈路拓?fù)渖蠘?gòu)成了三角形環(huán)。如果不跑STP這個網(wǎng)絡(luò)肯定炸。我們現(xiàn)在做一套標(biāo)準(zhǔn)配置。第一步把匯聚A設(shè)置成根橋spanning-tree mode rstp spanning-tree vlan 1 root primary匯聚A的優(yōu)先級不手動改用root primary讓系統(tǒng)自動調(diào)整到最低值。它的兩個下聯(lián)口保持默認(rèn)Trunk或Access配置但不要加PortFast。第二步接入B和C的配置spanning-tree mode rstp spanning-tree vlan 1 priority 32768B和C保持默認(rèn)優(yōu)先級。B-C互聯(lián)口只能做普通交換機(jī)互聯(lián)口也別開PortFast。B和C下聯(lián)終端的端口開啟PortFast和BPDU保護(hù)interface gigabitethernet 0/10 spanning-tree portfast spanning-tree bpduguard enable配置完成后用show spanning-tree命令驗(yàn)證。正常情況應(yīng)該是這樣在A上與B和C相連的端口都是指定端口DP。在B上與A相連的端口是根端口RP。與C相連的端口如果被阻塞就進(jìn)入阻塞狀態(tài)。在C上與A相連的端口是根端口RP。與B相連的端口被阻塞。此時B和C之間那條互聯(lián)鏈路是阻塞狀態(tài)的但它隨時待命。一旦B到A的鏈路斷了阻塞端口會在RSTP快速收斂機(jī)制下幾乎瞬間完成角色切換業(yè)務(wù)不受影響。這就是一個標(biāo)準(zhǔn)的“冗余但不環(huán)路”的二層網(wǎng)絡(luò)。配置完之后我還習(xí)慣做一次驗(yàn)證手動把B的上聯(lián)口shutdown過幾秒再看業(yè)務(wù)是否自動恢復(fù)。實(shí)測RSTP模式下大部分場景恢復(fù)時間都能控制在幾秒內(nèi)。5. 常見問題與排查技巧實(shí)錄5.1 交換機(jī)CPU飆升先懷疑廣播風(fēng)暴我在前面說過廣播風(fēng)暴是二層環(huán)路最典型的故障表現(xiàn)。如果你在現(xiàn)場發(fā)現(xiàn)交換機(jī)所有端口狂閃CPU使用率高到異常第一件事是確認(rèn)是不是環(huán)路。排查順序我建議這樣用管理口連上去看CPU使用率同時看端口流量統(tǒng)計(jì)。執(zhí)行show interface檢查端口的廣播/組播包計(jì)數(shù)是不是異常高。執(zhí)行show mac address-table看看MAC地址是不是在各端口之間反復(fù)漂移。查看系統(tǒng)日志有沒有持續(xù)的拓?fù)渥兓婢R坏┐_認(rèn)是環(huán)路最快的恢復(fù)動作是物理隔離拔線或者把嫌疑端口shutdown。不要在環(huán)路抖動狀態(tài)下慢慢敲命令那只會浪費(fèi)時間。拔掉線后網(wǎng)絡(luò)恢復(fù)了再坐下來慢慢找環(huán)路源頭。事后一定要檢查STP是否正常開啟。如果交換機(jī)支持RSTP優(yōu)先改成RSTP模式。同時把所有下聯(lián)口配上BPDU保護(hù)避免終端附近私接設(shè)備再次引發(fā)環(huán)路。5.2 端口角色亂跳、根橋頻繁切換根橋頻繁變化通常是因?yàn)榫W(wǎng)絡(luò)里出現(xiàn)了兩個優(yōu)先級很相近的設(shè)備加上MAC地址比較接近導(dǎo)致選舉結(jié)果不斷翻轉(zhuǎn)。根橋一旦變來變?nèi)フ麄€網(wǎng)絡(luò)的路徑也會跟著變就會出現(xiàn)間歇性丟包。處理辦法是手動固定根橋spanning-tree vlan 1 root primary同時在核心設(shè)備上的互聯(lián)口配置根保護(hù)防止某個新接入的交換機(jī)搶占根橋角色interface gigabitethernet 0/1 spanning-tree guard root根保護(hù)開啟后如果這個端口收到更優(yōu)的BPDU交換機(jī)不會輕易改變根橋而是把該端口置為阻塞狀態(tài)避免異常設(shè)備破壞拓?fù)洹_@個配置在存在多級接入、可能有人亂接設(shè)備的網(wǎng)絡(luò)里非常實(shí)用。5.3 切換慢到業(yè)務(wù)超時問題出在計(jì)時器有時候你確認(rèn)STP模式、優(yōu)先級都配好了端口該阻塞的也阻塞了但鏈路切換還是慢業(yè)務(wù)仍然會中斷幾十秒。這種時候要往這幾個方向查第一交換機(jī)的工作模式是不是還停在舊版STP。很多設(shè)備默認(rèn)協(xié)議是STP不是RSTP如果沒顯式切換收斂時間就是最長的50秒業(yè)務(wù)當(dāng)然受不了。第二有沒有在應(yīng)該用RSTP的交換機(jī)互聯(lián)口上誤開了PortFast。PortFast用在交換機(jī)互聯(lián)口會讓端口在環(huán)路存在時也直接進(jìn)入轉(zhuǎn)發(fā)態(tài)等于繞過了生成樹防護(hù)隱患非常大。第三鏈路故障檢測依賴物理層信號。如果鏈路斷了但網(wǎng)線的電氣信號沒有立即變化比如某些光模塊故障端口可能不會馬上感知到鏈路down恢復(fù)時間會更長。這時候可以調(diào)整端口的光電檢測參數(shù)或者用鏈路聚合做更快的故障切換。每一次拓?fù)渥兏粨Q機(jī)都會發(fā)出TCN BPDU。鏈路切換慢還有一個常見原因是MAC地址表刷新延遲。RSTP下拓?fù)渥兓瘯|發(fā)交換機(jī)快速清空自己的MAC地址表重新學(xué)習(xí)。如果發(fā)現(xiàn)切換后大量數(shù)據(jù)包泛洪可以檢查是不是有設(shè)備對拓?fù)渥兏鼒?bào)文處理異常。5.4 一張速查表快速定位STP故障這里整理一個我用起來很順手的排查速查表癥狀可能原因快速處理建議CPU飆升、端口狂閃二層環(huán)路、未開啟STP先拔線或shutdown隔離再開啟RSTP廣播包計(jì)數(shù)持續(xù)上漲環(huán)路或下聯(lián)設(shè)備私接開啟生成樹端口配置BPDU保護(hù)鏈路切換需要幾十秒工作模式為舊STP切換為RSTP或啟用MSTP多實(shí)例根橋不穩(wěn)定優(yōu)先級沖突、設(shè)備私接手工指定根橋配合root guardMAC地址表抖動環(huán)路、MAC欺騙查環(huán)路配置BPDU保護(hù)觀察端口端口明明該轉(zhuǎn)發(fā)卻不通端口被STP阻塞show spanning-tree確認(rèn)端口角色下聯(lián)設(shè)備端口不起來端口被BPDU保護(hù)關(guān)閉恢復(fù)端口檢查是否誤配BPDU保護(hù)這張表不能覆蓋所有情況但每一條都是我在實(shí)戰(zhàn)中真真切切遇到過的。6. 最后聊幾點(diǎn)實(shí)戰(zhàn)心得做網(wǎng)絡(luò)維護(hù)做久了STP這塊反而越用越保守。我個人的習(xí)慣是能不用默認(rèn)值的地方盡量不用默認(rèn)值能用RSTP的地方絕不跑舊版STP。上架新交換機(jī)時我做的第一件事就是看生成樹模式而不是等網(wǎng)絡(luò)出問題再去查。因?yàn)槟J(rèn)值這東西在不同廠商、不同版本之間差別真的很大賭它沒問題風(fēng)險(xiǎn)太高。還有一點(diǎn)是“邊界防護(hù)”的意識。網(wǎng)絡(luò)的邊緣設(shè)備是最失控的辦公室里的任何人都有可能接一個幾十塊錢的小交換機(jī)進(jìn)來隨手一根線插到墻上兩個端口環(huán)路瞬間形成。所以在接入層交換機(jī)上把PortFast和BPDU保護(hù)全面鋪開是我的標(biāo)準(zhǔn)配置不是可選配置。一旦有設(shè)備嘗試非法接入生成樹端口會被自動shutdown而不是讓整網(wǎng)一起去死。最后提一個隱藏技巧在改造網(wǎng)絡(luò)前先把所有設(shè)備配置做備份再在模擬工具里把拓?fù)浯畛鰜砼芤槐镾TP收斂。我吃過不少虧都是在演示環(huán)境里沒驗(yàn)證就直接割接結(jié)果現(xiàn)場根橋選舉亂成一鍋粥?,F(xiàn)在不管多簡單的變更我都要先看一遍show spanning-tree的輸出確認(rèn)根橋、角色、阻塞端口全都符合預(yù)期才敢動業(yè)務(wù)鏈路。STP這套東西原理聽著不難但真正讓你長記性的一定是故障現(xiàn)場那幾分鐘的心跳加速。把這些配置和排查思路提前打扎實(shí)機(jī)房夜里的麻煩事就會少很多。