網際網路邊界閘道協定(BGP)


本文章探討網際網路邊界閘道協定(BGP),這是一種標準化的外部閘道協定,設計用於在互聯網上的不同自治系統(ASes)或網際網路服務提供商(ISP)之間交換路由和可達性資訊。以下,我們詳細介紹了與此協定相關的重要性、能力、挑戰和解決方案。

1. 邊界閘道協定及其功能

1989年1月,在第12次網際網路工程任務組(IETF)會議上,Len Bosack、Kirk Lougheed和Yakov Rekhter創造了BGP,其設計目標是開發一種能夠提供政策控制、迴路檢測以及通過地址聚合技術支持數十萬個網路的協定。

BGP作為一種自治系統間的路由協定,便利了ISPs之間的連接。例如,和記黃埔和中國移動交換網路層可達性資訊(NLRI)。在互聯網缺乏集中控制的環境中,這些實體必須交換NLRI以整合他們的自治網路。每一個都控制自己的設備並使用不同的自治系統內部路由協定;他們需要合作來交換與他們的客戶相關的IP地址資訊。

一個使用 BGP 的系統的主要功能已演變為解決這個工程和研究問題:使自治網路之間能交換資訊,而無需集中式控制。發送到服務提供商的數據包需要進行查找才能決定下一個目的地,可能是中國另一邊的完全不同的網絡。BGP是全球 TCP/IP 網路的基本架構。

BGP的另一個重要角色是管理商業問題。例如,中國移動可能不希望和記黃埔發送過量的流量,因為這將增加額外的成本。這些自治網絡內部運行著不同的協定,「最佳路徑」可能會根據合同和政策而有所不同。BGP提供了靈活性,可以定義對不同方來說什麼是最佳路徑。

2. BGP的運作

BGP的當前版本是版本4,於2006年以RFC 4271的形式出版。BGP使用一種路徑向量算法,而不是純粹的距向量或連接狀態算法。它使用存儲在AS_PATH屬性中的路徑資訊來避免傳統路由問題。路由表被遍歷以到達目標網絡,從而提供迴路避免。BGP還支持地址聚合,從而大大減少了核心互聯網路由表的大小。

當一條互聯網路徑失效時,BGP提供了網路穩定性,使路由器能夠快速適應和重新路由數據包。每個BGP路由器都維護一個標準路由表,該表與路由資訊庫(RIB)一起使用,並在變化發生時不斷更新。

BGP只在變化發生時更新路由表資訊。它缺少自動發現機制,這意味著必須手動建立對等連接。該協定使用一種增量更新策略,以節省帶寬和處理能力,依賴TCP來提供可靠的傳輸。

3. 舉例說明ASes如何了解網際網路的可達性

可以假設我們有五個由唯一的32位自治系統號(ASN)標識的ASes,如下所示:

BGP允許這些ASes內的路由器通過內部和外部的BGP說明者來學習多條路徑。它選擇最佳路徑並將其安裝在RIB中。當AS104網絡中的一個客戶希望將數據發送到AS100網絡時,BGP幫助AS104內的路由器決定哪條路徑走,並相應地更新可達性資訊。

BGP還提供了對不同服務提供商之間的信任和不信任的管理,並且在RFC 4271中進行了描述。它允許具有共同路由政策的網絡能夠被唯一的標識,並且被廣泛地用在互聯網的骨幹網絡上。

BGP確定最佳路徑的決策依賴於當前的可達性、跳數和其他路徑屬性。它可以被配置為告知一個組織的路由偏好,並且有一個定義任意標簽(即社區)的機制,以控制經過對等體之間的共同協議的路由廣告行為。

4. BGP包格式和欄位函數

BGP消息通過TCP連接進行傳輸。只有在消息完全接收後才進行處理。消息的最大尺寸為4096字節,而最小允許的消息由一個19字節的頭部組成,而沒有任何數據。以下我們突出了一些欄位的功能:

4.1 消息頭部格式

標記:這是一個16字節的欄位,用於相容性,必須設置為全1。

長度:這是一個2字節的無符號整數,表示消息中包括頭部在內的總長度,以字節為單位。它有助於在TCP流中找到下一條消息的標記欄位。欄位值必須始終大於19並小於4096。消息後面不能填充額外的數據,因此該欄位必須包含最小的必需值。

類型:這是一個1字節的無符號整數,指定消息的類型代碼。類型代碼有:1-Open、2-Update、3-Notification、4-Keepalive。

4.2 Open消息格式

建立TCP連接後,雙方首先發送的消息是Open消息。如果Open消息是可以接受的,則回發送一個確認Open的Keepalive消息。

版本:這是一個1字節的無符號整數,表示消息的協定版本號。

我的自治系統:這是一個2字節的無符號整數,指定發件者的AS號碼。

保持時間:這是一個2字節的無符號整數,表明在秒中的保持計時器的值。在收到一條Open消息後,BGP講話者透過取其配置的保持時間和收到的保持時間中的較小者來計算保持計時器。此時間必須為0 或 至少為3秒。可能會根據此時間值拒絕連接。

BGP標識符:這是一個4字節的無符號整數,標識發件人的BGP標識符。該值在啟動時確定,並在所有本地接口與BGP對等方保持一致。

Opt Param Len:這是一個1字節的無符號整數,顯示可選引數欄位的總長度,以字節為單位。零值表示沒有提供可選引數。

可選參數(變量):此欄位包含一個參數列表,每個參數分別編碼如下:

  • 參數類型:1字節欄位用於識別個別參數。
  • 參數長度:1字節欄位指定參數值欄位的長度,以字節為單位。
  • 參數值(變量):根據參數類型欄位的值來詮釋。

Open消息的最小長度(包括頭部)為29個字節。

4.3 Update消息格式

此格式用於在BGP對等體之間交換路由資訊,有助於構建表示各種自治系統(AS)之間關係的圖。它通過識別並消除路由迴路和其他的自治系統間路由異常。

Update消息可以用來廣告具有共同路徑屬性的可行路徑,或撤銷多條不可行的路徑。它可以在同時廣告一條可行路徑和撤銷多條不可行路徑。

撤銷的路徑長度(2個字節):指示撤銷路徑欄位的總長度;值為0表示沒有路徑被撤銷。

撤銷的路徑(變量):包含被撤銷路徑的IP地址前綴的列表。

長度(1個字節):以位為單位指定IP地址前綴的長度;值為0與所有IP地址的匹配。

前綴(變量):包含一個IP地址前綴,以及為在字節邊界上對齊欄位結尾需要的最少尾隨位數。

總路徑屬性長度(2個字節):指示以字節為單位的路徑屬性欄位的總長度。值為0表示沒有 NLRI 或 path 屬性欄位存在。

路經屬性(可變):由<屬性類型,屬性長度,屬性值>組成的 3 元組。 屬性類型是一個 2 字節的欄位,其中包括:

  • 屬性標誌:各種位用於不同的目的,如選擇位、轉移位、部分位和擴展長度位。
  • 屬性類型代碼:如原始碼、AS_PATH、NEXT_HOP、MULTI_EXIT_DISC、LOCAL_PREF、原子聚合和聚合器指定了不同類型的路徑屬性。

網路層可達性資訊(變量):包含一個 IP 地址前綴的列表。其長度並不直接編碼,但可以使用以下式子計算:

( \text{更新消息長度} - 23 - \text{路徑屬性長度總計} - \text{撤銷路徑長度} )

  • 「更新消息長度」是固定大小的BGP首部中編碼的值。
  • 「路徑屬性長度總計」和「撤銷路徑長度」是更新消息的變動部分。
  • 23是固定大小的BGP頭部、路徑屬性長度和撤銷路徑長度的總和。

達性資訊是以一個或多個2元組編碼,每個都有:

長度(1個字節):以位為單位指出 IP 地址前綴的長度。值為0與所有 IP 地址的匹配,自身前綴包含零個字節。

4. 在BGP中的包格式及突出一些欄位的功能

BGP消息通過TCP連線發送。僅在接收到整個消息後才進行處理。消息的最大尺寸為4096個八位組,而最小合理的消息由19個八位組的標頭組成,不含任何數據。以下,我們突出了某些欄位的功能:

4.1 消息標頭格式

  • 標記:這是一個16個八位組的欄位,為了與過去的協議版本相容,必須設定為全為一。

  • 長度:這是一個2個八位組的無號整數,表示包含標頭在內的消息的總長度,單位為八位組。須以此欄位的值間接找出TCP資料流中下一個消息的標記欄位。欄位值必須永遠大於19且小於4096。禁止在消息後面填充額外的數據,因此這個欄位的值必須只含最小所需的值。

  • 類型:這是一個單個八位組無號整數,指定了消息的類型碼。類型碼為:1-Open、2-Update、3-Notification、4-Keepalive。

4.2 Open消息格式

在建立TCP連線後,每一方首先發送的消息是一條open消息。如果收到的open消息可以被接受,就會回應一條確認接收open消息的keepalive消息。

  • 版本:這是一個單個八位組無號整數,顯示了消息的協議版本號。

  • 我的自治系統:這是一個2個八位組無號整數,表明了發送者的AS編號。

  • 保持時間:這是一個2個八位組無號整數,表示了保持計時器的值建議,單位為秒。在收到open消息時,一個BGP有聲人應當通過取配置的保持時間和已接收到的保持時間中的最小值來計算保持計時器。此時間必