STP協議的形象化理解

2022-09-22 20:39:25 字數 3576 閱讀 8161

stp協議的形象化理解

還是那句話,在學習乙個協議的時候,先搞清楚問題是什麼,也就是說這個協議是為了解決什麼問題滿足什麼需求的,然後試著自己在腦子裡實現它,也就是說如果自己碰到這樣的問題,在沒有任何背景,沒有任何可用的技術時,該如何來解決它。等到自己想到了辦法,再和標準的協議作對比,看看自己的想法缺失了什麼,什麼地方理解有偏差,只有這樣才能領略到該協議設計思想的精髓,學習也才會事半功倍!如果上來就是看rfc,啃ieee,啃**,那十有**會迷失在細節中,最終累得夠嗆,好不容易看明白了,基本沒什麼積累,最終過不了幾天不用不溫習,就徹底忘完了...難道不是這樣嗎?

www.2cto.com  

對於乙太網,為何會有最小生成樹的問題?這實際上是一種為冗餘補償所付出的代價,畢竟沒有什麼是免費的,任何技術都是解決不了所有問題的,只可惜當年的克拉蘇沒有意識到這一點,終歸命斷帕提亞...乙太網最初是乙個廣播網路,只要在一點發出乙個資料幀,過不了多久,該資料幀就會傳染遍整個網路,當時的任何裝置都沒有學習機制,只管收到幀就毫不猶豫地**,這種方式會不會有問題完全取決於如何連線,如果連線線纜出現環,那麼資料幀便會永遠在網路裡面環繞,進而引發廣播風暴,如果沒有環,資料幀就會在到達線纜的終點時自動被吸收而消失。理解以上的文字只需要知道當初的線纜是半雙工同軸線纜,裝置也只是洪氾**的兩端口網橋或者是多埠hub。

那麼在佈線時顯式避免環路不就可以了嗎?然而一旦某條鏈路出現問題,就要重新佈線,這也是不可取的,因此需要一種機制,那就是人工提供冗餘佈線,也就是人工將乙太網組成乙個環路,然後設計一種軟體機制來避免環路的出現,也就是通過軟體途徑來斷開某條連路從而切斷環,並且在鏈路出現問題的時候,可以自動生成另一條無環的鏈路,這一切必須不需要人工干預才行得通。這就必須要求所有的裝置能聯合完成上面的事。

總而言之,乙太網上之所以會出現stp,就是因為兩點原因,第一,乙太網最初被設計成了在同軸上跑的廣播網,第二,需要提供冗餘功能。二者結合就會出現「需要自動避免環路以及動態觸發更新路徑問題」,而這個問題的解決方案就是--stp,即生成樹協議。

www.2cto.com  

任何技術背後都要有理論支撐,stp也不例外。我們幾乎都知道最小生成樹演算法,其中prim演算法生成的樹是由乙個根慢慢長出來的,而kruskal演算法生成的樹則開始是無根的n棵樹,然後將其嫁接而成一棵樹所得的。雖其思想不同卻能殊同歸。如果自己碰到了乙太網環路的問題,則怎麼利用既有的生成樹演算法來實現乙個stp'(以區分ieee的生成樹協議)協議呢?由於乙太網本質上是乙個廣播網,資料幀可以通傳整網,那麼使用嫁接的kruskal演算法就有點不妥了,kruskal演算法的本質在於它能使游離的樹嫁接成一棵樹,而在乙太網上,沒有什麼是游離的,只要裝置節點有線纜連線,它們就是一棵樹,而為了冗餘備份,所有的節點人工連線時就是互聯互通的,這就決定了針對乙太網的故意環路,用prim演算法是比較好的。

問題在於,對於乙個有環的乙太網,雖然我們人類可以一眼看出環在**,可是對於裝置(hub,網橋,交換機...)卻不能,它們只是一部機器而已。我們需要的是要這些裝置形成乙個共識,這個共識可以讓它們中的每乙個都知道全域性的情況,而這正是乙太網的優勢所在,因為它是廣播網路。

這裡順便插一段,所有的網路路由協議,包括鏈路層的和網路層的,都有兩種演算法,一種是所有節點先生成全域性資料庫後再分別計算的協議,比如三層路由協議中的ospf,另外一種則是分布式的依賴於洪氾時間的協議,比如三層的rip協議以及二層的stp協議。對於前者,基於全域性資料庫,則比較簡單,因為大家的資料庫都是一致的,計算的結果也必然一致,但是對於後者,分布式的,則比較困難,每乙個節點的決策都要依賴其它的節點,而對於某乙個裝置又不可能知道其它裝置的情況,這該怎麼辦?萬能的東西是什麼?時間!我們只需要知道乙個節點發出的訊息在最多多久可以傳遍全網,就可以知道所有的節點訊息達到一致的時間是多久,在過了這段時間之後,我們就可以讓其做下一步的事情了。當然,這個結論的前提在於每個節點都信任其它節點的訊息,不會自作主張而篡改訊息,這是乙個原則,叫做「效率來自於信任」(我會再寫一篇闡述)。

怎麼辦呢?首先要選擇乙個根。在prim演算法中,根是隨意選出的,可是對於裝置,「隨意」這個對於人而言最簡單不過的詞對於機器裝置而言卻顯得過於複雜,因此需要一種機制來選擇乙個根節點。對於每乙個裝置而言,它自己需要有[且不止只有]一條路徑連線到根節點,對於標準的prim演算法,任何構成環的「邊」都要被砍掉,可是對於乙太網來講,所謂的邊正是承載計算機的所在,因為還需要為被砍掉的邊再選擇乙個鏈路到達根,只有這樣,才能使不僅節點,還有邊,都能通過唯一的鏈路到達根節點,從而形成一棵樹!

www.2cto.com  

prim演算法中的樹根是隨意選擇的,可是在stp'中卻不能這樣,必須有一定的規則來確定乙個根,那麼就必須在所有的交換機/橋裝置之中選擇乙個樹根,記住,我們本質上就是要把全連通的圖切割成一棵樹。選擇樹根比較簡單,只需遵循一定的規則,比如ieee802.1d中為所有交換機進行編號,取最小的即可。

可是怎麼知道誰是最小的呢?這正是用到了乙個資料幀在乙個乙太網中傳輸的時間這一特性。乙個乙太網是有規模限制的,它必須被限制到幾百公尺之內,而乙個電訊號在這麼個距離內的傳輸時間由此而被確定,因此我們可以確認,乙個資料幀肯定能在最長x時間內傳遍全網,進而各個裝置節點得到的資訊終相一致,這個選擇訊息在實現中可以用洪氾的方式來廣播,當然ieee的實現做了些優化,即當乙個節點收到了更優的資訊時便不再廣播自己的訊息。

接下來就是如何切斷某條鏈路的問題了。對於每乙個裝置,有且只有一條路通往已經被選出的樹根,而乙個裝置可能有多個埠,因此每個裝置必須在這多個埠中選擇乙個埠來作為通往樹根的埠,怎麼選擇呢?這也是通過洪氾實現的,樹根既然已經被選出,它便發出乙個幀,這個幀由於乙太網的廣播特性,最終將可以到達所有的埠,每個裝置在**該幀時需要加入自己的度量值,最終每個裝置的每個埠都將收到乙個帶有度量值的幀,每個裝置在每個埠的這些幀中選擇乙個度量值最小的最為該裝置通往樹根的埠,這個埠在ieee標準中叫做根埠!  www.2cto.com  

到此為止,生成樹其實已經生成了,還需要做什麼?標準的生成樹prim演算法毅然的砍斷了n條構成環路的邊,這些邊將不再需要,可是對於乙太網的應用,每一條邊都不是可以丟棄的,因為所有的計算機全部都掛在這些邊上,換句話說,每一條邊上都掛接有計算機,因此必須將每一條被prim演算法砍掉的邊選擇乙個裝置節點作為該邊通往樹根的出口。我們知道,乙太網上所謂的一條邊其實就是一條同軸線或者雙絞線,它們根本沒有智慧型,擁有智慧型的還是裝置。

剛才在選擇ieee802.1d根埠的時候,除了根埠之外的所有埠按prim演算法說都應該被阻斷,可是它們可能還需要承載被砍掉的邊上計算機的資料幀而不能被砍斷。到底哪些埠需要承載被砍斷邊的流量呢,這仍然和度量有關,我們稱為度量3,每乙個埠都有乙個到樹根的度量,也能收到對端到根的度量,和根埠選擇不同的是,這個度量3對於本端和對端來講都已經加上了裝置的度量,而根埠的選擇過程中,都沒有加入本裝置的度量。最終我們只需要阻斷那些度量3大於對端傳來的度量3的埠即可!沒有被阻斷的埠在這一步中叫做指定埠。

www.2cto.com  

到此為止,一棵樹生成了!而且是最小樹!所需要的知識無非幾點:prim演算法,乙太網廣播特性,洪氾。如果總結一下整個過程,那麼將得到三點:

1.首先在所有裝置中選擇乙個根節點;

2.其次為每乙個裝置選擇乙個根埠通向根節點;

3.再次為每一條被砍斷的鏈路選擇乙個指定埠通向根。

理解了以上的過程,再看ieee802.1d文件,那就只是乙個總結的過程了,沒有什麼難以理解的了。學習乙個協議,難道還有比這更簡單且愉快的嗎?相比一開始就閱讀ieee文件,閱讀linux**來講,這個過程既輕鬆又愉快,你只需要明白prim演算法,然後擁有一顆喜歡思考的大腦即可,不是嗎?

對rdt傳輸協議的形象化理解

1.rdt1.0 這個版本的rdt協議就像傳統的老師給你講課,傳送方只用傳送資料,就像老師滔滔不絕,接收方只用接收資料,就像你在底下努力的往自己的小腦瓜裡塞知識,至於塞不塞的進,有沒有接收到老師的話,老師也不管,他會假設你們都聽進去了,就像rdt1.0假設通道是安全的一樣,具體的原理圖如下 這個版本...

02BLE協議各層的形象化理解

先上框圖 att層 從att開始看,在上篇部落格講的醫院結構裡面有個檢驗室,檢驗室可以得到各項結果,但是它並不知道這些結果代表什麼含義。模擬的在ble 協議棧裡面,att定義了各種屬性 屬性的操作方法,但是這些屬性有什麼作用,能給使用者提供什麼服務,它並不知道。舉例如下 假設有兩個藍芽裝置,乙個是手...

資源管理概念的形象化

收租婆錢姐,她年輕時在回龍觀幾十個小區買了幾百套房,老了靠收租生活。為了管理這些房子,她用了如下幾個概念 小王來租房,它一要看小區 zone 離地鐵近不近,二來要看戶型 unitconfig 少於60平公尺的不考慮。根據這兩個條件,就可以確定若干個單元 unit 作為候選了。小李也來租房,不過他是個...