讓 Facebook 宕機背鍋的 BGP 協(xié)議,到底是個啥玩意?
在下方公眾號后臺回復:面試手冊,可獲取杰哥匯總的 3 份面試 PDF 手冊。
什么是BGP
BGP全稱是Border Gateway Protocol, 對應中文是邊界網(wǎng)關(guān)協(xié)議。這個名字比較抽象,而維基中文的解釋我覺得比較好(維基英文甚至都沒有類似的解釋)。BGP是互聯(lián)網(wǎng)上一個核心的去中心化自治路由協(xié)議。從這個解釋來看,首先這是一個用于互聯(lián)網(wǎng)(Internet)上的路由協(xié)議。它的地位是核心的(目前是最重要的,互聯(lián)網(wǎng)上唯一使用的路由協(xié)議),它的目的是去中心化,以達到各個網(wǎng)絡自治。不過還是有點抽象?
先看看幾個相關(guān)的概念:
AS(Autonomous system):自治系統(tǒng),指在一個(有時是多個)組織管轄下的所有IP網(wǎng)絡和路由器的全體,它們對互聯(lián)網(wǎng)執(zhí)行共同的路由策略。也就是說,對于互聯(lián)網(wǎng)來說,一個AS是一個獨立的整體網(wǎng)絡。而BGP實現(xiàn)的網(wǎng)絡自治也是指各個AS自治。每個AS有自己唯一的編號。
IGP(Interior Gateway Protocol):內(nèi)部網(wǎng)關(guān)協(xié)議,在一個AS內(nèi)部所使用的一種路由協(xié)議。一個AS內(nèi)部也可以有多個路由器管理多個網(wǎng)絡。各個路由器之間需要路由信息以知道子網(wǎng)絡的可達信息。IGP就是用來管理這些路由。代表的實現(xiàn)有RIP和OSPF。
EGP(Exterior Gateway Protocol):外部網(wǎng)關(guān)協(xié)議,在多個AS之間使用的一種路由協(xié)議,現(xiàn)在已經(jīng)淘汰,被BGP取而代之。
由于BGP就是為了替換EGP而創(chuàng)建,它的地位與EGP相似。但是BGP也可以應用在一個AS內(nèi)部。因此BGP又可以分為IBGP(Interior BGP :同一個AS之間的連接)和EBGP(Exterior BGP:不同AS之間的BGP連接)。既然EGP已經(jīng)被替代了,那EBGP的存在比較好理解,但是IGP協(xié)議都還活得好好的(這里指的是OSPF),那IBGP的意義何在?IGP的協(xié)議是針對同一個AS網(wǎng)絡來設計的,一個自治網(wǎng)絡的規(guī)模一般都不大,所以設計的時候就沒有考慮大規(guī)模網(wǎng)絡的情況。而當一個自治網(wǎng)絡足夠大時,OSPF存在性能瓶頸(后面會說明)。BGP本身就是為了在Internet工作,其設計就是為了滿足大型網(wǎng)絡的要求,所以大型私有IP網(wǎng)絡內(nèi)部可以使用IBGP??偟膩碚f,這幾類路由協(xié)議,小規(guī)模私有網(wǎng)絡IGP,大規(guī)模私有網(wǎng)絡IBGP,互聯(lián)網(wǎng)EBGP。

為什么需要BGP
BGP號稱是使互聯(lián)網(wǎng)工作的協(xié)議,看起來似乎很重要,為什么平常的生活中很少接觸呢?似乎云里面也不怎么提BGP,我們來看看原因吧。
假設小明正在搭建一個云環(huán)境,提供虛擬機服務。

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

版本上線之后怎么辦?當然是開發(fā)下一版本!下一版本的需求是可以通過互聯(lián)網(wǎng)訪問虛機(也就是從互聯(lián)網(wǎng)訪問我們家里的電腦)。這個也不難,可以通過端口轉(zhuǎn)發(fā)(Port Forward),將虛機的一個端口與公網(wǎng)IP的端口進行映射。例如將虛機的22端口映射到公網(wǎng)IP的1122端口,那么可以通過互聯(lián)網(wǎng)ssh到公網(wǎng)IP:1122,登陸虛機。這部分工作仍然是在小明的云中路由器完成。這樣,小明的2.0版本云上線了,這里小明還是不需要BGP。
2.0版本雖然支持了從互聯(lián)網(wǎng)訪問虛機,但是還有問題:
每個虛機每開放一個端口都需要映射一次
公網(wǎng)IP的端口是有限的
為了解決這些問題,小明向聯(lián)通申請了一些公網(wǎng)IP地址,對于需要從外網(wǎng)訪問的虛機,直接給它們分配公網(wǎng)IP。這樣小明的3.0版本云上線了,這里小明還是不需要BGP。因為:
聯(lián)通是小明云唯一連接的ISP,小明只能通過聯(lián)通訪問互聯(lián)網(wǎng),所以小明的云中路由器的默認路由只能設置成ISP 路由器的地址。
小明云里面的公網(wǎng)IP都是聯(lián)通分配的,聯(lián)通當然知道該從哪個IP地址作為下一跳去訪問那些IP地址。

聯(lián)通的IP畢竟是有限的,而且聯(lián)通還老是斷線。這都發(fā)布3個版本了,小明決定干一票大的。
首先,小明向IANA(Internet Assigned Numbers Authority)申請了自己的公網(wǎng)IP池。因為有了自己的公網(wǎng)IP,也必須要考慮申請AS號。AS號是一個16bit的數(shù)字,全球共用這60000多個編號。1 – 64511 是全球唯一的,而 64512 – 65535 是可以自用的,類似于私網(wǎng)網(wǎng)段。每個自治網(wǎng)絡都需要申請自己的AS編號,聯(lián)通的AS號是9800。
然后,小明分別向聯(lián)通和電信買了線路,這樣就算聯(lián)通斷線還能用電信。
那現(xiàn)在問題來了:
聯(lián)通或者電信怎么知道小明申請的公網(wǎng)IP是什么。換言之,我現(xiàn)在撥號撥進了聯(lián)通寬帶,我怎么才能訪問到小明云的公網(wǎng)IP?
小明的云中路由器的默認路由該設置到聯(lián)通的ISP路由器,還是電信的?
終于,在小明的4.0版本云上,小明需要用BGP了。通過BGP,小明可以將自己云中的路由信息發(fā)送到聯(lián)通,電信,這樣ISP就知道了改如何訪問小明的公網(wǎng)虛擬機,也就是說我們普通的使用者通過ISP,能訪問到小明的網(wǎng)絡。另一方面,通過在云中運行BGP服務,小明可以管理云中路由器的默認路由。
總的來說,要是你之前沒有聽過或者用過BGP,只能說你的網(wǎng)絡還沒有到那個規(guī)模 :)
BGP協(xié)議
BGP可以說是最復雜的路由協(xié)議。它是應用層協(xié)議,其傳輸層使用TCP,默認端口號是179。因為是應用層協(xié)議,可以認為它的連接是可靠的,并且不用考慮底層的工作,例如fragment,確認,重傳等等。BGP是唯一使用TCP作為傳輸層的路由協(xié)議,其他的路由協(xié)議可能都還到不了傳輸層。
TCP連接的窗口是65K字節(jié),也就是說TCP連接允許在沒有確認包的情況下,連續(xù)發(fā)送65K的數(shù)據(jù)。而其他的路由協(xié)議,例如EIGRP和OSPF的窗口只有一個數(shù)據(jù)包,也就是說前一個數(shù)據(jù)包收到確認包之后,才會發(fā)送下一個數(shù)據(jù)包。當網(wǎng)絡規(guī)模巨大時,需要傳輸?shù)臄?shù)據(jù)也相應變大,這樣效率是非常低的。這也是它們不適合大規(guī)模網(wǎng)絡的原因。而正是由于TCP可以可靠的傳輸大量數(shù)據(jù),且互聯(lián)網(wǎng)的路由信息是巨大的,TCP被選為BGP的傳輸層協(xié)議,并且BGP適合大規(guī)模網(wǎng)絡環(huán)境。
和大部分協(xié)議一樣,BGP的數(shù)據(jù)由header和data組成。Header有19個字節(jié),所有的BGP數(shù)據(jù)的Header格式是一樣的。

Marker有16個字節(jié)長,存儲著同步信息和加密信息。Length2個字節(jié),包含header在內(nèi)的長度。Type1個字節(jié),表示當前BGP數(shù)據(jù)的類型,具體有4類:
Open(code 1):TCP連接建立之后,BGP發(fā)送的第一個包。收到Open之后,BGP peer會發(fā)送一個Keepalive消息以確認Open。其他所有的消息都只會在Open消息確認之后,并且BGP連接已經(jīng)建立之后發(fā)送。
Update(code 2):BGP連接后的首次Update會交換整個BGP route table,之后的Update只會發(fā)送變化了的路由信息。所以說BGP是動態(tài)的傳輸路由消息的變化。
Notification(code 3):出錯時發(fā)送的消息,這個消息一旦發(fā)送,BGP連接將會中斷。
Keepalive(code 4):沒有data,只有header。用來保持BGP連接,通常是1/3的BGP session hold time。默認是60秒,如果hold time是0,不會發(fā)送Keepalive。
每一種BGP數(shù)據(jù)的data都不相同,這些都由網(wǎng)絡設備商實現(xiàn)了,簡單看一下Open和Update的data吧。

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

BGP Update 數(shù)據(jù),主要就是交換Network Layer Reachability Information (NLRI)。一個Update數(shù)據(jù)包里面只會有一條path的路由信息,因此只有一組path attribute,但是路由可以有多條。具體的說,一個BGP router可能連接了多個BGP peer router,那么它在發(fā)送BGP Update數(shù)據(jù)時,一次只會發(fā)送一個它的BGP peer router的信息。
BGP如何工作
BGP是一種路徑矢量協(xié)議(Path vector protocol)的實現(xiàn)。因此,它的工作原理也是基于路徑矢量。首先說明一下,下面說的BGP route指的是BGP自己維護的路由信息,區(qū)分于設備的主路由表,也就是我們平??匆姷哪莻€路由表。BGP route是BGP協(xié)議傳輸?shù)臄?shù)據(jù),并存儲在BGP router的數(shù)據(jù)庫中。并非所有的BGP route都會寫到主路由表。每條BGP route都包含了目的網(wǎng)絡,下一跳和完整的路徑信息。路徑信息是由AS號組成,當BGP router收到了一條 路由信息,如果里面的路徑包含了自己的AS號,那它就能判定這是一條自己曾經(jīng)發(fā)出的路由信息,收到的這條路由信息會被丟棄。
這里把每個BGP服務的實體叫做BGP router,而與BGP router連接的對端叫BGP peer。每個BGP router在收到了peer傳來的路由信息,會存儲在自己的數(shù)據(jù)庫,前面說過,路由信息包含很多其他的信息,BGP router會根據(jù)自己本地的policy結(jié)合路由信息中的內(nèi)容判斷,如果路由信息符合本地policy,BGP router會修改自己的主路由表。本地的policy可以有很多,舉個例子,如果BGP router收到兩條路由信息,目的網(wǎng)絡一樣,但是路徑不一樣,一個是AS1->AS3->AS5,另一個是AS1->AS2,如果沒有其他的特殊policy,BGP router會選用AS1->AS2這條路由信息。policy還有很多其他的,可以實現(xiàn)復雜的控制。
除了修改主路由表,BGP router還會修改這條路由信息,將自己的AS號加在BGP數(shù)據(jù)中,將下一跳改為自己,并且將自己加在路徑信息里。在這之后,這條消息會繼續(xù)向別的BGP peer發(fā)送。而其他的BGP peer就知道了,可以通過指定下一跳到當前BGP router,來達到目的網(wǎng)絡地址。
所以說,BGP更像是一個可達協(xié)議,可達信息傳來傳去,本地根據(jù)收到的信息判斷決策,再應用到路由表。
推薦閱讀
100 個網(wǎng)絡基礎(chǔ)知識普及,看完成半個網(wǎng)絡高手!
運維,請收好網(wǎng)絡工具中的瑞士軍刀,從此故障診斷不用愁!
網(wǎng)絡故障排除工具 | 快速定位網(wǎng)絡故障
請收好這一份詳細 & 清晰的計算機網(wǎng)絡基礎(chǔ)學習指南!
有了這篇網(wǎng)絡排錯思路大總結(jié):我?guī)土瞬簧倥聗
小白也能看懂的網(wǎng)絡基礎(chǔ) | 01 什么是網(wǎng)絡?
小白也能看懂的網(wǎng)絡基礎(chǔ) | 44 張圖搞定什么是連接設備?

