目 錄
BGP(Border Gateway Protocol,邊界網關協議)是一種用於AS(Autonomous System,自治係統)之間的動態路由協議。AS是擁有同一選路策略,在同一技術管理部門下運行的一組路由器。
早期發布的三個版本分別是BGP-1(RFC 1105)、BGP-2(RFC 1163)和BGP-3(RFC 1267),當前使用的版本是BGP-4(RFC 1771,已更新至RFC 4271)。BGP-4作為事實上的Internet外部路由協議標準,被廣泛應用於ISP(Internet Service Provider,因特網服務提供商)之間。
& 說明:
下文中若不做特殊說明,所指的BGP均為BGP-4。
BGP特性描述如下:
l BGP是一種外部網關協議(Exterior Gateway Protocol,EGP),與OSPF、RIP等內部網關協議(Interior Gateway Protocol,IGP)不同,其著眼點不在於發現和計算路由,而在於控製路由的傳播和選擇最佳路由。
l BGP使用TCP作為其傳輸層協議(端口號179),提高了協議的可靠性。
l BGP支持CIDR(Classless Inter-Domain Routing,無類別域間路由)。
l 路由更新時,BGP隻發送更新的路由,大大減少了BGP傳播路由所占用的帶寬,適用於在Internet上傳播大量的路由信息。
l BGP路由通過攜帶AS路徑信息徹底解決路由環路問題。
l BGP提供了豐富的路由策略,能夠對路由實現靈活的過濾和選擇。
l BGP易於擴展,能夠適應網絡新的發展。
發送BGP消息的路由器稱為BGP發言者(BGP Speaker),它接收或產生新的路由信息,並發布(Advertise)給其它BGP發言者。當BGP發言者收到來自其它自治係統的新路由時,如果該路由比當前已知路由更優、或者當前還沒有該路由,它就把這條路由發布給自治係統內所有其它BGP發言者。
相互交換消息的BGP發言者之間互稱對等體(Peer),若幹相關的對等體可以構成對等體組(Peer group)。
BGP在路由器上以下列兩種方式運行:
l IBGP(Internal BGP):當BGP運行於同一自治係統內部時,被稱為IBGP;
l EBGP(External BGP):當BGP運行於不同自治係統之間時,稱為EBGP。
BGP有5種消息類型:Open、Update、Notification、Keepalive和Route-refresh。這些消息有相同的報文頭,其格式如圖1所示。
圖1 BGP消息的報文頭格式
主要字段的解釋如下:
l Marker:16字節,用於標明BGP報文邊界,所有比特均為“1”。
l Length:2字節,BGP消息總長度(包括報文頭在內),以字節為單位。
l Type:1字節,BGP消息的類型。其取值從1到5,分別表示Open、Update、Notification、Keepalive和Route-refresh消息。其中,前四種消息是在RFC 1771中定義,而Type為5的消息則是在RFC 2918中定義的。
Open消息是TCP連接建立後發送的第一個消息,用於建立BGP對等體之間的連接關係。其消息格式如圖2所示。
圖2 BGP Open消息格式
主要字段的解釋如下:
l Version:BGP的版本號。對於BGP-4來說,其值為4。
l My autonomous system:本地AS號。通過比較兩端的AS號可以確定是EBGP連接還是IBGP連接。
l Hold time:保持時間。在建立對等體關係時兩端要協商Hold Time,並保持一致。如果在這個時間內未收到對端發來的Keepalive消息或Update消息,則認為BGP連接中斷。
l BGP identifier:BGP標識符。以IP地址的形式表示,用來識別BGP路由器。
l Opt Parm Len(Optional Parameters Length):可選參數的長度。如果為0則沒有可選參數。
l Optional parameters:可選參數。用於多協議擴展(Multiprotocol Extensions)等功能。
Update消息用於在對等體之間交換路由信息。它既可以發布可達路由信息,也可以撤銷不可達路由信息。其消息格式如圖3所示。
圖3 BGP Update消息格式
一條Update報文可以通告一類具有相同路徑屬性的可達路由,這些路由放在NLRI(Network Layer Reachable Information,網絡層可達信息)字段中,Path Attributes字段攜帶了這些路由的屬性,BGP根據這些屬性進行路由的選擇;同時Update報文還可以攜帶多條不可達路由,被撤銷的路由放在Withdrawn Routes字段中。
主要字段的解釋如下:
l Unfeasible routes length:不可達路由字段的長度,以字節為單位。如果為0則說明沒有Withdrawn Routes字段。
l Withdrawn routes:不可達路由的列表。
l Total path attribute length:路徑屬性字段的長度,以字節為單位。如果為0則說明沒有Path Attributes字段。
l Path atributes:與NLRI相關的所有路徑屬性列表,每個路徑屬性由一個TLV(Type-Length-Value)三元組構成。BGP正是根據這些屬性值來避免環路,進行選路,協議擴展等。
l NLRI(Network Layer Reachability Information):可達路由的前綴和前綴長度二元組。
當BGP檢測到錯誤狀態時,就向對等體發出Notification消息,之後BGP連接會立即中斷。其消息格式如圖4所示。
主要字段的解釋如下:
l Error code:差錯碼,指定錯誤類型。
l Error subcode:差錯子碼,錯誤類型的詳細信息。
l Data:用於輔助發現錯誤的原因,它的內容依賴於具體的差錯碼和差錯子碼,記錄的是出錯部分的數據,長度不固定。
BGP會周期性地向對等體發出Keepalive消息,用來保持連接的有效性。其消息格式中隻包含報文頭,沒有附加其他任何字段。
Route-refresh消息用來要求對等體重新發送指定地址族的路由信息。其消息格式如圖5所示。
主要的字段解釋如下:
l AFI:Address Family Identifier,地址族標識。
l Res.:保留,必須置0。
l SAFI:Subsequent Address Family Identifier,子地址族標識。
BGP路由屬性是一組參數,它對特定的路由進行了進一步的描述,使得BGP能夠對路由進行過濾和選擇。
事實上,所有的BGP路由屬性都可以分為以下四類:
l 公認必須遵循(Well-known mandatory):所有BGP路由器都必須能夠識別這種屬性,且必須存在於Update消息中。如果缺少這種屬性,路由信息就會出錯。
l 公認可選(Well-known discretionary):所有BGP路由器都可以識別,但不要求必須存在於Update消息中,可以根據具體情況來選擇。
l 可選過渡(Optional transitive):在AS之間具有可傳遞性的屬性。BGP路由器可以不支持此屬性,但它仍然會接收帶有此屬性的路由,並通告給其他對等體。
l 可選非過渡(Optional non-transitive):如果BGP路由器不支持此屬性,該屬性被忽略,且不會通告給其他對等體。
BGP路由幾種基本屬性和對應的類別如表1所示。
表1 路由屬性和類別
屬性名稱 | 類別 |
ORIGIN | 公認必須遵循 |
AS_PATH | 公認必須遵循 |
NEXT_HOP | 公認必須遵循 |
LOCAL_PREF | 公認可選 |
ATOMIC_AGGREGATE | 公認可選 |
AGGREGATOR | 可選過渡 |
COMMUNITY | 可選過渡 |
MULTI_EXIT_DISC (MED) | 可選非過渡 |
ORIGINATOR_ID | 可選非過渡 |
CLUSTER_LIST | 可選非過渡 |
(1) 源(ORIGIN)屬性
ORIGIN屬性定義路由信息的來源,標記一條路由是怎麼成為BGP路由的。它有以下三種類型:
l IGP:優先級最高,說明路由產生於本AS內。
l EGP:優先級次之,說明路由通過EGP學到。
l incomplete:優先級最低,它並不是說明路由不可達,而是表示路由的來源無法確定。例如,引入的其它路由協議的路由信息。
(2) AS路徑(AS_PATH)屬性
AS_PATH屬性按一定次序記錄了某條路由從本地到目的地址所要經過的所有AS號。當BGP將一條路由通告到其他AS時,便會把本地AS號添加在AS_PATH列表的最前麵。收到此路由的BGP路由器根據AS_PATH屬性就可以知道去目的地址所要經過的AS。離本地AS最近的相鄰AS號排在前麵,其他AS號按順序依次排列。如圖6所示。
通常情況下,BGP不會接受AS_PATH中已包含本地AS號的路由,從而避免了形成路由環路的可能。
同時,AS_PATH屬性也可用於路由的選擇和過濾。在其他因素相同的情況下,BGP會優先選擇路徑較短的路由。比如在圖6中,AS 50中的BGP路由器會選擇經過AS 40的路徑作為到目的地址8.0.0.0的最優路由。
在某些應用中,可以使用路由策略來人為地增加AS路徑的長度,以便更為靈活地控製BGP路徑的選擇。
通過AS路徑過濾列表,還可以針對AS_PATH屬性中所包含的AS號來對路由進行過濾。
(3) 下一跳(NEXT_HOP)屬性
BGP的下一跳屬性和IGP的有所不同,不一定就是鄰居路由器的IP地址。
下一跳屬性取值情況分為三種,如所示。
l BGP發言者把自己產生的路由發給所有鄰居時,將把該路由信息的下一跳屬性設置為自己與對端連接的接口地址;
l BGP發言者把接收到的路由發送給EBGP對等體時,將把該路由信息的下一跳屬性設置為本地與對端連接的接口地址;
l BGP發言者把從EBGP鄰居得到的路由發給IBGP鄰居時,並不改變該路由信息的下一跳屬性。如果配置了負載分擔,路由被發給IBGP鄰居時則會修改下一跳屬性。
(4) MED(MULTI_EXIT_DISC)
MED屬性僅在相鄰兩個AS之間交換,收到此屬性的AS一方不會再將其通告給任何其他第三方AS。
MED屬性相當於IGP使用的度量值(metrics),它用於判斷流量進入AS時的最佳路由。當一個運行BGP的路由器通過不同的EBGP對等體得到目的地址相同但下一跳不同的多條路由時,在其它條件相同的情況下,將優先選擇MED值較小者作為最佳路由。如圖8所示,從AS 10到AS 20的流量將選擇Router B作為入口。
圖8 MED屬性
通常情況下,BGP隻比較來自同一個AS的路由的MED屬性值。
(5) 本地優先(LOCAL_PREF)屬性
LOCAL_PREF屬性僅在IBGP對等體之間交換,不通告給其他AS。它表明BGP路由器的優先級。
LOCAL_PREF屬性用於判斷流量離開AS時的最佳路由。當BGP的路由器通過不同的IBGP對等體得到目的地址相同但下一跳不同的多條路由時,將優先選擇LOCAL_PREF屬性值較高的路由。如圖9所示,從AS 20到AS 10的流量將選擇Router C作為出口。
(6) 團體(COMMUNITY)屬性
團體屬性用來簡化路由策略的應用和降低維護管理的難度。它是一組有相同特征的目的地址的集合,沒有物理上的邊界,與其所在的AS無關。公認的團體屬性有:
l INTERNET:缺省情況下,所有的路由都屬於INTERNET團體。具有此屬性的路由可以被通告給所有的BGP對等體。
l NO_EXPORT:具有此屬性的路由在收到後,不能被發布到本地AS之外。如果使用了聯盟,則不能被發布到聯盟之外,但可以發布給聯盟中的其他子AS。
l NO_ADVERTISE:具有此屬性的路由被接收後,不能被通告給任何其他的BGP對等體。
l NO_EXPORT_SUBCONFED:具有此屬性的路由被接收後,不能被發布到本地AS之外,也不能發布到聯盟中的其他子AS。
在目前的實現中,BGP選擇路由時采取如下策略:
l 首先丟棄下一跳(NEXT_HOP)不可達的路由;
l 優選Preferred-value值最大的路由;
l 優選本地優先級(LOCAL_PREF)最高的路由;
l 優選聚合路由;
l 優選AS路徑(AS_PATH)最短的路由;
l 依次選擇ORIGIN類型為IGP、EGP、Incomplete的路由;
l 優選MED值最低的路由;
l 依次選擇從EBGP、聯盟、IBGP學來的路由;
l 優選下一跳Cost值最低的路由;
l 優選CLUSTER_LIST長度最短的路由;
l 優選ORIGINATOR_ID最小的路由;
l 優選地址最小的對等體發布的路由。
& 說明:
l CLUSTER_ID為路由反射器的集群ID,CLUSTER_LIST由CLUSTER_ID序列組成,反射器將自己的CLUSTER_ID加入CLUSTER_LIST中,若反射器收到路由中CLUSTER_LIST中包含有自己的CLUSTER_ID,則丟棄該路由,從而避免群內環路的發生。
l 如果配置了負載分擔,並且有多條到達同一目的地的路由,則根據配置的路由條數選擇多條路由進行負載分擔。
在BGP中,由於協議本身的特殊性,它產生的路由的下一跳地址可能不是當前路由器直接相連的鄰居。常見的一個原因是:IBGP之間發布路由信息時不改變下一跳。這種情況下,為了能夠將報文正確轉發出去,路由器必須先找到一個直接可達的地址(查找IGP建立的路由表項),通過這個地址到達路由表中指示的下一跳。在上述過程中,去往直接可達地址的路由被稱為依賴路由,BGP路由依賴於這些路由指導報文轉發。根據下一跳地址找到依賴路由的過程就是路由迭代(recursion)。
目前係統支持基於迭代的BGP負載分擔,即如果依賴路由本身是負載分擔的(假設有三個下一跳地址),則BGP也會生成相同數量的下一跳地址來指導報文轉發。需要說明的是,基於迭代的BGP負載分擔在係統上始終啟用。
在實現方法上,BGP的負載分擔與IGP的負載分擔有所不同:
l IGP是通過協議定義的路由算法,對到達同一目的地址的不同路由,根據計算結果,將度量值(metric)相等的(如RIP、OSPF)路由進行負載分擔,選擇的標準很明確(按metric)。
l BGP本身並沒有路由計算的算法,它隻是一個選路的路由協議,因此,不能根據一個明確的度量值決定是否對路由進行負載分擔,但BGP有豐富的選路規則,可以在對路由進行一定的選擇後,有條件地進行負載分擔,也就是將負載分擔加入到BGP的選路規則中去。
& 說明:
l BGP隻對AS_PATH屬性、ORIGIN屬性、LOCAL_PREF和MED值完全相同的路由進行負載分擔。
l BGP負載分擔特性適用於EBGP、IBGP以及聯盟之間。
l 如果有多條到達同一目的地的路由,則根據配置的路由條數選擇多條路由進行負載分擔。
圖10 BGP負載分擔示意圖
在圖10中,Router D和Router E是Router C的IBGP對等體。當Router A和Router B同時向Router C通告到達同一目的地的路由時,如果用戶在Router C配置了負載分擔(如balance 2),則當滿足一定的選路規則後,並且兩條路由具有相同的AS_PATH屬性、ORIGIN屬性、LOCAL_PREF和MED值時,Router C就把接收的兩條路由同時加入到轉發表中,實現BGP路由的負載分擔。Router C隻向Router D和Router E轉發一次該路由,AS_PATH不變,但NEXT_HOP屬性改變為Router C的地址,而不是原來的EBGP對等體地址。其它的BGP過渡屬性將按最佳路由的屬性傳遞。
在目前的實現中,BGP發布路由時采用如下策略:
l 存在多條有效路由時,BGP發言者隻將最優路由發布給對等體;
l BGP發言者隻把自己使用的路由發布給對等體;
l BGP發言者從EBGP獲得的路由會向它所有BGP對等體發布(包括EBGP對等體和IBGP對等體);
l BGP發言者從IBGP獲得的路由不向它的IBGP對等體發布;
l BGP發言者從IBGP獲得的路由發布給它的EBGP對等體(關閉BGP與IGP同步的情況下,IBGP路由被直接發布;開啟BGP與IGP同步的情況下,該IBGP路由隻有在IGP也發布了這條路由時才會被同步並發布給EBGP對等體);
l 連接一旦建立,BGP發言者將把自己所有的BGP路由發布給新對等體。
同步是指IBGP和IGP之間的同步,其目的是為了避免出現誤導外部AS路由器的現象發生。
如果一個AS中有非BGP路由器提供轉發服務,經該AS轉發的IP報文將可能因為目的地址不可達而被丟棄。如圖11所示,Router E通過BGP從Router D可以學到Router A的一條路由8.0.0.0/8,於是將到這個目的地址的報文轉發給Router D,Router D查詢路由表,發現下一跳是Router B。由於Router D從IGP學到了到Router B的路由,所以通過路由迭代,Router D將報文轉發給Router C。但Router C並不知道去8.0.0.0/8的路由,於是將報文丟棄。
圖11 IBGP和IGP同步
如果設置了同步特性,在IBGP路由加入路由表並發布給EBGP對等體之前,會先檢查IGP路由表。隻有在IGP也知道這條IBGP路由時,它才會被發布給EBGP對等體。
在下麵的情況中,可以關閉同步特性。
l 本AS不是過渡AS(圖11中的AS 20就屬於一個過渡AS)
l 本AS內所有路由器建立IBGP全連接
在大規模的網絡中,BGP路由表十分龐大,使用路由聚合(Routes Aggregation)可以大大減小路由表的規模。
路由聚合實際上是將多條路由合並的過程。這樣BGP在向對等體通告路由時,可以隻通告聚合後的路由,而不是將所有的具體路由都通告出去。
目前係統支持自動聚合和手動聚合方式。使用後者還可以控製聚合路由的屬性,以及決定是否發布具體路由。
BGP路由衰減(Route Dampening)用來解決路由不穩定的問題。路由不穩定的主要表現形式是路由振蕩(Route flaps),即路由表中的某條路由反複消失和重現。
發生路由振蕩時,路由協議就會向鄰居發布路由更新,收到更新報文的路由器需要重新計算路由並修改路由表。所以頻繁的路由振蕩會消耗大量的帶寬資源和CPU資源,嚴重時會影響到網絡的正常工作。
在多數情況下,BGP協議都應用於複雜的網絡環境中,路由變化十分頻繁。為了防止持續的路由振蕩帶來的不利影響,BGP使用衰減來抑製不穩定的路由。
BGP衰減使用懲罰值來衡量一條路由的穩定性,懲罰值越高則說明路由越不穩定。路由每發生一次振蕩(路由從激活狀態變為未激活狀態,稱為一次路由振蕩),BGP便會給此路由增加一定的懲罰值(1000,此數值為係統固定,不可修改)。當懲罰值超過抑製閾值時,此路由被抑製,不加入到路由表中,也不再向其他BGP對等體發布更新報文。
被抑製的路由每經過一段時間,懲罰值便會減少一半,這個時間稱為半衰期(Half-life)。當懲罰值降到再使用閾值時,此路由變為可用並被加入到路由表中,同時向其他BGP對等體發布更新報文。
圖12 BGP衰減示意圖
對等體組(Peer Group)是一些具有某些相同屬性的對等體的集合。當一個對等體加入對等體組中時,此對等體將獲得與所在對等體組相同的配置。當對等體組的配置改變時,組內成員的配置也相應改變。
在大型BGP網絡中,對等體的數量會很多,其中很多對等體具有相同的策略,在配置時會重複使用一些命令,利用對等體組在很多情況下可以簡化配置。
將對等體加入對等體組中,對等體與對等體組具有相同的路由更新策略,提高了路由發布效率。
對等體組可以使一組對等體共享相同的策略,而利用團體可以使多個AS中的一組BGP路由器共享相同的策略。團體是一個路由屬性,在BGP對等體之間傳播,它並不受到AS範圍的限製。
BGP路由器在將帶有團體屬性的路由發布給其它對等體之前,可以改變此路由原有的團體屬性。
除了使用公認的團體屬性外,用戶還可以使用團體屬性列表自定義擴展團體屬性,以便更為靈活地控製路由策略。
為保證IBGP對等體之間的連通性,需要在IBGP對等體之間建立全連接關係。假設在一個AS內部有n台路由器,那麼應該建立的IBGP連接數就為n(n-1)/2。當IBGP對等體數目很多時,對網絡資源和CPU資源的消耗都很大。
利用路由反射可以解決這一問題。在一個AS內,其中一台路由器作為路由反射器RR(Route Reflector),其它路由器作為客戶機(Client)與路由反射器之間建立IBGP連接。路由反射器在客戶機之間傳遞(反射)路由信息,而客戶機之間不需要建立BGP連接。
既不是反射器也不是客戶機的BGP路由器被稱為非客戶機(Non-Client)。非客戶機與路由反射器之間,以及所有的非客戶機之間仍然必須建立全連接關係。如圖13所示。
路由反射器和它的客戶機組成了一個集群(Cluster)。某些情況下,為了增加網絡的可靠性和防止單點故障,可以在一個集群中配置一個以上的路由反射器。這時,位於相同集群中的每個路由反射器都要配置相同的Cluster_ID,以避免路由循環。如圖14所示。
在某些網絡中,路由反射器的客戶機之間已經建立了全連接,它們可以直接交換路由信息,此時客戶機到客戶機之間的路由反射是沒有必要的,而且還占用帶寬資源。目前,係統支持配置相關命令來禁止在客戶機之間反射路由。
& 說明:
禁止客戶機之間的路由反射後,客戶機到非客戶機之間的路由仍然可以被反射。
聯盟(Confederation)是處理AS內部的IBGP網絡連接激增的另一種方法,它將一個自治係統劃分為若幹個子自治係統,每個子自治係統內部的IBGP對等體建立全連接關係,子自治係統之間建立聯盟內部EBGP連接關係。如圖15所示。
在不屬於聯盟的BGP發言者看來,屬於同一個聯盟的多個子自治係統是一個整體,外界不需要了解內部的子自治係統情況,聯盟ID就是標識聯盟這一整體的自治係統號,如圖15中的AS 200就是聯盟ID。
聯盟的缺陷是:從非聯盟方案向聯盟方案轉變時,要求路由器重新進行配置,邏輯拓撲也要改變。
在大型BGP網絡中,路由反射器和聯盟可以被同時使用。
基於BGP的GR Restarter為了與BGP對等體建立一個BGP會話連接,首先要發送一個包含了GR能力的OPEN消息到對端,BGP對等體收到該消息後,得知發送方已具有GR能力。這樣,通過OPEN消息交互GR能力,GR Restarter與其BGP對等體之間協商建立起GR Session連接。如果雙方都沒有交換GR能力的信息,建立起的會話也就不具備GR能力。
對於分布式設備,當進行主備倒換時,會話項將丟失,此時具備GR感知能力的BGP對等體會將所有與該GR Restarter有關的路由進行失效標記。但在GR Time內仍按照這些路由進行報文轉發,這樣確保了在從BGP對等體重新收集路由信息的過程中沒有報文丟失。
對於分布式設備,主備倒換後,GR Restarter會重新與BGP對等體建立GR Session連接,同時發送新的GR消息以宣告其重啟完畢。此時兩個BGP對等體間進行路由信息交換。交換完成後,GR Restarter根據新的路由轉發信息更新路由表和轉發表,刪除失效的路由,完成BGP協議收斂。
傳統的BGP-4隻能管理IPv4單播路由信息,對於使用其它網絡層協議(如IPv6等)的應用,在跨自治係統傳播時就受到一定限製。
為了提供對多種網絡層協議的支持,IETF對BGP-4進行了擴展,形成MP-BGP,目前的MP-BGP標準是RFC 4760(Multiprotocol Extensions for BGP-4,BGP-4的多協議擴展)。
支持BGP擴展的路由器與不支持BGP擴展的路由器可以互通。
BGP-4使用的報文中,與IPv4地址格式相關的三條信息都由Update報文攜帶,這三條信息分別是:NLRI、路徑屬性中的NEXT_HOP、路徑屬性中的AGGREGATOR(該屬性中包含形成聚合路由的BGP發言者的IP地址)。
為實現對多種網絡層協議的支持,BGP-4需要將網絡層協議的信息反映到NLRI及NEXT_HOP。MP-BGP中引入了兩個新的路徑屬性:
l MP_REACH_NLRI:Multiprotocol Reachable NLRI,多協議可達NLRI。用於發布可達路由及下一跳信息。
l MP_UNREACH_NLRI:Multiprotocol Unreachable NLRI,多協議不可達NLRI。用於撤銷不可達路由。
這兩種屬性都是可選非過渡(Optional non-transitive)的,因此,不提供多協議能力的BGP發言者將忽略這兩個屬性的信息,不把它們傳遞給其它鄰居。
MP-BGP采用地址族(Address Family)來區分不同的網絡層協議,關於地址族的一些取值可以參考RFC 1700(Assigned Numbers)。目前,係統實現了多種MP-BGP擴展應用,包括對VPN的擴展、對IPv6的擴展等。