交換機、路由器、網橋和區域網/路由器/BGP
外部閘道器協議是用於在兩個自治系統 (AS) 之間傳遞路由資訊的任何協議,即在不受單個公共管理員控制的網路之間傳遞路由資訊。BGP 目前是網際網路上外部路由的事實標準。BGP 的當前版本是 v4,自 1994 年開始使用,所有早期版本現已過時。
當兩個自治系統同意交換路由資訊時,用於使用 BGP 交換資訊的兩個路由器被稱為 BGP 對等體。當一個使用 BGP 的路由器與另一個位於 AS 邊緣附近的 AS 中的對等體進行通訊時,這被稱為邊界閘道器或邊界路由器。
BGP 是一種路徑向量協議。與距離向量協議(與 OSPF 等鏈路狀態網路不同)不同,它不嘗試對映整個網路。相反,它維護一個數據庫,其中包含訪問其所知每個子網的成本,並選擇成本最低的路由。但是,它不會儲存單個成本,而是會儲存訪問每個網路所使用的整個路徑(不是路徑上的每個跳,而是路徑經過的 AS 列表)。這意味著可以消除路由迴圈,這在像 RIP 這樣的更簡單的距離向量協議中可能很難確保,同時仍然允許協議擴充套件到整個網際網路的級別。
參與路由公告的活動型別如下
- 它接收並過濾來自直接相連鄰居的路由公告。拒絕包含路由器自身 AS 號的路徑的接收路由,以避免建立路由迴圈。
- 它選擇路由。BGP 路由器可能會收到幾個到相同目的地的路由公告,並且預設情況下會從它們中選擇一條作為首選路由(ECMP 將其擴充套件到允許流量在具有相等成本的多個路徑之間進行負載均衡)。
- 它還會向其鄰居傳送路由公告。
BGP 最初被指定為僅通告 IPv4 路由,但 BGP 協議版本 4 中的多協議擴充套件允許透過 BGP 共享其他地址族中的路由。特別是,BGP 可用於共享 IPv6 路由。BGP 對等體用來通訊的傳輸協議通常是 IPv4,但可以是 IPv6,或者實際上是任何其他協議。為了保持分層網路模型,BGP 指定了要交換的資料包,但不依賴於資料包傳輸方式的任何細節。
BGP 是事實上的外部閘道器協議,因此將網路連線到網際網路的路由器必須使用它。但這並不是故事的結尾。在最簡單的情況下,每個 AS 都會有一個邊界路由器,它與外部世界共享路由,並且 AS 內部的所有路由都將透過內部協議(OSPF、RIP 等)完成。但是,較大的網路很少會為整個 AS 擁有單個邊界路由器。因此,一個邊界路由器接收到的路由需要傳播到另一個邊界路由器,以便與該路由器的對等體共享。
一種方法是將接收到的路由插入現有的內部協議(例如 OSPF),並使用內部協議將它們傳播到另一個邊界路由器。然後,第二個邊界路由器可以將它們重新分發到 BGP 並傳播到開放的網際網路。但是,這有一些缺點。最嚴重的是,路由的 AS_PATH 資訊會丟失(因為 OSPF 和其他協議不知道如何共享 AS_PATH),因此消除路由迴圈的主要方法無法執行。此外,內部協議並非旨在處理網際網路上的大量路由。
更可擴充套件的替代方案是在 AS 中的路由器之間使用 _內部 BGP_。這以類似於外部 BGP 的方式在路由器之間傳播路由,只是 AS_PATH 沒有被附加。
在 AS 中使用 iBGP 的一個問題是,BGP 路由器必須連線到一個完整的網狀結構中。也就是說,每個路由器必須連線到 AS 內部的每個其他路由器。原因是,雖然使用 iBGP 的路由器會將其透過 eBGP 學到的路由傳遞給其對等體,但這些路由只在 AS 內傳播一個跳。透過 iBGP 接收到的路由不會透過 iBGP 傳遞給另一個對等體。這是因為 AS_PATH 資訊不能用來消除路由迴圈。
必須將所有路由器連線到完整的網狀結構的原因是不希望這樣做,因為當大量路由器執行時,對等體數量會變得非常大: 連線是構建由 個路由器組成的網狀結構所需的。每個連線都會佔用 CPU、記憶體和網路頻寬資源。
一種替代方法是使用路由反射。這允許 AS 中的一個或多個路由器重新通告 iBGP 路由,並透過對可以重新通告哪些路由施加約束來避免路由迴圈的可能性。
要使用路由反射,需要指定一個或多個路由器作為路由反射器。每個路由反射器將其對等體劃分為客戶端對等體和非客戶端對等體。路由反射器將在一個組和另一個組之間以及客戶端對等體之間反射路由。非客戶端對等體必須完全網狀連線。
BGP 對等體執行以下三個基本功能
- 初始對等體獲取和身份驗證:兩個對等體建立 TCP 連線並執行訊息交換,以保證雙方都同意通訊。
- 雙方傳送正向或負向可達性資訊:如果一個或多個鄰居不再可達,並且沒有可用的備份路由,它將通告網路不可達,並將通告相關路由。
- 持續驗證:它提供持續驗證,以確保對等體及其之間的網路連線正常執行。
BGP 訊息型別有以下幾種
| OPEN | 一旦兩個 BGP 對等體建立 TCP 連線,它們就會各自發送一個 OPEN 訊息來宣告其自治系統編號並建立其他操作引數。OPEN 訊息包含建議的保持計時器長度,它是兩次連續訊息之間可能經過的最大秒數。在接收到 OPEN 訊息後,接收方會用 KEEPALIVE 進行回覆。 |
|---|---|
| UPDATE | 在 TCP 連線和傳送和接收 OPEN 及確認後,對等體使用 UPDATE 來通告新可達的目標或撤回先前的通告。 |
| NOTIFICATION | 此 BGP 訊息用於通知對等體已檢測到錯誤或傳送方即將關閉 BGP 會話。 |
| KEEPALIVE | 這用於測試網路連線並驗證兩個對等體是否繼續正常執行。BGP 使用 TCP 進行傳輸,而 TCP 不包含用於持續測試連線端點是否可達的機制。雙方都會發送 KEEPALIVE,以便知道 TCP 連線是否失敗。KEEPALIVE 訊息儘可能短,以避免浪費頻寬。 |
每個 BGP 資料包都以一個固定大小的訊息頭開始。
- 標記
- 此欄位用於向後相容。它包含 16 個全為 1 的位元組。
- 長度
- 這是一個 2 位元組無符號整數,指定資料包的長度。
- 型別
- 這是一個位元組,指定訊息的型別:OPEN、UPDATE、NOTIFICATION 或 KEEPALIVE。
OPEN 訊息是每個路由器在新建的連線對等體上傳送給對方的第一個訊息。成功的 OPEN 訊息會透過傳送一個 KEEPALIVE 訊息來確認。
BGP 識別符號包含在 OPEN 訊息中。這是一個 4 位元組的數字,必須在網路上唯一標識路由器。它必須是路由器上某個介面的 IPv4 地址。理論上,如果路由器只用於 IPv6,則可能沒有 IPv4 地址,但在實踐中,這種情況很少見,而且無關緊要,因為可以使用任何唯一的 4 位元組值。
OPEN 訊息可以包含可選引數。如果它包含任何引數,則可選引數長度欄位將被設定為非零值,以指示長度。引數欄位中的每個引數都編碼為三個值:引數型別(1 位元組)、引數長度(1 位元組)和用於引數的可變長度(最多 255 位元組)欄位。
UPDATE 訊息從一個對等體傳送到另一個對等體,以傳遞有關網路的新資訊:新可用路由和不再可用的路由。
由於 BGP 不依賴於用於在對等體之間傳遞資料包的傳輸協議的任何細節,因此它不能利用 TCP 來檢測對等體何時變得不可用。因此,協議要求對等體之間定期傳送保持活動資料包。每次收到資料包時,保持活動計時器都會重置,如果計時器超時,則連線將關閉。UPDATE 和 NOTIFICATION 資料包也會重置計時器,但是如果未傳送其他資料包,則對等體必須傳送 KEEPALIVE 資料包。保持活動資料包通常在保持活動時間的三分之一處傳送,以在不淹沒網路和確保單個丟棄的資料包不會導致連線斷開之間取得平衡。
BGP 被設計為可擴充套件的,因此基本協議允許將可擴充套件的屬性列表附加到路由。BGP 不要求每個 BGP 路由器都理解使用的每個屬性,但屬性被分為四類,說明它們應該如何處理。
- 眾所周知的強制屬性
- 每個 BGP 路由器都應該在接收到這些屬性時識別和處理它們,並將其通告給鄰居。
- 眾所周知的可選擇屬性
- 這些屬性不需要通告,但任何 BGP 路由器都應該識別它們。
- 可選可傳遞屬性
- 如果 BGP 路由器不知道如何處理此屬性,它將被傳遞給其 BGP 鄰居。
- 可選不可傳遞屬性
- 如果 BGP 路由器不知道如何處理此屬性,它將被忽略。
當前支援的屬性包括
- ORIGIN
- 路由是否源於 IGP、EGP 或其他地方。
- AS_PATH
- 路由經過的 AS 列表,以到達當前路由器。除其他事項外,這使 BGP 路由器能夠拒絕包含其自身 AS 的 AS_PATH 的路由,否則會導致路由迴圈。
- NEXT_HOP
- 應作為此路由的下一跳使用的路由器的 IP 地址。
- MULTI_EXIT_DISC
- 一個可選屬性,如果存在,可以被路由器用來在通往同一 AS 的多個不同入口點之間進行選擇。
- LOCAL_PREF
- 此屬性僅包含在同一 AS 內的對等體之間的內部通訊中。它使 BGP 路由器能夠透過使用具有更高 LOCAL_PREF 值的路由來在通往同一子網的外部路由之間進行選擇。
- ATOMIC_AGGREGATE
- 當 BGP 路由器將多個路由聚合到一個路由中,並因此省略了 AS_PATH 中的一些 AS 時,使用此屬性。
- AGGREGATOR
- BGP 路由器可以新增到路由中的一個可選屬性,其中路由器執行了路由聚合。該屬性指定執行聚合的路由器的 AS 號和 IP 地址。
- COMMUNITY
- 社群值用於指定可以應用於多個路由的公共屬性。一些社群值是標準化的,但其他社群編號可以由任何可以就標準含義達成一致的 BGP AS 組分配。
- ORIGINATOR_ID
- 在使用路由反射的 AS 內,起源 ID 用於防止路由迴圈。起源 ID 是一個 32 位值,它要麼是將路由注入 BGP 的路由器(作為手動配置的 BGP 字首,或透過從其他協議重新分發),要麼是透過 eBGP 接收路由的邊界路由器。
- CLUSTER_LIST
- 與起源 ID 一樣,它用於在使用路由反射時防止迴圈。它記錄路由經過的叢集列表,就像 AS_PATH 記錄路由經過的 AS 列表一樣。