1.BGP
邊界閘道器協議(Border Gateway Protocol,BGP)是一種用來在路由選擇域之間交換網路層可達性資訊(Network Layer Reachability Information,NLRI)的路由選擇協議。由於不同的管理機構分別控制著他們各自的路由選擇域,因此,路由選擇域經常被稱為自治系統AS(Autonomous System)。現在的Internet是一個由多個自治系統相互連線構成的大網路,BGP作為事實上的Internet外部路由協議標準,被廣泛應用於ISP(Internet Service Provider)之間。
從一開始,BGP就被設計成一種域間路由選擇協議,其設計目標就是策略控制能力和可擴充套件性。但是,BGP也不適合替代IGP,因為它們適用的場景不同。
BGP有兩種執行方式,如下圖所示,當BGP執行於同一AS內部時,被稱為IBGP(Internel BGP,內部邊界閘道器協議);當BGP執行於不同AS之間時,稱為EBGP(Externel BGP,外部邊界閘道器協議)。
2.工作過程
2.1 BGP中的角色
Speaker:傳送BGP報文的路由裝置稱為BGP發言者(Speaker),它接收或產生新的路由資訊,併發布(Advertise)給其它BGP Speaker。當BGP Speaker收到來自其它AS的新路由時,如果該路由比當前已知路由更優、或者當前還沒有該路由,它就把這條路由釋出給所有其他BGP Speaker(釋出該路由的BGP Speaker除外)。
Peer:相互交換報文的BGP Speaker之間互稱對等體(Peer)。
2.2 BGP的報文
BGP的執行是透過報文驅動的,共有Open、Update、Notification、Keepalive、Route-refresh和Capability六種報文型別。
- Open報文:是TCP連線建立後傳送的第一個報文,用於建立BGP對等體之間的連線關係。對等體在接收到Open報文並協商成功後,將傳送Keepalive報文確認並保持連線的有效性。確認後,對等體間可以進行Update、Notification、Keepalive和Route-refresh報文的交換。
- Update報文:用於在對等體之間交換路由資訊。Update報文可以釋出多條屬性相同的可達路由資訊,也可以撤銷多條不可達路由資訊。
- Notification報文:當BGP檢測到錯誤狀態時,就向對等體發出Notification報文,之後BGP連線會立即中斷。
- Keepalive報文:BGP會週期性地向對等體發出Keepalive報文,用來保持連線的有效性。
- Route-refresh報文:Route-refresh報文用來請求對等體重新傳送所有的可達路由資訊。
- Capability報文:用於在一個已經建立的BGP會話基礎上動態更新對等體的能力,可保證已有對等體連線不中斷。
2.3 BGP處理過程
如下圖所示,BGP的傳輸層協議是TCP協議,所以在BGP對等體建立之前,對等體之間首先進行TCP連線。BGP鄰居間會透過Open報文協商相關引數,建立起BGP對等體關係。建立連線後,BGP鄰居之間交換整個BGP路由表。BGP會傳送Keepalive報文來維持鄰居間的BGP連線,BGP協議不會定期更新路由表,但當BGP路由發生變化時,會透過Update報文增量地更新路由表。當BGP檢測到網路中的錯誤狀態時(例如收到錯誤報文時),BGP會傳送Notification報文進行報錯,BGP連線會隨即中斷。
2.4BGP有限狀態機
BGP有限狀態機共有六種狀態,分別是Idle、Connect、Active、Open-Sent、Open-Confirm和Established。
在BGP對等體建立的過程中,通常可見的三個狀態是:Idle、Active、Established。
Idle狀態下,BGP拒絕任何進入的連線請求,是BGP初始狀態。
Connect狀態下,BGP等待TCP連線的建立完成後再決定後續操作。
Active狀態下,BGP將嘗試進行TCP連線的建立,是BGP的中間狀態。
Open-Sent狀態下,BGP等待對等體的Open報文。
Open-Confirm狀態下,BGP等待一個Notification報文或Keepalive報文。
Established狀態下,BGP對等體間可以交換Update報文、Route-refresh報文、Keepalive報文和Notification報文
BGP對等體雙方的狀態必須都為Established,BGP鄰居關係才能成立,雙方透過Update報文交換路由資訊。
2.4BGP屬性
BGP屬性
BGP路由屬性是一套引數,它對特定的路由進一步的描述,使得BGP能夠對路由進行過濾和選擇。事實上,所有的BGP路由屬性都可以分為以下4類:
公認必須遵循的(Well-known mandatory):所有BGP裝置都可以識別,且必須存在於Update報文中。如果缺少這種屬性,路由資訊就會出錯。
公認任意(Well-known discretionary):所有BGP裝置都可以識別,但不要求必須存在於Update報文中,可以根據具體情況來選擇。
可選過渡(Optional transitive):在AS之間具有可傳遞性的屬性。BGP裝置可以不支援此屬性,但它仍然會接收這類屬性,並通告給其他對等體。
可選非過渡(Optional non-transitive):如果BGP裝置不支援此屬性,則相應的這類屬性會被忽略,且不會通告給其他對等體。
下面介紹幾種常用的BGP路由屬性:
Origin屬性,屬於公認必須遵循屬性,用來定義路徑資訊的來源,標記一條路由是怎麼成為BGP路由的,包含IGP、EGP和Incomplete三種型別。
AS_Path屬性,屬於公認必須遵循屬性,按向量順序記錄了某條路由從本地到目的地址所要經過的所有AS編號。
Next_Hop屬性,屬於公認必須遵循屬性。
MED,屬於可選非過渡屬性,MED(Multi-Exit-Discriminator)屬性僅在相鄰兩個AS之間傳遞,收到此屬性的AS一方不會再將其通告給任何其他第三方AS。
Local_Pref屬性,屬於公認任意屬性,僅在IBGP對等體之間有效,不通告給其他AS,用於表明路由裝置的BGP優先順序。
3.BGP對路由的處理
BGP對路由的處理如下圖所示。BGP路由來源包括從其他協議引入和從鄰居學習兩個部分,為了減少路由規模,可以對優選的BGP路由進行聚合。在引入路由、從鄰居接收或傳送路由的過程中,可以透過路由策略實現對路由的過濾,也可以修改路由的屬性。
3.1路由引入
BGP協議自身不能發現路由,所以需要引入其他協議的路由(如IGP或者靜態路由等)注入到BGP路由表中,從而將這些路由在AS之內和AS之間傳播。
BGP引入路由時支援Import和Network兩種方式:
- Import方式是按協議型別,將RIP路由、OSPF路由、IS-IS路由、靜態路由和直連路由等某一協議的路由注入到BGP路由表中。
- Network方式比Import方式更精確,將指定字首和掩碼的一條路由注入到BGP路由表中。
Import和Network兩種方式均可以透過路由策略實現對路由的過濾及屬性的修改,將透過路由策略過濾且修改屬性後的路由注入到BGP路由表中。
Network方式逐條精確匹配路由
Network方式優先順序高
Import方式按協議型別引入路由
3.2路由選擇
當到達同一目的地存在多條路由時,BGP採取路由選擇策略進行路由選擇,例如優選沒有迭代到Graceful Down(該SRv6 TE-Policy處於延遲刪除狀態)的SRv6 TE-Policy的路由、在與RPKI(Resource Public Key Infrastructure)伺服器進行連線的情景中,應用起源AS驗證結果後的BGP路由優先順序順序為Valid > NotFound > Invalid、優選沒有誤碼的路由等。
3.3路由聚合
在大規模的網路中,BGP路由表十分龐大,使用路由聚合(Routes Aggregation)可以大大減小路由表的規模。
路由聚合實際上是將多條路由合併的過程。這樣BGP在向對等體通告路由時,可以只通告聚合後的路由,而不是通告所有的具體路由。
BGP路由聚合支援兩種方式:
自動聚合:對BGP引入的路由進行聚合。配置自動聚合後,對參加聚合的具體路由進行抑制。配置自動聚合後,BGP將按照自然網段聚合路由(如10.1.1.1/32和10.2.1.1/32將聚合為A類地址10.0.0.0/8),並且BGP向對等體只傳送聚合後的路由。
手動聚合:對BGP本地路由進行聚合。手動聚合可以控制聚合路由的屬性,以及決定是否釋出具體路由。
IPv4支援自動聚合和手動聚合兩種方式,而IPv6僅支援手動聚合。
3.4BGP釋出路由
BGP釋出路由時採用如下策略:
存在多條有效路由時,BGP Speaker只將最優路由釋出給對等體。
BGP Speaker從EBGP獲得的路由會向它所有BGP對等體釋出(包括EBGP對等體和IBGP對等體)。
BGP Speaker從IBGP獲得的路由不向它的IBGP對等體釋出。
BGP Speaker從IBGP獲得的路由是否通告給它的EBGP對等體要依據IGP和BGP同步的情況。
連線一旦建立,BGP Speaker將把自己可釋出的BGP最優路由釋出給新對等體。