跳轉到內容

區域網設計/生成樹協議

來自華夏公益教科書,開放的書籍,開放的世界
Previous page
乙太網網路的先進功能
區域網設計 Next page
快速生成樹協議
生成樹協議

環路問題

[編輯 | 編輯原始碼]
在具有環形拓撲結構的資料鏈路網路中,向不在過濾資料庫中的站點發送單播幀的示例。

如果網路在拓撲結構上具有邏輯環,則某些幀可能會無限期地以鏈式乘法方式在環路上移動。

  • 廣播/組播幀:它們始終在所有埠上傳播,導致廣播風暴
  • 單播幀傳送到一個站點,但該站點不在過濾資料庫中或不存在:它們以泛洪方式傳送。

此外,環路中的網橋的過濾資料庫可能不一致,也就是說,與傳送方站點相關的過濾資料庫中的條目每次有複製幀從不同的埠到達時都會更改其埠,這使得網橋認為該幀來自站點本身移動。

生成樹演算法

[編輯 | 編輯原始碼]

生成樹演算法允許透過停用鏈路[1]從網路物理拓撲中移除邏輯環,從而將網狀拓撲(圖)轉換為稱為生成樹的樹,其根是網橋之一,稱為根橋

每個鏈路都以基於鏈路速度的成本為特徵:給定一個根橋,可以構建多個生成樹,將所有橋彼此連線,但生成樹演算法選擇由最低成本邊組成的生成樹。

引數
  • 網橋識別符號:它唯一標識網橋,包括
    • 網橋優先順序:可以自由設定(預設值為 32768);
    • 網橋 MAC 地址:它由供應商特定的演算法從其埠的 MAC 地址中選擇,無法更改;
  • 埠識別符號:它標識網橋埠,包括
    • 埠優先順序:可以自由設定(預設值為 128);
    • 埠號:理論上網橋不能超過 256 個埠→在實踐中,如果需要,也可以使用埠優先順序欄位;
  • 根路徑成本:它等於生成樹演算法選擇的所有鏈路的成本之和,這些鏈路用於到達根橋(穿過網橋的成本為零)。

可以使用以下標準確定生成樹。

根橋是生成樹的根:所有從其子樹之一到另一個子樹的幀都必須穿過根橋。[2]

具有最小網橋識別符號的網橋被選中為根橋:因此,生成樹的根將是具有最低優先順序的網橋,或者如果優先順序相同,則選擇具有最低 MAC 地址的網橋。

根埠是負責連線到根橋的埠:它向根橋傳送幀,並從根橋接收幀。

  1. 從網橋到根的每條可能路徑的成本都是確定的。在這些路徑中,選擇成本最小的路徑(最低成本路徑)。然後,連線到該路徑的埠是網橋的根埠。
  2. 當從網橋到根的多個路徑是最低成本路徑時,網橋使用具有最小網橋識別符號的相鄰網橋將幀轉發到根。因此,根埠是連線到具有最低網橋識別符號的網橋的埠。
  3. 當兩個網橋由多條電纜連線時,單個網橋上的多個埠是根埠的候選者。在這種情況下,使用透過相鄰網橋上具有最小埠識別符號的埠的路徑。
  4. 在遠端埠識別符號相等的集線器特定配置中,使用透過網橋本身具有最小埠識別符號的埠的路徑。

指定埠

[編輯 | 編輯原始碼]

指定埠是負責服務鏈路的埠:它向葉子傳送幀,並從葉子接收幀。

  1. 從連線到鏈路的每個網橋到根的每條可能路徑的成本都是確定的。在這些路徑中,選擇成本最小的路徑(最低成本路徑)。連線到導致該路徑的網橋的鏈路的埠是鏈路的指定埠。
  2. 當鏈路上的多個網橋導致通往根的最低成本路徑時,鏈路使用具有最小網橋識別符號的網橋將幀轉發到根。將該網橋連線到鏈路的埠是鏈路的指定埠。
  3. 當橋接器連線到具有多個電纜的鏈路時,單個橋接器上的多個埠是指定埠的候選埠。在這種情況下,使用透過橋接器本身的埠(具有最小埠識別符號)的路徑。

阻塞埠

[編輯 | 編輯原始碼]

阻塞埠永遠不會在其鏈路上傳送幀,並丟棄所有接收到的幀(BPDU 配置訊息除外)。

任何不是根埠或指定埠的活動埠都是阻塞埠。

此圖說明了針對示例網路由生成樹演算法計算的所有埠狀態。

BPDU 訊息

[編輯 | 編輯原始碼]

上述標準描述了確定演算法將計算出哪種生成樹的一種方法,但是按此編寫規則需要了解整個網路。橋接器必須確定根橋接器並僅使用它們所擁有的資訊來計算埠角色(根、指定或阻塞)。

由於橋接器可以交換有關橋接器識別符號和根路徑成本的資訊,因此生成樹協議 (STP)(標準化為 IEEE 802.1D (1990))定義了稱為BPDU的訊息。

BPDU 格式

[編輯 | 編輯原始碼]

BPDU 具有以下格式

STP 中的配置 BPDU 格式(35 位元組)。
1 7 8 16 24 32
協議 ID (0) 版本 (0) BPDU 型別 (0)
TC 000000 TCA 根優先順序
根 MAC 地址
根路徑成本
橋接器優先順序
橋接器 MAC 地址
埠優先順序 埠號 訊息年齡
最大年齡 Hello 時間
轉發延遲
拓撲更改通知 BPDU 格式(4 位元組)。
16 24 32
協議 ID (0) 版本 (0) BPDU 型別 (0x80)

其中欄位為

  • 協議識別符號 欄位(2 位元組):指定 IEEE 802.1D 協議(值 0);
  • 版本 欄位(1 位元組):區分生成樹協議(值 0)和快速生成樹協議(值 2);
  • BPDU 型別 欄位(1 位元組):指定 BPDU 型別
    • 配置 BPDU (CBPDU)(值 0):用於生成樹計算,即確定根橋接器和埠狀態: #新橋接器的接入
    • 拓撲更改通知 BPDU (TCN BPDU)(值 0x80):用於宣佈網路拓撲中的更改,以便更新過濾資料庫中的條目: #宣佈拓撲更改
  • 拓撲更改 (TC) 標誌(1 位):由根橋接器設定,以通知所有橋接器網路中發生了更改;
  • 拓撲更改確認 (TCA) 標誌(1 位):由根橋接器設定,以通知檢測到更改的橋接器其拓撲更改通知 BPDU 已收到;
  • 根識別符號 欄位(8 位元組):指定網路中根橋接器的橋接器識別符號
    • 根優先順序 欄位(2 位元組):包含根橋接器的優先順序;
    • 根 MAC 地址 欄位(6 位元組):包含根橋接器的 MAC 地址;
  • 橋接器識別符號 欄位(8 位元組):指定正在傳播配置 BPDU 的橋接器的橋接器識別符號
    • 橋接器優先順序 欄位(2 位元組):包含橋接器的優先順序;
    • 橋接器 MAC 地址 欄位(6 位元組):包含橋接器的 MAC 地址;
  • 根路徑成本 欄位(4 位元組):包含到達根橋接器的路徑成本,如正在傳播配置 BPDU 的橋接器所見;
  • 埠識別符號 欄位(2 位元組):指定橋接器正在其上傳播配置 BPDU 的埠的埠識別符號
    • 埠優先順序 欄位(1 位元組):包含埠優先順序;
    • 埠號 欄位(1 位元組):包含埠號;
  • 訊息年齡 欄位(2 位元組):值,初始化為 0,每當配置 BPDU 穿過橋接器時,會增加整個橋接器的傳輸時間;[3]
  • 最大年齡 欄位(2 位元組,預設值為 20 秒):如果訊息年齡達到最大年齡值,則接收到的配置 BPDU 將不再有效;[3]
  • Hello 時間 欄位(2 位元組,預設值為 2 秒):指定根橋接器生成配置 BPDU 的頻率;[3]
  • 轉發延遲 欄位(2 位元組,預設值為 15 秒):指定強制埠轉換到另一種狀態的等待時間。[3]

BPDU 生成和傳播

[編輯 | 編輯原始碼]

只有根橋接器才能生成配置 BPDU:所有其他橋接器只是在其所有指定埠上傳播接收到的配置 BPDU。 根埠是接收最佳配置 BPDU 的埠,即具有最低訊息年齡值 = 最低根路徑成本的埠。 阻塞埠從不傳送配置 BPDU,但會持續監聽傳入的配置 BPDU。

相反,拓撲更改通知 BPDU 可以由任何非根橋接器生成,並且它們始終透過根埠傳播。

當橋接器生成/傳播 BPDU 幀時,它使用埠本身的唯一 MAC 地址作為源地址,使用 STP 多播地址 01:80:C2:00:00:00 作為目標地址

6 位元組 6 位元組 2 位元組 1 位元組 1 位元組 1 位元組 4 位元組
01:80:C2:00:00:00(多播) 源橋接器地址(單播) ... 0x42 0x42 0x03 BPDU ...
目標 MAC 地址 源 MAC 地址 長度 DSAP SSAP CTRL 有效載荷 FCS

動態行為

[編輯 | 編輯原始碼]

埠狀態

[編輯 | 編輯原始碼]
停用
因為沒有連結連線到埠,所以埠被關閉。
阻塞
如果埠處於活動狀態,則會導致迴圈的埠。在阻塞狀態下不會透過埠傳送或接收任何幀(配置 BPDU 仍會在阻塞狀態下接收),但如果使用的其他連結出現故障,並且生成樹演算法確定埠可以過渡到轉發狀態,則它可能會進入轉發狀態。
監聽
橋接器處理配置 BPDU 並等待可能導致埠返回阻塞狀態的新資訊。它不會填充過濾資料庫,也不會轉發幀。
學習
雖然埠尚未轉發幀,但橋接器會從接收到的幀中學習源地址並將其新增到過濾資料庫中。它會填充過濾資料庫,但不會轉發幀。
轉發
接收和傳送資料的埠。STP 仍然會監視傳入的配置 BPDU,因此埠可能會返回阻塞狀態以防止迴圈。
STP 中的埠角色和狀態。
埠狀態 埠角色 接收幀? 接收和處理 CBPDU? 生成或傳播 CBPDU? 更新過濾資料庫? 轉發幀? 生成或傳播 TCN BPDU?
停用 阻塞
阻塞
監聽 (在過渡時)
學習 指定
轉發 指定

新橋接器的接入

[編輯 | 編輯原始碼]

當一個新的網橋連線到資料鏈路網路時,假設它的網橋識別符號比網路中當前根網橋的網橋識別符號高

  1. 首先,網橋在不知道網路其他部分的情況下,假設自己是根網橋:它將所有埠設定為指定(監聽狀態),並開始在其上生成配置 BPDU,聲稱自己是根網橋;
  2. 其他網橋接收新網橋生成的配置 BPDU,並將新網橋的網橋識別符號與網路中當前根網橋的網橋識別符號進行比較,然後將其丟棄;
  3. 網路中的根網橋會定期生成配置 BPDU,其他網橋從其根埠接收這些 BPDU,並透過其指定埠進行傳播;
  4. 當新網橋從網路中的根網橋接收配置 BPDU 時,它會發現自己不是根網橋,因為存在另一個網橋,其網橋識別符號比它低,然後它停止生成配置 BPDU,並將接收來自根網橋的配置 BPDU 的埠設定為根埠;
  5. 新網橋還開始傳播配置 BPDU,這次是與網路中的根網橋相關的,在所有其他(指定)埠上傳播,同時它繼續接收其他網橋傳播的配置 BPDU;
  6. 當新網橋在一個指定的埠上接收到一個“最佳”的配置 BPDU 時,該配置 BPDU 根據指定埠選擇標準,與它在該埠上傳播的配置 BPDU 相比,它停止傳播配置 BPDU,並變為阻塞(阻塞狀態);
  7. 經過一段時間的轉發延遲後,仍然處於指定狀態的埠和根埠從監聽狀態切換到學習狀態:網橋開始填充其過濾資料庫,以防止網橋立即開始傳送幀,從而導致網路泛洪過載;
  8. 經過一段時間的轉發延遲後,指定埠和根埠從學習狀態切換到轉發狀態:網橋可以將普通幀傳播到這些埠。

網路拓撲的變化

[編輯 | 編輯原始碼]

重新計算生成樹

[編輯 | 編輯原始碼]

當拓撲發生變化時,STP 能夠檢測到拓撲變化,這得益於根網橋定期生成配置 BPDU,並且透過根據需要重新計算生成樹(即根網橋和埠狀態)來繼續保證拓撲中沒有環路。

[編輯 | 編輯原始碼]

當鏈路(屬於當前生成樹)發生故障時

  1. 根網橋生成的配置 BPDU 無法再到達網路的另一部分:特別是,故障鏈路的指定埠不再發送配置 BPDU;
  2. 鏈路之外的阻塞埠最後收聽的配置 BPDU 在網橋本身內“老化”,即其訊息年齡隨著時間的推移而增加;
  3. 當訊息年齡達到最大年齡值時,最後收聽的配置 BPDU 過期,網橋開始重新選舉自己為根網橋:它將所有埠重置為指定狀態,並開始生成配置 BPDU,聲稱自己是根網橋;
  4. STP 繼續與之前討論的新網橋接入相關的情況類似
    • 如果存在一個不屬於連線兩個網路部分的生成樹的鏈路,那麼最後連線到該鏈路的阻塞埠將變為轉發狀態的根埠,該鏈路將加入生成樹;
    • 否則,如果兩個網路部分無法再相互連線,那麼每個網路部分都會選舉一個根網橋。
[編輯 | 編輯原始碼]

當插入新的鏈路時,新鏈路連線的埠將變為監聽狀態的指定埠,並開始傳播網路中根網橋生成的配置 BPDU→新的配置 BPDU 透過新鏈路到達

  • 如果鏈路的成本足夠低,連線到該鏈路的網橋開始從非根埠接收配置 BPDU,這些配置 BPDU 的根路徑成本低於從根埠接收的配置 BPDU 的根路徑成本→更新根埠,以便可以到達最佳路徑的根網橋(基於根埠選擇標準),以及指定埠和阻塞埠可能也會相應更新;
  • 如果鏈路的成本過高,穿過它的配置 BPDU 的根路徑成本過高→連線到新鏈路的兩個埠中的一個將變為阻塞狀態,另一個埠將保持指定狀態(基於指定埠選擇標準)。

宣佈拓撲變化

[編輯 | 編輯原始碼]

當拓撲發生變化後,STP 透過更改埠狀態來改變生成樹時,它不會更改網橋過濾資料庫中的條目以反映這些變化→條目可能過時:例如,傳送到某個目的地的幀可能繼續透過一個變為阻塞狀態的埠傳送,直到與該目的地相關的條目過期,因為其老化時間變為 0(在最壞情況下:5 分鐘!)。

STP 考慮了一種機制,在檢測到拓撲變化時,可以加快網路相對於過濾資料庫的收斂速度

  1. 檢測到拓撲變化的網橋透過其根埠向根網橋生成一個拓撲變化通知 BPDU,以宣佈拓撲變化;[4]
  2. 交叉網橋立即透過其根埠轉發拓撲變化通知 BPDU;
  3. 根網橋生成一個包含拓撲變化標誌和拓撲變化確認標誌都設定為 1 的配置 BPDU,該 BPDU 在被交叉網橋轉發後,將被檢測到拓撲變化的網橋接收;[5]
  4. 根網橋在其所有指定埠上生成一個包含拓撲變化標誌設定的配置 BPDU;
  5. 每個網橋在接收配置 BPDU 時
    1. 刪除其過濾資料庫中所有老化時間小於轉發延遲的條目;
    2. 依次在其所有指定埠上傳播配置 BPDU(保持拓撲變化標誌設定);
  6. 網路暫時處於次優狀態,因為更多的幀以泛洪的方式傳送,直到網橋透過學習演算法重新填充其過濾資料庫中的新路徑。

STP 的理念是“始終拒絕,只有確定時才允許”:當拓撲發生變化時,幀不會被轉發,直到確定瞬態已經消失,即不存在環路,並且網路處於一致狀態,這也引入了很長的等待時間,以犧牲收斂速度和到達某些站點的能力為代價。

假設遵循標準推薦的計時器,即

  • 採用標準推薦的計時值:最大年齡 = 20 秒,問候時間 = 2 秒,轉發延遲 = 15 秒;
  • BPDU 透過每個網橋的傳輸時間不超過傳輸延遲 = 問候時間 ÷ 2 = 1 秒;

兩個端系統之間的級聯中不能連線超過 7 個網橋,以便配置 BPDU 可以在轉發延遲內兩次穿過整個網路:如果實際上在級聯中添加了第八個網橋,在最壞的情況下,新網橋(自選為根網橋)的埠將從監聽狀態切換到轉發狀態[6],早於來自網路另一端的根網橋的配置 BPDU 有時間到達新網橋;[7]

隨著學習狀態的引入,鏈路故障後,網路大約需要 50 秒才能收斂到一致狀態

  • 20 秒(最大年齡):最後收聽的配置 BPDU 過期並檢測到故障所需的時間;
  • 15 秒(轉發延遲):埠從監聽狀態切換到學習狀態所需的時間;
  • 15 秒(轉發延遲):埠從學習狀態切換到轉發狀態所需的時間。

此外,在網路中實現一致狀態並不一定意味著使用者所經歷的故障服務會結束:實際上,故障也可能反映在應用程式層,對超過一定閾值的連線丟失非常敏感。

  • 資料庫管理系統可能會啟動長時間的故障恢復過程;
  • 生成非彈性流量(如 VoIP 應用程式)的多媒體網路應用程式對延遲變化非常敏感。

可以嘗試自定義與計時引數相關的值,以提高收斂速度並擴充套件最大橋接直徑,但此操作不建議

  • 不加註意會導致網路對拓撲變化的反應能力降低,從而損害網路功能;
  • 乍一看,似乎只需要在根橋上進行操作,因為這些值都由根橋傳播到整個網路,但實際上,如果根橋發生變化,新的根橋必須通告相同的值 → 這些引數實際上必須更新所有橋接。

通常,STP 在邊緣埠(即直接連線到終端主機的埠)上被停用,以緩解使用者所經歷的故障服務

  • 由於埠轉換延遲,連線到網路的 PC 最初將被隔離,時間為兩個轉發延遲。
  • 連線 PC 代表拓撲更改 → 由拓撲更改通告觸發的舊條目清理將大大增加網路中泛洪傳送的幀數量。

但是,只有主機必須連線到邊緣埠,否則可能會在網路中建立迴圈 → 一些供應商不允許這樣做:例如,思科的專有機制 PortFast 在不停用邊緣埠上的 STP 的情況下實現了相同目標,能夠使它們立即切換到轉發狀態並檢測它們上可能的迴圈(即兩個邊緣埠透過直接電線相互連線)。

可擴充套件性

[編輯 | 編輯原始碼]

給定一個根橋,可以構建多個生成樹,將所有橋接彼此連線,但生成樹演算法選擇由最低成本邊組成的生成樹。這樣,路徑僅針對樹的根進行最佳化。

  • 停用的連結完全未使用,但仍然有人需要支付費用來保持它們作為容錯的輔助連結處於活動狀態;
  • 無法實現負載均衡以將流量分佈到多個並行連結 → 屬於所選生成樹的連結還必須承受流量的負載,如果不存在 STP,該流量將透過停用連結走更短的路徑。
STP 不適合在地理範圍內工作。

相反,IP 網路能夠更好地組織流量:生成樹在整個網路中並不唯一,但每個源都可以計算自己的樹並將流量傳送到最短路徑,從而確保更高的連結負載均衡。

虛擬區域網 (VLAN) 透過設定多個生成樹來解決此問題。

[編輯 | 編輯原始碼]

STP 假設每個連結都是雙向的:如果一個連結發生故障,幀將無法在兩個方向中的任何一個方向傳送。實際上,光纖電纜是單向的 → 要連線兩個節點,需要兩根光纖電纜,一根用於在一個方向上的通訊,另一根用於在相反方向上的通訊,其中一根電纜上的故障只會停止一個方向上的流量。

如果兩個單向連結中的一個發生故障,儘管存在 STP,但另一個連結上可能會出現迴圈:配置 BPDU 從根到葉節點單向傳播 → 如果直接傳播路徑斷開,另一個端點的橋接停止從該連結接收來自根橋接的配置 BPDU,然後將根埠移動到另一個連結,並假設該連結上沒有其他埠,則將埠設定為指定埠,從而建立一個迴圈。

單向連結檢測 (UDLD) 是思科的一種專有協議,能夠透過一種“ping”來檢測單向連結上是否存在故障,並停用埠(“錯誤停用”狀態),而不是將其選為指定埠。

放置根橋

[編輯 | 編輯原始碼]

根橋的位置對網路有很大影響

  • 從網路的一側到另一側的流量必須穿過根橋 → 效能,就埠的總吞吐量和頻寬而言,選定為根橋的橋接的效能應該足以承受大量流量;
  • 優先考慮 星型拓撲結構,其中根橋是星型中心 → 每個連結僅連線一個橋接到根橋。
    • 更均衡的連結 負載均衡:連結不應該承受來自其他橋接的流量;
    • 更高的 容錯性:連結的故障只會影響一個橋接的連線性;
  • 伺服器資料中心 應該放置在靠近根橋的地方,以減少資料通訊的延遲;

→ 必須將必須是根橋的橋接的優先順序自定義為非常低的值,以避免另一個橋接被選為根橋。

備份橋接 的位置,該橋接旨在在主連結或主根橋發生故障時發揮作用

  • 主連結故障:最佳配置是由輔助連結組成的冗餘星型拓撲,其中每個橋接都透過輔助連結連線到備份橋接;
  • 主根橋故障:備份根橋的優先順序也需要自定義為略高於主根橋的優先順序,以便在故障情況下強制該橋接被選為根橋。

STP 沒有針對外部攻擊的內建安全機制。

將使用者的橋接選為根橋

使用者可以將具有非常低優先順序的橋接連線到網路,強制其成為新的根橋並更改網路的生成樹。思科的專有功能 BPDU Guard 允許邊緣埠僅傳播來自網路內部的配置 BPDU,拒絕從外部接收的 BPDU(埠進入“錯誤停用”狀態)。

廣播風暴速率限制

幾乎所有專業橋接都具有一定的廣播風暴控制功能,能夠透過丟棄超出一定閾值的過量流量來限制埠上的廣播流量,但這些流量計無法區分廣播風暴中的幀和站點發送的廣播幀 → 它們可能會過濾掉合法的廣播流量,並且廣播風暴更難檢測。

連線沒有 STP 的橋接

一個沒有 STP 或 STP 被停用的單一橋接可以開始將廣播流量注入網路,從而建立 STP 控制範圍之外的迴圈:將橋接埠直接連線到同一橋接的另一個埠,或透過兩個冗餘連結將使用者的橋接連線到網路的兩個內部橋接,都是例子。

多個 STP 域

有時,兩個不同的 STP 域(每個域都有自己的生成樹)應該連線到同一個共享通道(例如,同一個資料中心中兩個具有不同 STP 域的提供商)。思科的專有功能 BPDU Filter 在域外圍埠上停用傳送和接收配置 BPDU,以保持生成樹分離。

參考文獻

[編輯 | 編輯原始碼]
  1. 實際上,生成樹演算法阻止的是埠,而不是連結:{{subst:vedi|#Port states}}
  2. 請注意,在同一子樹內移動的流量不會穿過根橋。
  3. a b c d 時間欄位以 256 分之一秒(約 4 毫秒)為單位表示。
  4. 橋接繼續每 Hello Time 生成一次拓撲更改通知 BPDU,直到它收到確認。
  5. 根橋接繼續為 Max Age + Forward Delay 生成確認配置 BPDU。
  6. 當建立此約束時,學習狀態尚未引入,並且埠直接從監聽狀態切換到轉發狀態。
  7. 轉發延遲的最小值正好等於 14 秒,但考慮到 1 秒的容差。
Previous page
乙太網網路的先進功能
區域網設計 Next page
快速生成樹協議
生成樹協議
華夏公益教科書