邊界網關協議
運行於TCP上的路由協議
邊界網關協議(BGP)是運行於TCP上的一種自治系統的路由協議。BGP是唯一一個用來處理像網際網路大小的網路的協議,也是唯一能夠妥善處理好不相關路由域間的多路連接的協議。BGP構建在EGP的經驗之上。BGP系統的主要功能是和其他的BGP系統交換網路可達信息。網路可達信息包括列出的自治系統(AS)的信息。這些信息有效地構造了AS互聯的拓樸圖並由此清除了路由環路,同時在AS級別上可實施策略決策。
(BGP/BGP4:Border Gateway Protocol,邊界網關協議)
BGP-4提供了一套新的機制以支持無類域間路由。這些機制包括支持網路前綴的通告、取消BGP網路中“類”的概念。BGP-4也引入機制支持路由聚合,包括AS路徑的集合。這些改變為提議的超網方案提供了支持。BGP-4採用了路由向量路由協議,在配置BGP時,每一個自治系統的管理員要選擇至少一個路由器作為該自治系統的“BGP發言人”。
1989年發布了主要的外部網關協議:邊界路由協議(BGP),新版本BGP-4是在1995年發布的。
BGP路由選擇協議執行中使用4種分組:打開分組(open)、更新分組(update)、存活分組(keepalive)、通告分組(notification)。
邊界網關協議
BGP用於在不同的自治系統(AS)之間交換路由信息。當兩個AS需要交換路由信息時,每個AS都必須指定一個運行BGP的節點,來代表AS與其他的AS交換路由信息。這個節點可以是一個主機。但通常是路由器來執行BGP。兩個AS中利用BGP交換信息的路由器也被稱為邊界網關(Border Gateway)或邊界路由器(Border Router)。
由於可能與不同的AS相連,在一個AS內部可能存在多個運行BGP的邊界路由器。同一個自治系統(AS)中的兩個或多個對等實體之間運行的BGP被稱為IBGP(Internal/Interior BGP)。歸屬不同的AS的對等實體之間運行的BGP稱為EBGP(External/Exterior BGP)。在AS邊界上與其他AS交換信息的路由器被稱作邊界路由器(border/edge router)。在網際網路操作系統(Cisco IOS)中,IBGP通告的路由的距離為200,優先順序比EBGP和任何內部網關協議(IGP)通告的路由都低。其他的路由器實現中,優先順序順序也是EBGP高於IGP,而IGP又高於IBGP。
BGP屬於外部網關路由協議,可以實現自治系統間無環路的域間路由。BGP是溝通Internet廣域網的主用路由協議,例如不同省份、不同國家之間的路由大多要依靠BGP協議。BGP可分為IBGP(Internal BGP)和EBGP(External BGP)。BGP的鄰居關係(或稱通信對端/對等實體)是通過人工配置實現的,對等實體之間通過TCP(埠179)會話交互數據。BGP路由器會周期地發送19位元組的保持存活keep-alive消息來維護連接(默認周期為30秒)。在路由協議中,只有BGP使用TCP作為傳輸層協議。
IETF先後為BGP制定了多個建議,分別為:
RFC 4271:當前正使用的BGP協議版本,稱之為BGP4。
RFC 1654:BGP4協議的第一個規範。
RFC 1105、RFC 1163、RFC 1267、RFC1771:BGP4之前的BGP版本。
BGP屬於外部或域間路由協議。BGP的主要目標是為處於不同AS中的路由器之間進行路由信息通信提供保障。BGP既不是純粹的矢量距離協議,也不是純粹的鏈路狀態協議,通常被稱為通路向量路由協議。這是因為BGP在發布到一個目的網路的可達性的同時,包含了在IP分組到達目的網路過程中所必須經過的AS的列表。通路向量信息時十分有用的,因為只要簡單地查找一下BGP路由更新的AS編號就能有效地避免環路的出現。BGP對網路拓撲結構沒有限制,其特點包括:
(1)實現自治系統間通信,傳播網路的可達信息。BGP是一個外部網關協議,允許一個AS與另一個AS進行通信。BGP允許一個AS向其他AS通告其內部的網路的可達性信息,或者是通過該AS可達的其他網路的路由信息。同時,AS也能夠從另一個AS中了解這些信息。與距離向量選路協議類似,BGP為每個目的網路提供的是下一跳(next-hop)結點的信息。
(2)多個BGP路由器之間的協調。如果在一個自治系統內部有多個路由器分別使用BGP與其他自治系統中對等路由器進行通信,BGP可以協調者一系列路由器,使這些路由器保持路由信息的一致性。
(3)BGP支持基於策略的選路(policy-base routing)。一般的距離向量選路協議確切通告本地選路中的路由。而BGP則可以實現由本地管理員選擇的策略。BGP路由器可以為域內和域間的網路可達性配置不同的策略。
(4)可靠的傳輸。BGP路由信息的傳輸採用了可靠地TCP協議。
(5)路徑信息。在BGP通告目的網路的可達性信息時,處理指定目的網路的下一跳信息之外,通告中還包括了通路向量(path vector),即去往該目的網路時需要經過的AS的列表,使接受者能夠了解去往目的網路的通路信息。
(6)增量更新。BGP不需要再所有路由更新報文中傳送完整的路由資料庫信息,只需要在啟動時交換一次完整信息。後續的路由更新報文只通告網路的變化信息。這種網路變化的信息稱為增量(delta)。
(7)BGP支持無類型編製(CIDR)及VLSM方式。通告的所有網路都以網路前綴加子網掩碼的方式表示。
(8)路由聚集。BGP允許發送方把路由信息聚集在一起,用一個條目來表示多個相關的目的網路,以節約網路帶寬。
(9)BGP還允許接收方對報文進行鑒別和認證,以驗證發送方的身份。
BGP使用如下四種消息類型:
Open消息:Open消息是TCP連接建立后發送的第一個消息,用於建立BGP對等體之間的連接關係。
Keepalive消息:BGP會周期性地向對等體發出Keepalive消息,用來保持連接的有效性。
Update消息:Update消息用於在對等體之間交換路由信息。它既可以發布可達路由信息,也可以撤銷不可達路由信息。
Notification消息:當BGP檢測到錯誤狀態時,就向對等體發出Notification消息,之後BGP連接會立即中斷。
BGP鄰居建立中的狀態和過程如下:
空閑(Idle):為初始狀態,當協議激活后開始初始化,複位計時器,併發起第一個TCP連接,並開始傾聽遠程對等體所發起的連接,同時轉向Connect狀態。。
連接(Connect):開始TCP連接並等待TCP連接成功的消息。如果TCP連接成功,則進入OpenSent狀態;如果TCP連接失敗,進入Active狀態。
行動(Active):BGP總是試圖建立TCP連接,若連接計時器超時,則退回到Connect狀態,TCP連接成功就轉為Open sent狀態。
OPEN發送(Open sent):TCP連接已建立,自己已發送第一個OPEN報文,等待接收對方的Open報文,並對報文進行檢查,若發現錯誤則發送Notification消息報文並退回到Idle狀態。若檢查無誤則發送Keepalive消息報文,Keepalive計時器開始計時,並轉為Open confirm狀態。
OPEN證實(Open confirm):BGP等待Keepalive報文,同時複位保持計時器。如果收到了Keepalive報文,就轉為Established狀態,鄰居關係協商完成。如果系統收到一條更新或Keepalive消息,它將重新啟動保持計時器;如果收到Notification消息,BGP就退回到空閑狀態。
已建立(Established):即建立了鄰居(對等體)關係,路由器將和鄰居交換Update報文,同時複位保持計時器。
BGP在進行路由通告的時候,需要遵循以下原則:
多條路徑時,BGP Speaker只選最優的給自己使用(負載均衡和FRR除外)。
BGP Speaker只把自己使用的路由(最優路由)通告給相鄰體。
BGP Speaker從EBGP獲得的路由會向自己所有BGP相鄰體通告(包括EBGP和IBGP)。
BGP Speaker從IBGP獲得的路由不向自己的IBGP相鄰體通告(反射器除外)。
BGP Speaker從IBGP獲得的路由是否通告給自己的EBGP相鄰體要根據IGP和BGP同步的情況來決定。
當收到對端的refresh報文並且本端鄰居支持refresh能力,BGP Speaker將把自己所有BGP路由通告給對等體。
GR過程中,主備倒換方在GR結束時BGP Speaker會把自己所有BGP路由通告給對等體。
路由器發送關於目標網路的BGP更新消息,更新的度量值被稱為路徑屬性。屬性可以是公認的或可選的、強制的或自由決定的、傳遞的或非傳遞的。屬性也可以是部分的。並非組織的和有組合的都是合法的,路徑屬性分為4類:公認必遵、公認自決、可選過渡、可選非過渡。
公認屬性:
是公認所有BGP實現都必須識別的屬性,這些屬性被傳遞給BGP鄰居。
公認強制屬性必須出現在路由描述中,公認自由決定屬性可以不出現在路由描述中。
可選屬性:
非公認屬性被稱為可選的,可選屬性可以是傳遞的或非傳遞的。
可選屬性不要求所有的BGP實現都支持。
對於不支持的可選傳遞屬性,路由器將其原封不動的傳遞給其他BGP路由器,在這種情況下,屬性被標記為部分的。
對於可選非傳遞屬性,路由器必須將其刪除,而不將其傳遞給其他BGP路由器。
(1)公認必遵(Well-Known Mandatory)
ORIGIN(起源):這個屬性說明了源路由是怎樣放到BGP表中的。有三個可能的源IGP,EGP,以及INCOMPLETE.路由器在多個路由選擇的處理中使用這個信息。路由器選擇具有最低ORIGIN類型的路徑。
AS_PATH(AS路徑):指出包含在UPDATE報文中的路由信息所經過的自治系統的序列。
Next_HOP(下一跳)聲明路由器所獲得的BGP路由的下一跳,對EBGP會話來說,下一跳就是通告該路由的鄰居路由器的源地址。
(2)公認自決(Well-Known Discretionary)
LOCAL_PREF(本地優先順序):本地優先順序屬性是用於告訴自治系統內的路由器在有多條路徑的時候,怎樣離開自治系統。本地優先順序越高,路由優先順序越高。
ATOMIC_AGGREGATE(原子聚合):原子聚合屬性指出已被丟失了的信息。
(3)可選過渡(Optional Transitive)
AGGREGATOR(聚合者):此屬性標明了實施路由聚合的BGP路由器ID和聚合路由的路由器的AS號。
COMMUNITY(團體):此屬性指共享一個公共屬性的一組路由器。
(4)可選非過渡(Optional Nontransitive)
MED(多出口區分):該屬性通知AS以外的路由器採用哪一條路徑到達AS,它也被認為是路由的外部度量,低MED值表示高的優先順序。
ORIGINATOR_ID(起源ID):路由反射器會附加到這個屬性上,它攜帶本AS路由器的路由器ID,用以防止環路。
CLUSTER_LIST(簇列表):此屬性顯示了採用的反射路徑。
Marker16bytes Length(2bytes)Type(1byte)
Marker–信息包含信息接收端可預測值。
Length–包含協議頭的信息長度。
Type–信息類型。信息可能是:Open、Update、Notification、Keepalive。
打開(Open)分組,用來與相鄰的另一個BGP發言人建立聯繫。
更新(Update)分組,用來發送某一路由的信息,以及列出多條要撤銷的路由。
保活(Keepalive)分組,用來確認打開分組和周期性地證實鄰站關係。
通知(Notification)分組,用來發送檢測到的差錯在傳輸協議連接建立之後,各端發送的第一個信息是OPEN信息。如果OPEN信息可以接收,會返回發送確認OPEN信息KEEPALIVE信息。一旦OPEN信息獲得確認,UPDATE、KEEPALIVE NOTIFICATION信息進行相互交換。
報文結構
BGP的報文結構如下所示
標記 | 長度 | 類型 | 報文數據(變長) |
BGP的報文分成報文與報文數據兩部分,其中,BGP報文數據根據不同的報文類型有所不同,報文頭由以下3個欄位構成:
(1)標記(Marker)欄位。標記欄位由16個位元組構成。標記欄位的值是一個通信雙方(對等路由器)都可認可的位元組串,雙方都統一使用改制來標識一個合法的BGP報文的開始。通常,標記欄位用於承載鑒別信息。對於通信雙方,在任何情況下標記的值都必須保持一致。標記欄位用於報文接收的同步。由於BGP報文用過TCP來簡化,而TCP協議是一個無結構的流(stream)傳輸協議。在TCP協議上部位高層提供數據流的結構識別,因此也無法為BGP標識兩個報文之間的邊界。由於傳輸協議不指定報文邊界,因此,為了確保發送方和接收方的報文邊界準確保持同步,BGO要求在每個報文的開頭放置了一個雙方已知的序列,接收方通過該序列來檢驗報文頭的正確性。
(2)報文長度,16比特,制定了以位元組為單位計算的報文總長度。最小的報文為19i節,最大允許報文長度為4096位元組。
(3)報文類型,1位元組,指出報文所屬的類型。
報文類型
BGP的路由更新消息一BGP報文形式在路由器間交換,BGP為了實現其功能定義了4種報文類型。
代碼 | 類型 | 說明 |
1 | OPEN | 初始化對等路由器間的通信 |
2 | UPDATE | 更新:通告或撤銷路由 |
3 | NOTIFICATION | 對不正確BGP報文的通知 |
4 | KEEPALIVE | 測試與對等路由器的連接性 |
(1)打開(OPEN)報文
當兩個BGP對等路由器之間建立以一個TCP連接以後,就分別發送一個打開報文,聲明各自的自治系統號,並確定其他操作參數。
路由器接受到來自對等路由器的OPEN報文時,BGP將發送一個KEEPALIVE報文。在路由器之間交換選路信息之前,通信雙方都必須發送一個OPEN報文,並接受一個KEEPALIVE報文。KEEPALIVE報文可以用作對OPEN報文的確認。
(2)更新(UPDATE)報文
對等的BGP路由器之間創建了TCP連接,並成功接收到對OPEN報文的KEEPALIVE確定報文,對等路由器之間就可以使用路由更新消息報文來通告網路的可達性信息。通告的的內容可以是新的可達的目的網路,也可以是通告撤銷原來的某些目的網路的可達性。
(3)保持激活(KEEPALIVE)報文
保持激活報文用於在兩個BGP對等路由器之間定期測試網路連接性,並證實對等路由器的正常工作。由於TCP協議本身沒有提供自動的連接狀態的通知機制,對等路由器之間定製交換KEEPALIVE報文可以使BGP實體能夠檢測TCP連接是否工作正常。保持激活報文僅包含標準的BGP報文頭(類型4),報文長度為19位元組。
(4)通知(NOTIFICATION)報文
BGP在發現錯誤時(或需要進行控制時),可以利用通知報文來通知對等路由器。一旦通知報文,路由器檢測來檢查到了出現的錯誤,BGP就會向對等路由器發送一個通知報文,然後關閉TCP連接終止通信。
MCE功能是Multi-CE的簡稱,具有MCE功能的網路設備可以在BGP/MPLS VPN組網應用中承擔多個VPN實例的CE功能,減少用戶網路設備的投入。
工作原理
隨著用戶業務的不斷細化和安全需求的提高,很多情況下一個私有網路內的用戶需要劃分成多個VPN,不同VPN用戶間的業務需要完全隔離。此時,為每個VPN單獨配置一台CE將加大用戶的設備開支和維護成本;而多個VPN共用一台CE,使用同一個路由表項,又無法保證數據的安全性。使用MCE功能,可以有效解決多VPN網路帶來的用戶數據安全與網路成本之間的矛盾,它使用CE設備本身的VLAN介面編號與網路內的VPN進行綁定,並為每個VPN創建和維護獨立的路由轉發表(Multi-VRF)。這樣不但能夠隔離私網內不同VPN的報文轉發路徑,而且通過與PE間的配合,也能夠將每個VPN的路由正確發布至對端PE,保證VPN報文在公網內的傳輸。
下面舉例介紹MCE對多個VPN的路由表項進行維護,並與PE交互VPN路由的過程:
如右圖所示,左側私網內有兩個VPN站點:VPN1和VPN2,分別通過MCE設備接入MPLS骨幹網,其中VPN1和VPN2的用戶,需要分別與遠端VPN1用戶和VPN2用戶建立VPN隧道。通過配置MCE功能,可以在MCE設備上為VPN1和VPN2創建各自的路由轉發表,並使用VLAN2介面與VPN1進行綁定、VLAN3與VPN2進行綁定。在接收路由信息時,MCE設備根據接收介面的編號,即可判斷該路由信息的來源,並將其維護到對應VPN的路由轉發表中。同時,在PE1上也需要將連接MCE的介面與VPN進行綁定,綁定的方式與MCE設備一致。MCE與PE1之間通過Trunk鏈路連接,並允許VLAN2和VLAN3的報文攜帶VLAN Tag傳輸,從而使PE1在接收時可以根據報文所屬VLAN判別該報文屬於哪一個VPN,將報文在指定的隧道內傳輸。
MCE設備是如何將多個VPN實例的私網路由信息準確傳播到PE設備?這包括兩部分:MCE與VPN站點的路由信息交換,MCE與PE之間的路由信息交換。這些路由信息的交換都有很多種方法,如靜態路由、RIP、OSPF、ISIS、BGP路由協議。如果使用BGP路由協議來實現路由信息交換,則就是使用BGP MCE功能,因此BGP MCE功能就是BGP協議支持VRF,能夠實現VRF下BGP路由信息的交換。需要在MCE上為每個VRF實例配置BGP對等體,並引入相應VPN內的IGP路由信息。由於各個VPN間正常情況下是處在不同的AS內,因此使用EBGP進行路由的傳播。