L2:數據鏈路層, 構建冗余鏈路 : STP(1)


冗余鏈路出現的背景

由於公司對網絡的可靠性的要求,大部分公司都會增加額外的交換機,防止在某台交換機出現故障時造成網絡的無法使用的情況,例如形成如下圖的拓撲的結構。

假設 W 和 X 交換中的一台出現故障后,流量依然可以通過 Y 和 Z 到達 B。

雖然說這樣的結構可以很好的解決,網絡可靠性的問題。但由於這三台交換機構成了一個環路,同時也帶了一些額外的問題:

廣播風暴:

這里假設 W 不知道 B 的 MAC 地址,會采用泛洪的操作。而此時由於環狀的結構,廣播數據包會在四台交換機之間來回的傳輸,占用大量的帶寬。

多幀拷貝:

假設 W 不知道 B 的 MAC 地址,此時會泛洪發給 Y 和 X,假設 Y 和 X 知道 B 的 MAC 地址,此時會將數據包以單播的形式發給 Z,而 Z 會將兩個單播數據包傳給 B. 造成傳輸冗余的數據幀。

MAC 表不穩定:

同樣假設 W 不知道 B 的 MAC,采用泛洪。同時 X,Y,Z 也不知道 B 的 MAC。此時 W 廣播后,X 和 Y 會在 MAC 表中記錄 A 對應 MAC 在 1 號口,然后繼續泛洪給 Z. Z 按照時間順序假設在 MAC 表中記錄的是來自 Y 的數據幀,此時記錄的是 2 號口。而由於 Z 也不知道 B 的 MAC,還會廣播。此時 Y 和 X 也會收到,此時 MAC 表按照時間順序,又會改為另一個 2 號口,進而在 1 和 2 口之間來回抖動。

解決環路帶來的問題

冷備份

在連接線纜時,僅僅連接一條線路。當這條鏈路出現問題時,由管理員手動切換至另一根線路。

熱備份

線纜正常連接,在接口上進行配置,不允許該接口接受和發送任何設備。通過 STP (Spanning Tree Protocol 生成樹)實現。

STP

STP 協議會先進行計算選擇一個樹根,然后將樹根上的一個接口進行阻塞,進而無法構成環路。

STP 選舉規則 - 802.1D

在所有設備啟動時,所有交換機都認為自己是根,然后廣播發送 BPDU(Bridge Protocol Data Unit),然后在 BPDU 中的某些參數選擇一個真正的樹根。

  1. 在整個拓撲上,選擇一台根交換機。
  2. 對每台非根交換機上,選擇一個根端口(RP)。其實就是在非根交換機上離根交換機最近的端口,如果距離一樣,則依次比較 BPDU 內的參數。
  3. 在每條網線上(每個網絡),選一個指定端口(DP)。同樣在鏈路上先找到根交換機最近的端口,如果一樣,則依次比較 BPDU.
  4. 余下端口為 BP,被阻塞的端口。

BPDU 比較參數,按照如下的順序進行比較:

  1. 根橋 ID(優先級 0 - 61440,默認值為 32768,配置為 4096 的倍數,根的 MC 地址)先比較優先級,再比較 MAC(交換機的背板 MAC 地址)
  2. COST(發送者橋 ID 到根橋的距離)
  3. 發送者橋 ID(優先級,橋 MAC 地址)
  4. 發送者端口 ID(優先級 0 -240,默認 128,配置為 16 的倍數,接口號)先比優先級,選小的,再比接口號。

例子 1

以下拓撲為例,模擬下選擇 BPDU 的過程,假設 MAC 地址大小為:SW1 < SW2 < SW3.

首先判斷根橋 ID,如果沒有配置過,默認都是一樣的。接着會比較 MAC 地址,選出最小的 MAC 作為根橋, 也就是 SW1.

在選出根后,根會每 2s 發送一次 BPDU,然后非根交換機轉發 BPDU。

比較 COST,SW1 作為根會向 SW2 和 SW3 轉發 BPDU,而 SW2 和 SW3 同時也會轉發收到的 BPDU 給對方。這里假設都是百兆鏈路。

這里以 SW2 為視角,會收到 SW1 發送的 BPDU 和 SW3 轉發 SW3 的 BPDU. 對於 SW2 的 1 號接口來說 COST 為 0(發送者為 SW1,根橋 ID 為 SW1),對於 2 號口來說,COST 為 19(發送者 SW3,根橋 ID 為 SW1).

100 M -> COST = 19

10 M -> COST = 100

進而 0 小於 19,1 號口為成為 RP.

同理,在 SW3 的視角,收到 SW1 和 SW2 轉發 SW1 的BPDU. 選擇 2 號口為 RP.

下面接着選擇 DP:

先站在 SW1 和 SW2 這條網段的視角,在該網段可以接收到 SW1 直接發送的 BPDU (記為 SW1 1 號口)和 經過 SW2 和 SW3 轉發過來的 BPDU(記為 SW2 1號口). 這里比較下兩者的 BPDU.

  1. 首先比較根橋 ID,都是 SW1,一樣,繼續比較。
  2. 比較 COST,
    • SW1 1 號口,根橋 ID 和 發送者 ID 都是 SW1,所以 COST 為 0
    • SW2 1 號口,根橋 ID 為 SW1,發送者為 SW3, 經過 SW2. 所以 COST=19 +19=38
    • 0 < 19 , SW1 1 號口為成為 DP.

站在 SW1 和 SW3 這段網絡上,同理:

  1. 首先比較根橋 ID,都是 SW1,一樣,繼續比較。
  2. 比較 COST:
    • SW1 2 號口,根橋 ID 和 發送者 ID 都是 SW1,所以 COST 為 0
    • SW3 2 號口,根橋 ID 為 SW1,發送者為 SW2, 經過 SW3. 所以 COST=19 +19=38
    • 0 < 19, SW3 2 號口為 DP.

最后站在 SW2 和 SW3 這條網段上:

  1. 首先比較根橋 ID,都是 SW1,一樣,繼續比較。
  2. 比較 COST:
    • SW2 2 號口,發送者為 SW2 2 號口,根橋 ID 為 SW1 COST = 19
    • SW3 1 號口,發送者為 SW3 1 號口,根橋 ID 為 SW1 COST = 19
    • 相等繼續比較。
  3. 比較發送者橋 ID 大小:
    • SW2 的 MAC 小於 SW3 的 MAC
    • 所以選 SW2 的 2 號口為 DP.

最終,余下接口 SW3 的 1 號口為阻塞接口。

總結一下概念:

RP:到根交換機最近的非根交換機接口

DP:在交換機中的連線上,到達根交換機最近的接口

例子2

首先假設 SW1 MAC 小於 SW2,所以根為 SW1.

選擇 RP:

以 SW2 的視角,比較過程如下:

  1. 根橋 ID 都是 SW1,一樣,繼續比較.
  2. 比較 COST,對於 3 和 4 兩個口來說,發送者和根橋ID都一樣,相等。
  3. 比較發送者 ID,都是 SW1 本身 一樣。
  4. 比較發送者接口 ID,1 < 2. 所以 3 為 RP。

選擇 DP:

以 1,3 連線的視角:

  1. 根橋 ID 一致。
  2. 比較 COST, 選擇 1 號口。COST=0, 另一個為 19. s所以 1 為 DP.

以 2,4 連線的視角:

  1. 根橋 ID 一致。
  2. 比較 COST, 同理選擇 2 號口,為 DP.

最后 4 號口為 BLOCK。

這里假設 1,3 口為 10M,2,4 為百兆鏈路。可以發現如果按照上述的規則,4 號口還是一樣會被阻塞。但這不符合常理,因為 2,4 口的帶寬明顯更大。

所以這里的 COST 比較還需要調整,對於選擇 DP 不需要改變。

但對於選擇 RP 的過程,COST 的值需要加上入接口的 COST

也就是說,在 1,3 連線時。COST 的比較值為:1 號口的 COST 為 0 + 100. 2 號口的 COST 為 0 +19. 所以選擇為 4 號口。

STP 狀態

  • Disabled: 禁用狀態,STP 協議未開啟,或端口未打開。
  • Blocking: 阻塞狀態,不能轉發數據,但可以收 BPDU.
  • Listening: 確定端口角色。
  • Learning:學習 MAC 地址,建立 MAC 表。
  • Forwarding: 轉發狀態。

在交換機接口打開時,進入到 Listening 狀態,進行 STP 的計算,需要等待 15s 轉發延時。在選舉時,無法轉發數據。

當 Listening 狀態結束后,進入 Learning 狀態,學習 MAC 地址,建立 MAC 地址表,需要等待 15s 轉發延時。

之后進入 Forwarding 狀態,正常轉發數據。

如果是被 STP 阻塞的端口進入 Blocking 狀態,不能轉發數據,但可以接受 BPDU. 當在 20s 內沒有收到 BPDU 時,會進入 Forwarding 狀態,開始轉發數據。

下面看幾個具體的例子:

假設網絡發生改變,SW1 和 SW2 之間的線斷了。此時,SW2 會認為自己是根,因為 SW3 的端口被阻塞,SW2 收不到 SW3 的 BPDU.

此時 SW2 會發送 BPDU 給 SW3,BPDU 內容為(4096, 1, 4096,接口),但 SW3 之前緩存的 BPDU 是(0, 1,4096,接口),發現緩存的 BPDU 更好,所以不會接受 SW2 發來的 BPDU.

直到 20s 過去后,原有的 BPDU 老化,才會接受的新的 BPDU.

接着,SW3 被阻塞的端口被打開,可以發送自己 BPDU 給 SW2,內容為 (0,1,32768,接口),SW2 收到后,發現比自己的好,因為 SW2 的 MAC 地址小。所以認為 SW1 為根,自己的口為 RP.

綜上從開始等待老化的 20s 和重新選擇角色的 30s,恢復網絡總共可能最長需要 50s 的時間。

再假設 SW1 和 SW3 的線斷了。

此時 SW3 的 RP 口失效,所以會重新選擇角色。此時阻塞口一直能收到 SW2 的 BPDU,SW3 發現該 BPDU,比自己發送的 BPDU 好。所以認為 SW1 為 根。

該過程,恢復網絡最多需要 30s.

再看一個實際的場景:

還是 SW1 和 SW3 的線斷了。此時拓撲的恢復可能需要 30s 的時間,但 30s 過后,PC1 和 PC2 還有可能是不通的。

因為之前在未斷線時,PC1 PING PC2 是通過 SW2 的接口 1 發送的,在轉發時,會查 MAC 地址表,而 PC2 的對應接口是接口 1.

當拓撲改變后,雖然經過 30s 重新確定了角色,但對於 SW2 來說,接口1 和 PC2 的 MAC 地址對應關系依然存在。而 MAC 地址的老化時間是 300s.

所以就意味着還需要 300s 的時間,PC2 才能通過接口 2 發送。

但對於一些對網絡連通性的企業來說,如銀行等,這樣的恢復時間太長了。所以就需要通過另外一種機制,解決該問題。

具體來說就是,當拓撲改變時(一個接口由 Blocking 過度到 forwarding 狀態),發生改變的交換機,會從 RP 端口向上游交換機(根交換機方向)發送 TCN BPDU(另一種 BPDU),上游交換機收到后,發送 ACK 確認。

上游交換機繼續向根的方向發送 TCN BPDU,直到根收到。並向下游發送 TC 消息。收到 TC 消息的交換機會將自己的 MAC 地址老化時間改為 15s, 並向下游擴散,直到全網。

STP

查看 STP 信息

如果是思科的交換機話,默認會選擇 PVST+ 作為默認的 STP 協議。

其中優先級是將 VLAN 號和優先級組成(4bit vlan 號,16 bit 優先級)。

# 查看 sw1
sw1#show spanning-tree
VLAN0001
  Spanning tree enabled protocol ieee
  # 表示根信息
  Root ID    Priority    32769                # vlan is 1, so priority equal 32768 add 1
             Address     aabb.cc00.1000       # mac 
             This bridge is the root          # to represent root
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             
 # 表示自己的信息
  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     aabb.cc00.1000
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time  300 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Desg(指定端口,DP) FWD 100       128.1    P2p
Et0/1               Desg(指定端口,DP) FWD 100       128.2    P2p
Et0/2               Desg FWD 100       128.3    P2p
Et0/3               Desg FWD 100       128.4    P2p

# 查看 sw2
sw2#show spanning-tree

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32769
             Address     aabb.cc00.1000
             Cost        100
             Port        1 (Ethernet0/0)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     aabb.cc00.2000
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time  300 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Root FWD 100       128.1    P2p
Et0/1               Desg FWD 100       128.2    P2p
Et0/2               Desg FWD 100       128.3    P2p
Et0/3               Desg FWD 100       128.4    P2p


# 查看 sw3
sw3#show spanning-tree

VLAN0001
  Spanning tree enabled protocol ieee
  Root ID    Priority    32769
             Address     aabb.cc00.1000
             Cost        100
             Port        2 (Ethernet0/1)
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
             Address     aabb.cc00.3000
             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec
             Aging Time  300 sec

Interface           Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------------------------------
Et0/0               Altn(阻塞端口) BLK 100       128.1    P2p
Et0/1               Root FWD 100       128.2    P2p
Et0/2               Desg FWD 100       128.3    P2p
Et0/3               Desg FWD 100       128.4    P2p

# 調整根-讓 SW2 成為根-調整優先級
sw2(config)#spanning-tree vlan 1 root primary

# 調整次根-讓 sw3 成為次根
sw3(config)#spanning-tree vlan 1 root secondary

總結

當對網絡的可靠性有要求時,一幫會采用連接多台交換機,用於冗余備份,但由於出現環路的風險,需要通過 STP 技術在邏輯上將某些接口阻塞掉,防止形成環路。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM