BGP漫談

什麼是BGP

BGP全稱是Border Gateway Protocol, 對應中文是邊界網關協議。這個名字比較抽象,而維基中文的解釋我覺得比較好(維基英文甚至都沒有類似的解釋)。BGP是互聯網上一個核心的去中心化自治路由協議。從這個解釋來看,首先這是一個用於互聯網(Internet)上的路由協議。它的地位是核心的(目前是最重要的,互聯網上唯一使用的路由協議),它的目的是去中心化,以達到各個網路自治。不過還是有點抽象?

先看看幾個相關的概念:

  • AS(Autonomous system):自治系統,指在一個(有時是多個)組織管轄下的所有IP網路和路由器的全體,它們對互聯網執行共同的路由策略。也就是說,對於互聯網來說,一個AS是一個獨立的整體網路。而BGP實現的網路自治也是指各個AS自治。每個AS有自己唯一的編號。

  • IGP(Interior Gateway Protocol):內部網關協議,在一個AS內部所使用的一種路由協議。一個AS內部也可以有多個路由器管理多個網路。各個路由器之間需要路由信息以知道子網路的可達信息。IGP就是用來管理這些路由。代表的實現有RIP和OSPF。

  • EGP(Exterior Gateway Protocol):外部網關協議,在多個AS之間使用的一種路由協議,現在已經淘汰,被BGP取而代之。

由於BGP就是為了替換EGP而創建,它的地位與EGP相似。但是BGP也可以應用在一個AS內部。因此BGP又可以分為IBGP(Interior BGP :同一個AS之間的連接)和EBGP(Exterior BGP:不同AS之間的BGP連接)。既然EGP已經被替代了,那EBGP的存在比較好理解,但是IGP協議都還活得好好的(這裡指的是OSPF),那IBGP的意義何在?IGP的協議是針對同一個AS網路來設計的,一個自治網路的規模一般都不大,所以設計的時候就沒有考慮大規模網路的情況。而當一個自治網路足夠大時,OSPF存在性能瓶頸(後面會說明)。BGP本身就是為了在Internet工作,其設計就是為了滿足大型網路的要求,所以大型私有IP網路內部可以使用IBGP。總的來說,這幾類路由協議,小規模私有網路IGP,大規模私有網路IBGP,互聯網EBGP。

為什麼需要BGP

BGP號稱是使互聯網工作的協議,看起來似乎很重要,為什麼平常的生活中很少接觸呢?似乎雲裡面也不怎麼提BGP,我們來看看原因吧。

假設小明正在搭建一個雲環境,提供虛擬機服務。

雲里的虛機需要有互聯網訪問能力,於是小明向ISP(Internet service provider)申請了一個公網IP,這裡的ISP可以是聯通,移動,電信等等。虛機們可以通過路由器的NAT/PAT(Network / Port address translation)將自己的私網IP轉換成這個公網IP,然後小明在雲中路由器上將ISP router的地址設為默認路由。這樣地址轉換之後的IP包都發送到了ISP,進而發送到了互聯網(這也是我們家用路由器能讓家裡的設備上網的原理)。這樣小明的1.0版本雲簡單上線。這裡小明不需要BGP。

版本上線之後怎麼辦?當然是開發下一版本!下一版本的需求是可以通過互聯網訪問虛機(也就是從互聯網訪問我們家裡的電腦)。這個也不難,可以通過埠轉發(Port Forward),將虛機的一個埠與公網IP的埠進行映射。例如將虛機的22埠映射到公網IP的1122埠,那麼可以通過互聯網ssh到公網IP:1122,登陸虛機。這部分工作仍然是在小明的雲中路由器完成。這樣,小明的2.0版本雲上線了,這裡小明還是不需要BGP。

2.0版本雖然支持了從互聯網訪問虛機,但是還有問題:

  1. 每個虛機每開放一個埠都需要映射一次

  2. 公網IP的埠是有限的

為了解決這些問題,小明向聯通申請了一些公網IP地址,對於需要從外網訪問的虛機,直接給它們分配公網IP。這樣小明的3.0版本雲上線了,這裡小明還是不需要BGP。因為:

  1. 聯通是小明雲唯一連接的ISP,小明只能通過聯通訪問互聯網,所以小明的雲中路由器的默認路由只能設置成ISP 路由器的地址。
  2. 小明雲裡面的公網IP都是聯通分配的,聯通當然知道該從哪個IP地址作為下一跳去訪問那些IP地址。

聯通的IP畢竟是有限的,而且聯通還老是斷線。這都發布3個版本了,小明決定干一票大的。

首先,小明向IANA(Internet Assigned Numbers Authority)申請了自己的公網IP池。因為有了自己的公網IP,也必須要考慮申請AS號。AS號是一個16bit的數字,全球共用這60000多個編號。1 – 64511 是全球唯一的,而 64512 – 65535 是可以自用的,類似於私網網段。每個自治網路都需要申請自己的AS編號,聯通的AS號是9800。

然後,小明分別向聯通和電信買了線路,這樣就算聯通斷線還能用電信。

那現在問題來了:

  1. 聯通或者電信怎麼知道小明申請的公網IP是什麼。換言之,我現在撥號撥進了聯通寬頻,我怎麼才能訪問到小明雲的公網IP?
  2. 小明的雲中路由器的默認路由該設置到聯通的ISP路由器,還是電信的?

終於,在小明的4.0版本雲上,小明需要用BGP了。通過BGP,小明可以將自己雲中的路由信息發送到聯通,電信,這樣ISP就知道了改如何訪問小明的公網虛擬機,也就是說我們普通的使用者通過ISP,能訪問到小明的網路。另一方面,通過在雲中運行BGP服務,小明可以管理雲中路由器的默認路由。

總的來說,要是你之前沒有聽過或者用過BGP,只能說你的網路還沒有到那個規模 :)

BGP協議

BGP可以說是最複雜的路由協議。它是應用層協議,其傳輸層使用TCP,默認埠號是179。因為是應用層協議,可以認為它的連接是可靠的,並且不用考慮底層的工作,例如fragment,確認,重傳等等。BGP是唯一使用TCP作為傳輸層的路由協議,其他的路由協議可能都還到不了傳輸層。

TCP連接的窗口是65K位元組,也就是說TCP連接允許在沒有確認包的情況下,連續發送65K的數據。而其他的路由協議,例如EIGRP和OSPF的窗口只有一個數據包,也就是說前一個數據包收到確認包之後,才會發送下一個數據包。當網路規模巨大時,需要傳輸的數據也相應變大,這樣效率是非常低的。這也是它們不適合大規模網路的原因。而正是由於TCP可以可靠的傳輸大量數據,且互聯網的路由信息是巨大的,TCP被選為BGP的傳輸層協議,並且BGP適合大規模網路環境。

和大部分協議一樣,BGP的數據由header和data組成。Header有19個位元組,所有的BGP數據的Header格式是一樣的。

Marker有16個位元組長,存儲著同步信息和加密信息。Length2個位元組,包含header在內的長度。Type1個位元組,表示當前BGP數據的類型,具體有4類:

  • Open(code 1):TCP連接建立之後,BGP發送的第一個包。收到Open之後,BGP peer會發送一個Keepalive消息以確認Open。其他所有的消息都只會在Open消息確認之後,並且BGP連接已經建立之後發送。

  • Update(code 2):BGP連接後的首次Update會交換整個BGP route table,之後的Update只會發送變化了的路由信息。所以說BGP是動態的傳輸路由消息的變化。

  • Notification(code 3):出錯時發送的消息,這個消息一旦發送,BGP連接將會中斷。

  • Keepalive(code 4):沒有data,只有header。用來保持BGP連接,通常是1/3的BGP session hold time。默認是60秒,如果hold time是0,不會發送Keepalive。

每一種BGP數據的data都不相同,這些都由網路設備商實現了,簡單看一下Open和Update的data吧。

BGP Open 數據,由於是發送的第一個包,因此就是一些配置信息。例如自身的AS號,BGP連接的超時時間(hold time),BGP id。

BGP Update 數據,主要就是交換Network Layer Reachability Information (NLRI)。一個Update數據包裡面只會有一條path的路由信息,因此只有一組path attribute,但是路由可以有多條。具體的說,一個BGP router可能連接了多個BGP peer router,那麼它在發送BGP Update數據時,一次只會發送一個它的BGP peer router的信息。

BGP如何工作

BGP是一種路徑矢量協議(Path vector protocol)的實現。因此,它的工作原理也是基於路徑矢量。首先說明一下,下面說的BGP route指的是BGP自己維護的路由信息,區分於設備的主路由表,也就是我們平常看見的那個路由表。BGP route是BGP協議傳輸的數據,並存儲在BGP router的資料庫中。並非所有的BGP route都會寫到主路由表。每條BGP route都包含了目的網路,下一跳和完整的路徑信息。路徑信息是由AS號組成,當BGP router收到了一條 路由信息,如果裡面的路徑包含了自己的AS號,那它就能判定這是一條自己曾經發出的路由信息,收到的這條路由信息會被丟棄。

這裡把每個BGP服務的實體叫做BGP router,而與BGP router連接的對端叫BGP peer。每個BGP router在收到了peer傳來的路由信息,會存儲在自己的資料庫,前面說過,路由信息包含很多其他的信息,BGP router會根據自己本地的policy結合路由信息中的內容判斷,如果路由信息符合本地policy,BGP router會修改自己的主路由表。本地的policy可以有很多,舉個例子,如果BGP router收到兩條路由信息,目的網路一樣,但是路徑不一樣,一個是AS1->AS3->AS5,另一個是AS1->AS2,如果沒有其他的特殊policy,BGP router會選用AS1->AS2這條路由信息。policy還有很多其他的,可以實現複雜的控制。

除了修改主路由表,BGP router還會修改這條路由信息,將自己的AS號加在BGP數據中,將下一跳改為自己,並且將自己加在路徑信息里。在這之後,這條消息會繼續向別的BGP peer發送。而其他的BGP peer就知道了,可以通過指定下一跳到當前BGP router,來達到目的網路地址。

所以說,BGP更像是一個可達協議,可達信息傳來傳去,本地根據收到的信息判斷決策,再應用到路由表。

就像前面說的BGP是最複雜的路由協議,本篇就講了些基本概念。下一篇看看OpenStack裡面的BGP項目: neutron-dynamic-routing


推薦閱讀:

SDN 技術指南(二):OpenFlow
SDN閑聊
OpenStack容器網路項目Kuryr(libnetwork)
SDN再談
NFV再談(應用現狀篇)

TAG:SDN | 计算机网络 |