生成樹演算法終極解析!

2021-09-22 17:09:21 字數 4506 閱讀 6616

許多老師講乙個新協議時,總會「強制性」地給你灌輸它的各種規則,導致許多學生死記硬背之後任然一臉懵逼。我當初聽stp時 也是遺留了很多問題:比如為什麼這麼設計;這種機制為什麼不能這樣改進;如果這麼這麼的話,會怎麼怎麼樣。太多的不理解導致我的記憶效率大大降低。所以我 希望可以從乙個協議的起源,開發的目地,設計師的想法(框架),分類分層地來敘述一種優秀的機制,並且提出它的侷限性。

這是乙個純交換層網路的拓撲圖(先不考慮主機)。

此拓撲圖表面上是乙個物理圖,但它可以包含許多邏輯無環圖。(即pvst,稍後會講)

(每個交換機上都可以連若干個pc,任意兩個pc之間通訊都經過其中的某條路徑。)

(請讀者學習生成樹邏輯時都把想象建立在一張足夠大的拓撲圖上,因為深刻的理解是基於實用性而產生的而不要死記它的機制)

生成樹協議stp(spanning tree protocol)是工作在交換層交換機上的一種防環機制(!!!!!!同時提供冗餘)。交換機路徑的備份使得環路的出現。因為交換層相對網路層規模較小,才允許廣播的存在。(路由器分割廣播域而交換機不能)(廣播加上環路才形成了廣播風暴,因而網路層雖有環路但不需要生成樹)

建議拿pt模擬器做試驗。快速生成樹協議rstp(rapid spanning tree protocol)較stp優越些。因rstp與stp機制基本相似,且交換機預設開啟rstp,本章重點研究rstp。

眾所周知顧名思義,一棵物理樹的樹枝是不會形成環路的,因此一棵生成樹的根橋(根網橋,交換機的前身)就是物理樹的根節點,非根橋就是物理樹的分支點或者樹枝末端。以及之後的trunk link(樹幹鏈路)模式,他們都是可模擬的。某個vlan(記作vlan x),所有開啟了vlan x的交換機(且這些交換機相連)構成了一棵關於vlan x的生成樹。

!!生成樹的原理:在眾多交換機中選擇乙個作為根橋,其餘在每個交換機上選擇唯一的一條路徑通向根橋,再將剩下不用的路徑(鏈路)堵塞。

!!生成樹機制的目的:讓二層交換機通電相連後在很短時間內自動收斂出一棵或多棵生成樹。(這是stp的精髓所在)

一般情況下二層交換機的mac位址表中儲存兩項內容:1.鄰居上與自己相連的埠的mac位址以及相對應的本地埠編號;2.pc主機的mac地 址以及相對應的本地埠編號。交換機的埠模式告訴自己對方是主機還是交換機。對於每條鏈路的兩個埠來說,有且只有乙個指定埠,對端是根埠或堵塞端 口。對於每個交換機來說,有且只有乙個根埠,其餘的是指定或堵塞埠(也叫非指定埠)。注意!文章之後提到的交換機角色,埠角色,埠狀態都是基於 某個vlan的,即因vlan而異(非常重要)。

現在正式進入生成樹演算法的詳解。

首先,交換機沒有「眼睛」,只能通過相互間約定好的協議來獲悉整個拓撲圖。給通了電的交換機的某個埠一插上網線,它就檢測到(就像插入耳機)並從這根線向外傳送bpdu(但它並不知道這根線後面是什麼情況並開始競選。因此即使拓撲中沒有環,stp競選也會正常進行(stp不能檢測到環路,只能避免環路)。

網橋協議資料單元bpdu(bridge protocol data unit)是用於生成樹計算(競選)的核心資料幀。有一點須要注意,bpdu是基於特定交換機的,即不同的個交換機有不同的bpdu。交換機之間通過傳送比較它來完成競選。注意,在競選過程中,交換機只把自身的bpdu不斷地複製並發給所有鄰居,但鄰居不會把這個bpdu**給下乙個鄰居。

每個交換機單位時間內(2s)傳送bpdu的數量取決於本地開啟vlan數量和啟用埠(up狀態)數量。假如交換機a檢測到有三個埠被插入網線,且在它的vlan database中開啟了vlan 2、3、4,則交換機a每兩秒就要從各個埠向外發各個vlan的bpdu,總共3*4=12個(前提是埠上先配置trunk link模式)(每條鏈路只需在一邊的埠配trunk即可)(若網路中只有vlan1則不需trunk因為vlan1沒有標籤)(資料從主機進入交換機被加上標籤,從access鏈路出去時刪除標籤,trunk模式讓vlan標籤不被刪除)。

(交換機收到某乙個vlan的資料,若該vlan本地未開啟,則資料直接丟棄,不學習mac)。

首先開始競選根橋。(對於vlan x,接收到所有vlan x的bpdu情況下)交換機a根橋id欄位的初始值是自己id,每收到比該值更優的id(比如收到交換機b發來的bpdu)(先比較優先順序再比較mac)就將該值更新為它。根橋id欄位的更新伴隨著cost欄位的更新(根橋id欄位不變時,cost欄位也可能更新,即找到乙個去往根橋的更優路徑),其初始值是0,更新後變為b的cost字段值再加上ab之間鏈路的開銷(所有鄰接鏈路的開銷儲存記錄在交換機中)即使自己到根橋的開銷。也就是說交換機初始認為自己就是根橋。

(埠收到乙個未知資料幀,先掃瞄其表示與版本欄位以確定它是個bpdu幀,再掃瞄vlan id欄位以確定它是vlan幾的bpdu,然後將它與自己相對應vlan的bpdu比較)

可以想象,以此機制,經過足夠長的時間(幾秒鐘)每個交換機的vlan x的根橋id欄位達到一致。

根橋選好後非根橋就開始選根埠(本質就是選擇唯一一條最優路徑(每個vlan)通向根橋)(其實自從根橋id欄位從初始值開始更新起,根埠的競選就開始了)。根埠競選和根橋競選很類似,也是一種「逐優更新法」在交換機記憶體中有一塊區域(記為m)專門儲存根埠的埠編號(如f0/1)。如在上個例子中,b傳送的bpdu改變了a的bpdu(根橋id和cost欄位),則a的區域m內的值變為剛才接收bpdu的埠編號。當a又收到交換機c的bpdu,若其優化(更新)了自己的根橋id欄位則區域m隨之更新,若沒有優化而是與自己的根橋id欄位一樣則看它是否改變了自己的cost欄位(即c與b的cost欄位進行競爭),若b與c的cost字段值相等則比較b與c的自身id欄位誰更優以決定m區域值是否改變。

如果此時你已經亂了請別急,之後我會總結出乙個總的流程給你看。

到了競選的最後一步:競選指定橋(決定之後不用的鏈路的哪一端保持堵塞狀態/丟棄狀態)。首先要搞清楚,指定橋是基於鏈路的,每條鏈路兩端的交換機中有且只有乙個指定橋,或者說每個交換機可以既是指定橋也是非指定橋(對於不同埠)。指定橋那一邊的埠叫指定埠。指定橋的競選:先比較cost欄位再比較自身id欄位(bridge id)。所以,根埠對應的埠永遠是指定埠,根橋上的已啟用的埠都是指定埠。(競選失敗的埠就成為非指定埠)。好了,交換機上的根埠和指定埠都確定了之後,非指定埠就一直處於堵塞狀態。根埠,指定埠以及一直未收到vlan x的bpdu的埠(比如連線pc的或連線的某個交換機沒有啟動vlan x)過30秒後進入**狀態(之後再說)。

!!以上競選過程中(rstp),所有埠都處於丟棄狀態(discarding)(或堵塞狀態)(注意堵塞與禁用狀態的區別:禁用指down狀態如強行關閉和未插入網線的埠,不能接收**資料;而堵塞埠可以接受傳送bpdu,但不能**(他人的)資料幀)。而正常工作狀態下,除了堵塞埠(指替代埠和備份埠,也叫非指定埠)(對於每個vlan)其餘埠皆處於**狀態。(學習狀態只是一種過渡狀態,即堵塞埠一直處於堵塞狀態,而根埠與指定埠將從堵塞狀態過渡到**狀態)

到此為止,所有競選結束了。在邏輯上競選的大致順序是:1.競選根橋2.競選根埠3.競選指定埠(指定橋)。但事實上他們三者的競選幾乎是同時進行的。在物理層面上,每收到乙個bpdu之後的幾毫秒內,交換機的多個記憶體字段(如根橋id,到根橋cost,根埠編號,指定埠編號等)會依次發生更新。直到這些字段連續15秒內未發生任何變化(計時器)(對於每個vlan而言),交換機就認為競選已結束(網路已收斂完畢),然後非堵塞埠進入學習狀態。

(某些特殊埠,如連線pc的埠和連線某個沒有啟動vlan x的交換機的埠,由於埠角色預設是所在鏈路上的指定埠,因為一直沒收到對方發來的關於vlan x的bpdu,該埠角色字段一直未更新,最終也處於****狀態)(合情合理)。

學習狀態並不是很重要,埠仍處於堵塞狀態,只是在這一階段學習鄰居和pc的mac位址。學習狀態也持續15秒,之後就進入**狀態(即正常工作狀態)。所以一般來說交換層網路交換機從通電連線到可以正常工作需30秒左右(在rstp下)。

當所有交換機進入**狀態後,網路也就「通」了,至此,交換機不用再那麼頻繁地向鄰居傳送bpdu占用頻寬了。對於每棵生成樹,因為是**狀態交換機只需**根橋的bpdu向身後的生成樹成員。此行為的目的:維護生成樹。每個根橋都廣播自身的bpdu到所有成員(成員不在傳送自己的bpdu了)。所有非根橋在最大老化時間內都要監聽到對應根橋的bpdu並且廣播它,不然就認為該生成樹已受到了破壞。

若交換網路真的發生了故障(比如其中某根網線突然被剪斷了),那就有一部分交換機收不到根橋的bpdu。 為了維護生成樹的完整,替代埠變成交換機上的根埠。大多數的堵塞埠(正常工作情況下)都是替代埠(只有當相鄰交換機之間存在兩條鏈路時,其中一條 是備份鏈路)。因為替代埠的對面必定是指定埠,因此可以通過這個替代埠從對方交換機抵達根橋。因此不需要重算生成樹,這事rstp的改進之處。(區域性等待30s)

但若網路沒有故障,而是被接入了若干新的交換機,或者併入了乙個更大的交換網路,那麼每個vlan生成樹就要重新開始從頭計算了。具體的機制是:(因為網路變化,必須讓所有交換機知曉,並停止工作回到競選的初始狀態)檢測到網路變化(vlan x)的交換機傳送乙個特殊的bpdu到它的「前任」根橋(通過乙個個根埠)。這個bpdu叫拓撲更改通知 tcn(topology change notification)(區分於bpsu版本字段)。因為生成樹重算非常重要,tcn的傳送採用可靠連線,因此相對應的確認訊息叫tca(topology change acknowledge),它們建立在每兩個交換機之間。前任根橋收到後再通知樹上的所有成員。(但個人認為不需要通知根橋,直接廣播擴散到所有成員即可)

生成樹演算法終極解析!

許多老師講乙個新協議時,總會 強制性 地給你灌輸它的各種規則,導致許多學生死記硬背之後任然一臉懵逼。我當初聽stp時 也是遺留了很多問題 比如為什麼這麼設計 這種機制為什麼不能這樣改進 如果這麼這麼的話,會怎麼怎麼樣。太多的不理解導致我的記憶效率大大降低。所以我 希望可以從乙個協議的起源,開發的目地...

終極演算法 2 終極演算法

機器學習的應用非常廣泛,更為驚人的是,相同的演算法可以完成不同的事。在機器學習領域之外,如果你要解決不同的問題,就得編寫兩個不同的程式。相同的機器學習演算法不僅可以完成無窮無盡且不同的事,而且和被它們替代的傳統演算法相比,它們要簡單得多。多數學習演算法可能只有數百行或者數千行。相比之下,傳統程式則需...

最小生成樹演算法kruskal詳細解析

kr uska l kru skal 主要思路 快排每一條邊,從小到大。接下來用迴圈列舉按順序每一條邊,當一條邊的兩個點不在同乙個並查集時,把這條邊加上,然後再把兩個點加到同乙個並查集裡。若在同乙個並查集裡,就跳過這條邊 不執行任何操作 kr uska l kru skal 實現思路 輸入邊,用結構...