在使用BGP路由協議的網絡中,為保證IBGP對等體之間的連通性,需要在IBGP對等體之間建立全連接關系。假設在一個AS內部有n台路由器,那么應該建立的IBGP連接數就為n(n-1)/2.當IBGP對等體數目很多時,對網絡資源和CPU資源的消耗都很大。
一、路由反射器的定義
利用路由反射可以解決這一問題。在一個AS內,其中一台路由器作為路由反射器RR(Route Reflector),其它路由器做為客戶機(Client)。客戶機與路由反射器之間建立IBGP連接。路由反射器和它的客戶機組成一個集群(Cluster)。路由反射器在客戶機之間傳遞(反射)路由信息,而客戶機之間不需要建立BGP連接。
既不是反射器也不是客戶機的BGP路由器被稱為非客戶機(Non-Client)。非客戶機與路由反射器之間,以及所有的非客戶機之間仍然必須建立全連接關系。如下圖所示。
二、路由反射器的工作步驟
當RR收到IBGP發來的路由,首先使用BGP選擇路由的策略選擇最佳路由。在公布學習到的路由信息時,RR按照RFC2796中的規則發布路由:
1)從非客戶機IBGP對等體學到的路由,發布給此RR的所有客戶機。
2)從客戶機學到的路由,發布給此RR的所有非客戶機和客戶機(發起此路由的客戶機除外)。
3)從EBGP對等體學到的路由,發布給所有的非客戶機和客戶機。
RR的一個好處就是配置方便,因為只需要在反射器上配置,客戶機不需要知道自己是客戶機。
三、Originator_ID
RFC2796定義了Originator_ID屬性和Cluster_List屬性,用於檢測和防止路由環路。
Originator_ID屬性長4字節,是由路由反射器(RR)產生的,攜帶了本地AS內部路由發起者的Router ID.
1)當一條路由第一次被RR反射的時候,RR將Originator_ID屬性加入這條路由,標識這條路由的發起路由器。如果一條路由中已經存在了Originator_ID屬性,則RR將不會創建新的Originator_ID.
2)當其它BGP Speaker接收到這條路由的時候,將比較收到的Originator_ID和本地的Router ID,如果兩個ID相同,BGP Speaker會忽略掉這條路由,不做處理。
Originator_ID屬性保證路由在反射器和客戶機/非客戶機之間的不出現循環。
四、Cluster_List
對於AS之間,BGP用於防止環路的主要措施是通過AS_Path屬性記錄途經的AS路徑,帶有本地AS號的路由將被路由器丟棄;對於AS之內,BGP防止路由環路的方法是禁止IBGP對等體發布從AS內部學來的路由。
路由反射器的實現是基於放寬對"BGP在AS內學到的路由不會在AS中轉發"的要求,即允許IBGP對等體之間發布從AS內部學來的路由。在這種情況下,Cluster_List屬性被引入,用於防止AS內部的環路。
Cluster_List由一系列的Cluster_ID組成,描述了一條路由所經過的反射器路徑,這和描述路由經過的As路徑的AS_Path屬性有相似之處。Cluster_List由路由反射器產生。
1)當RR在它的客戶機之間或客戶機與非客戶機之間反射路由時,RR會把本地Cluster_ID添加到Cluster_List的前面。如果Cluster_List為空,RR就創建一個。
2)當RR接收到一條更新路由時,RR會檢查Cluster_List.如果Cluster_List中已經有本地Cluster_ID,丟棄該路由;如果沒有本地Cluster_ID,將其加入Cluster_List,然后反射該更新路由。
為了保證客戶機可以學習到反射器發來的路由,Cluster_ID不能和客戶機的Router ID相同。如果相同,客戶機會將收到的路由丟棄。Cluster_List只在AS內部傳播,從EBGP對等體收到的含有Cluster_List的路由將被丟棄。