人人都想了解的BGP,路由策略這樣處理
作者簡介:肖宏輝,畢業于中科院研究生院,8年的工作經驗,其中6年云計算開發經驗,OpenStack社區積極活躍,有超過300個commit和超過30000行代碼的貢獻。目前關注SDN/NFV等虛擬網絡技術。本文所有觀點僅代表作者個人觀點,與作者現在或者之前所在的公司無關。
路由協議,套用IT里面的術語,實際上就是分布式數據庫系統,它包含了節點間的數據傳遞和節點內的數據處理。對于BGP來說,節點間基于TCP(端口179)的連接,在這個基礎上,可以構建AS間的EBGP,AS內的IBGP,IBGP有full mesh,BGP路由反射器等,這些都是BGP節點之間的連接方式,這次看看BGP router內部是如何處理數據。
BGP是一種path vector路由協議,對比其他類的路由協議,path vector隨路由攜帶的輔助信息更多,處理也稍微復雜一些。BGP內部處理流程簡單的畫了一下,如下所示,各家的實際實現可能略有不同,但應該大同小異。

在看這個處理流程前,先看看一些相關概念。
Path Attribute(PA)
Path對應的就是route,那顧名思義,這是BGP Route的一些參數屬性。Path Attribute是BGP的基礎組成元素,它貫穿了整個BGP 路由處理的過程。
首先,BGP節點間傳遞的BGP message就是由NLRI(Network Layer Reachability Information)和PA組成。這個可以從BGP Update Message看出來。如果只考慮IP路由,那么NLRI就是IP prefix。

其次,BGP policy engine的處理是圍繞著Path Attribute展開的。第三,BGP best path selection,是根據PA做的算法。
Path attribute分為4類:
- Well-known Mandatory: 所有的BGP router必須識別這個屬性,并且所有的BGP Message必須包含這個屬性
- Well-known Discretionary: 所有的BGP router必須識別這個屬性,BGP Message可以不包含這個屬性
- Optional Transitive: BGP router可以不識別這個屬性,如果不識別直接無視這個屬性
- Optional Non-transitive: BGP router可以不識別這個屬性,如果不識別要將這條BGP Message丟棄
常見的BGP Path Attribute如下表所示:

這里NEXT_HOP也屬于Path Attribute,BGP處理過程中可以修改NEXT_HOP。EBGP router默認會修改NEXT_HOP為自己,IBGP router默認不會修改NEXT_HOP,這在上一篇講過。
Routing Information Base(RIB)
RIB其實是設備商的術語?;蛟S不太恰當,但是Global RIB可以對應操作系統里面的路由表。Global RIB和路由表都決定IP packet的三層轉發的路徑。RIB除了存放路由條目,還保存一些路由協議相關的輔助信息。除了Global RIB,每個路由協議都有自己的RIB,這樣,路由協議可以將一些生(Raw)數據與真正應用的數據進行隔離。BGP維護幾個RIB,包括了:
- BGP Adjacent In RIB:保存所有接收到的BGP Message,這里可能存在多條BGP Message指向同一個目的IP prefix
- BGP Local RIB:保存經過處理和運算得到的***BGP Message,對于同一個目的IP prefix,只存在一條***的BGP Message
- BGP Adjacent out RIB:保存將要發送給BGP Peer的BGP Message
BGP協議收發的數據不會直接寫到Global RIB里,而是放到了BGP自己的RIB里面,在適當的時候寫入Global RIB,前面說過,這樣可以實現數據隔離,有選擇的將BGP數據寫入主路由表。BGP的三個RIB保存著不同處理階段的BGP Message,為不同階段的操作提供數據。接下來過一下BGP路由處理過程。
Route Processing
1. BGP Adjacent in RIB

這一步比較簡單,來者不拒,所有收到的BGP Message都存到了BGP Adjacent in RIB
2.Input Policy

nput policy會完成兩部分工作,filtering和manipulation。
Filtering會根據Path Attribute過濾BGP Message,這里需要注意兩個內置的過濾,一個是判斷當前的AS是否在BGP Message的AS_PATH中,如果在的話,那么這是一條之前已經經過當前AS的Message,這條Message會被過濾。另一個會判斷BGP Message里的NEXT_HOP是否可達,如果不可達,那么這條Message會被標成Invalid,也會被過濾。除了內置的過濾,用戶(對,就是網工)和控制程序也可以添加過濾規則,例如通過route-map,access-list,distribution-list等。
Manipulation會修改BGP Message的Path Attribute,這樣可以控制后面的步驟,例如Best path selection。舉個例子,BGP Router從兩個鄰居收到同一個IP Prefix的BGP Message,那么可以通過修改某一個鄰居的BGP Message的PA,使得其中一條BGP Message在下一步中勝出。
3.Best path Selection

Local Route是本地的并且希望通過從BGP發布出去的路由。例如思科的設備,通過network命令可以發布本地路由,也可以通過redistribution,將IGP的路由重分布到BGP。這些Local Route都將轉換成了BGP Message,和經過Input policy過濾和修改過的BGP Message,一起參與Best Path Selection。
Best Path Selection是一個根據Path Attribute運算,從指向同一個目的IP prefix的,多條BGP Message中選出一條***的過程。這個過程不復雜,但是比較繁瑣,相應的介紹也很多了,限于篇幅我就不展開了,感興趣可以看看思科的文檔BGP Best Path Selection Algorithm。
4.BGP Local RIB

Best Path Selection能確保指向同一個IP prefix只有一條(其實也可以多條,取決于multipath)***的BGP Message,這些BGP Message會存到BGP Local RIB。接下來的處理會分兩條路徑。
***個是寫入到Global RIB,也就是全局路由表。當路由器中,沒有其他的路由協議生成了指向相同目的IP prefix的路由,或者有的話,該路由協議的Administrative Distance(AD)大于BGP的AD值,那么這個時候BGP Local RIB的路由才會寫入到Global RIB。EBGP的AD值是20,小于大部分路由協議,IBGP的AD值是200,大于大部分路由協議。
第二個是輸出到Output Policy,進而發往其他的BGP Peer。
這兩個路徑互不影響,就算BGP沒有競爭過其他路由協議,沒有將路由寫到全局路由表,也不影響路由傳遞給其他的BGP Peer。
5.Output Policy

與Input Policy類似,這里也做filtering和manipulation。
Filtering會根據Path Attribute過濾BGP Message,可以自己定義,也有BGP程序自帶的過濾。還是以AS_PATH為例,如果目的BGP Peer的AS在BGP Message的AS_PATH中,那么這條BGP Message不會生成對應的發往該BGP Peer的BGP Message。
Manipulation會修改BGP Message的Path Attribute,例如修改MED值,進而生成發往BGP Peer的BGP Message。
經過Output Policy之后,一條BGP Message,會生成針對每一個可以送達的BGP Peer的,多條BGP Message。雖然來自同一個BGP Message,但是這里的每個BGP Message里面包含的Path Attribute可能因為定義策略不一樣。
6.BGP Adjacent out RIB
類似于***步,這部分也簡單,生成好的BGP Message發往對端的BGP Peer。
***
以上就是BGP路由處理過程,可以看出都是圍繞Path Attribute。如果說BGP基于TCP傳輸,給BGP router間的傳輸帶來可靠性,那么Path Attribute給BGP的應用帶來了靈活性。