6 分鐘看完 BGP 協議。

程式設計師cxuan發表於2022-07-04

上一篇文章見 萬字長文爆肝路由協議!

上面我們聊 RIP 、OSPF 協議都是基於 AS 即自治系統內的協議,可以把它們認為是域內路由協議;而下面我們要聊的就是 AS 之間的協議了,這也叫做域間路由協議,或者叫做外部閘道器協議,其最著名的一個協議就是 BGP協議,目前使用最多的協議版本就是 BGP 的第四個版本 BGP - 4,簡稱為 BGP ( Border Gateway Protocol )。

在 RIP 和 OSPF 這些協議中,是由 IP 的網路地址進行路由控制,而 BGP 協議則需要通過整個網際網路進行路由控制,範圍要大很多。

BGP 的環境與 RIP、OSPF 的環境不一樣,主要在於網際網路的規模過於龐大, 使得自治系統之間的路由選擇比較困難。網際網路上的路由器對任何 IP 地址都能通過路由表找到它的目的網路。這是一個非常龐大的集合,如果使用鏈路狀態協議 RIP 和 OSPF 的話,必須要維護一個非常大的了路由集合,一方面路由表檢索起來效率很低,而且如此龐大的資料項也不方便維護。還有一點是每個路由器的 metric 不一樣,有可能這個 metric 是經過了 100 個路由,而那個鏈路到達 100 個路由可能就直接報錯了。

而且自治系統間的路由選擇必須考慮策略問題,這些策略需要把政治、地緣、安全或者經濟方面考慮在內。

由於上面這些特殊情況的存在,BGP 協議只是滿足選擇一條到達目的網路比較好的路由,而非選擇一條最佳路由,BGP 採用了路徑向量路由選擇協議,它與 RIP 和 OSPF 有很大的差別。

在 BGP 協議中,每個 AS 自治系統內部都有許多 BGP 邊界路由器,這個 BGP 邊界路由器就相當是自治系統內部的發言人。不同 AS 之間的 BGP 邊界路由器如果要交換路由資訊的話,就需要先建立 TCP 連線,然後在此連線上交換 BGP 報文以建立 BGP 會話,通過 TCP 能夠提供可靠的服務。兩個交換報文的 BGP 邊界路由器都被稱為彼此的臨站(天使)或者對等站。

下圖是一個使用了 BGP 邊界路由器和 AS 的關係示意圖:

image-20220607204710359

圖 14-18

BGP 所交換的網路可達性資訊就是要到達某個網路所要經過的一系列的路由。當各個 BGP 邊界路由器一旦交換了可達性資訊之後,就會選擇出來一條到達各個 AS 比較好的路由路徑。

BGP 支援無分類域間路由選擇 CIDR,因此 BGP 的路由表也就應當包括當前目的網路字首、下一跳路由器,以及到達目的網路所經過的 AS 。

在 BGP 剛剛執行時,BGP 的臨站是交換整個 BGP 路由表,以後只要在發生變化時更新有新變化的部分即可。這樣對節省網路頻寬和減少路由器開銷有很大好處,這個特性和 OSPF 非常相似。

BGP - 4 主要有下面幾類報文型別:

  • OPEN ( 開啟 )報文,用來和相鄰的 BGP 區域邊界路由器建立關係,進行通訊初始化。
  • UPDATE ( 更新 ) 報文,用來通告路由資訊,以及列出需要更新的多條路由。
  • KEEPALIVE ( 保活 ) 報文,用來週期性的證實臨站的連通性。
  • NOTIFICATION ( 通知 ) 報文,用來傳送檢測到的差錯。

如果兩個臨站屬於兩個不同的自治系統,而且其中一個臨站打算和其他臨站進行路由交換的時候,這時候應當有一個路由商量的過程。商量的過程包括臨站路由器是否還能夠接受額外的路由資訊。因此一開始進行商談的時候應該要先傳送 OPEN 報文,如果臨站可以接受這種關係,就用 KEEPALIVE 報文響應。響應完成後,兩個臨站就算是建立關係了。

關係建立之後,是需要相互維持的,這就和情侶之間確定關係之後,你作為老爺們總不能三天兩頭不搭理人家吧?俗話說的好,感情是需要維持的,那麼這個路由關係也是需要維持的。通訊雙方中的每一方都需要確信對方是否已經存在,因此兩個 BGP 邊界路由器需要定期交換 KEEPALIVE 報文,一般這個定期的時間就是 30 s。

BGP 邊界路由器可以使用 UPDATE 報文來更新路由:包括撤掉以前通知過的路由和增加新的路由。撤銷路由時一次可以撤銷多條,但是新增路由一個 UPDATE 報文只能增加一條。

當然在 BGP 中不存在 "好訊息傳播的快壞訊息傳播慢" 的問題( 感覺 RIP 的這個問題被玩出梗了 )。因為 BGP 邊界路由器不只有一個,而且當某個路由器或者鏈路出現故障時,由於 BGP 邊界路由器可以不止從一個臨站獲得路由資訊,因此很容易選出新的路由。

下面是 BGP 的報文格式:

image-20220607204724906

圖 14-19

上面介紹的四種報文型別它們具有通用的報文首部,首部為 19 位元組,通用首部主要分為三個欄位。

  • 標記 marker 欄位為 16 位元組長,用來鑑別收到的 BGP 報文,如果不使用鑑別,標記欄位要置為全 1。
  • 長度欄位指出包括通用首部在內的整個 BGP 報文的長度,以位元組為單位,最小值是 19,最大值是 4096.
  • 型別欄位的值為 1 到 4,分別對應上面報文的介紹順序。

OPEN報文共有 6 個欄位,如下圖抓包所示

image-20220605080629139

圖 14-20

前三個欄位是 BGP 通用報文首部,下面的幾個欄位依次是 Version 版本 ( 1 位元組,值為 4 ), My AS 本自治系統號( 2 位元組,使用的是全球唯一的 16 位系統號 ) , Hold Time 保持時間 ( 2 位元組,以秒計算的保持為臨站關係的時間 ),BGP Identifier BGP 識別符號 ( 4 位元組,路由器的 IP 地址 ),下面是可選長度和可選引數。

KEEPALIVE 報文只有 BGP 19 位元組的通用首部。

image-20220605080701943

圖 14-21

UPDATE 報文有五個欄位,如下圖所示

image-20220605080906081

圖 14-22

報文中的 Unfeasible routes length 表示不可行路由長度,後面有個欄位報文沒有列出來,就是 Withdrawn Routes ,要撤銷的路由列表,後面的 Total Path Attribute Length 表示路徑屬性總長度,後面的 Path attributes 就表示路徑屬性,最後的 NLRI 標識發出這個報文的網路。

NOTIFICATION 報文有三個欄位,如下圖所示

image-20220605080711723

圖 14-23

主要包括差錯程式碼 ( 1 位元組 ),差錯子程式碼 ( 1 位元組 ) ,後面還有差錯資料。

原文連結:6 分鐘看完 BGP 協議。

相關文章