李 駿,曹 敏
(1.武漢郵電科學研究院,湖北武漢 430074; 2.武漢烽火網絡有限責任公司,湖北武漢 430074)
多協議標簽交換技術[1](MPLS-Multiprotocol Label Switching)屬于第三代網絡架構,是新一代IP高速骨干網絡交換的標準。現在各大運營商用MPLS技術承載骨干網的VPN業務,對網絡可靠性有很高的要求,實時業務的恢復時間要求是50ms以內,因此,滿足恢復時間要求的基于MPLS的故障恢復方法引起了人們的關注。
現有的MPLS故障恢復模型有很多,如Haskin[2]、Makam[3]等,基于這些模型,人們也提出了許多改進,為了滿足恢復時間的要求,一般采用快速重路由方式進行保護,即在故障之前建立備份路徑,故障發生時直接切換到備份路徑的保護方式,本地保護具有較短的故障發現時間,是理想的保護方式。基于LFA(Loop Free Alternate無環)的IP FRR[4]的標準已經出臺了幾年,而IP FRR已經被許多廠商實現,本文提出一種基于IP FRR的MPLS快速重路由簡單軟件實現方法,有效地保護MPLS流量。詳細介紹了信令模塊——LDP[5]模塊和路由協議模塊以及MPLS模塊的交互和處理方式,并對典型的MPLS網絡進行組網測試,以驗證該實現的可行性。

圖1 系統模塊間關系圖
圖1所示為組成系統的各模塊之間關系圖。
(1)路由模塊即實現路由協議功能的模塊,該模塊實現了IP FRR功能,在計算主用路由的同時,還會根據LFA計算該路由的備份路由;根據不同的實現,使能了IP FRR的路由模塊通告的路由信息可能有兩類,一類是路由信息中有專門標識主用路由和備用路由的標志(例如專門設置標志位,表明通告的是主用路由還是備用路由),另一類是沒有專門標志的(例如主用和備用路由通過cost路由屬性區分,cost即開銷,開銷小的為主用,開銷大的為備用),本文的實現基于第二類路由信息,信息主要包括目的網段D,下一跳NH,出接口I和開銷C。
(2)LDP模塊,LDP協議是MPLS的信令協議,管理標簽的分發與回收,LDP模塊實現LDP協議的功能,標簽信息主要有FEC(轉發等價類,在本文中指路由協議中的目的網段),入標簽IN和出標簽OUT,下一跳NH’,出接口I’,本文中LDP模塊工作于自由標簽保留模式。
(3)MPLS模塊,實現標簽交換的模塊,根據LDP模塊通告的標簽信息,生成轉發表項,主要表項有ILM、NHLFE、FTN[6]。
(4)故障檢測模塊,實現快速檢測故障的功能,本文使用BFD(雙向轉發檢測),故障信息主要包括故障接口。
本文中MPLS的重路由路徑與IP FRR的路徑是完全相同的,所以保護性能和IP FRR一樣。
如圖2所示,交換機A到達3.3.3.3有兩條路由,下一跳分別為10.1.1.2和10.1.2.2,設前者cost為5后者為10,則前者為主用路由后者為備用。LDP模塊工作于自由標簽保留模式,因此,交換機A既保留C發送的關于3.3.3.3的標簽L1也會保留B發送的關于3.3.3.3的標簽L2,按照之后描述的LDP模塊和MPLS模塊處理方式,LDP模塊會把標簽信息通告給MPLS模塊,使得MPLS模塊使用L1作為主用標簽,L2為備用(C是主用路由的下一跳,B是備用路由的下一跳)。故障前使用L1轉發,故障后,MPLS收到BFD模塊的故障通告,使用L2轉發MPLS流量到B,B發現是自己為3.3.3.3分配的標簽L2,按照從B到C的主LSP進行轉發,故障恢復后,LDP模塊根據路由模塊的通告決定繼續使用L2作為主用標簽,還是使用新的標簽。
LDP模塊只需擴展與路由模塊的接口(在下面介紹)和與故障檢測模塊的接口(接收故障消息即可),其它的協議流程處理,如會話建立和標簽分配不變。
路由協議模塊通告的路由信息要么是添加路由信息,要么是刪除路由信息,主備通過路由信息里的cost字段區分,cost小為主用,cost大為備用,所以LDP模塊跟路由協議模塊的交互由對路由添加和路由刪除這兩種事件的處理來描述。路由協議通告路由消息有5種情況(D表示某個目的網段):

(1)之前沒有通告過關于D的路由添加消息,現在通告關于D的路由添加消息給LDP模塊;
(2)在通告關于D的路由刪除消息前,LDP模塊中只有一條關于D的路由記錄,現在通告關于D的路由刪除消息;
(3)主用和備用路由已經通告,現在通告關于D的備份路由刪除消息,然后再通告關于D的備份路由添加消息;
(4)主用和備用路由已經通告,現在通告關于D的主用路由刪除消息,然后再通告關于D的主用路由添加消息;
(5)主用和備用路由已經通告,現在通告關于D的主用路由刪除消息,然后再通告關于D的備用路由添加消息。

這里的主備并沒有標識,只通過cost值區分。
上面的這5種情況是在網絡拓撲改變的情況下,使能IP FRR的路由協議根據計算得到主備路由并通告給LDP模塊的情況,根據這些情況,設計出LDP模塊對路由添加和路由刪除事件處理流程圖如下,圖3和圖4分別為路由添加消息和刪除消息的處理流程(這兩個流程圖可以正確處理上述的5種情況):
(1)FEC_RT變量記錄了與FEC相關的信息,包括路由信息和標簽信息,route_list是FEC_RT變量中的一個鏈表頭,所有關于FEC的路由(主用和所有備用)信息,都存在該表中,鏈表根據路由信息中的cost屬性從小到大排序(路由協議可能會通告若干關于某個目的網段但cost相等的路由,即ECMP,這時,需要選擇鏈表添加方式,使得若鏈表中存在某個cost值的表項,新加的cost值相同的表項在原來表項的后面),這樣,主用路由總是為鏈表頭結點;
(2)FEC_RT->nexthop,指明主用路由的下一跳,每次收到路由添加或刪除消息時,若route_list的頭結點發生變化,則修改該值以保證該值為當前主用路由的下一跳,發生故障時,該值在LDP的標簽分發流程中會被用到(可參見RFC5036中的A.1.1,A.1.2等),FEC_RT->if_unit是對應于nexthop的出接口,它與nexthop同時修改,故障時,BFD模塊發送故障通告,包含接口信息,對于某個FEC_RT,若if_unit等于通告的值,則該FEC_RT的route_list的頭結點被加入到鏈表尾,第二的節點成為頭結點,這一點與之后描述的MPLS模塊中的處理方式對應;
(3)記錄被添加到FEC_RT-> need_label_from_peer鏈表中,添加記錄是應對收到路由添加通告時,還沒有收到對應peer關于FEC的標簽的情況,當收到某個peer的標簽信息時,查找記錄,記錄存在,則封裝標簽信息通告MPLS模塊,并刪除該記錄,在收到peer的標簽信息之前,如果收到路由模塊的相應路由刪除消息時也刪除該記錄。
流程圖中一些數據結構:
(1)FEC_RT變量的結構類型
sLdpFecRt{
PREFIX route; //路由消息中的目的網段
SOCK_IN_ADDR nexthop; //主用路由的下一跳
UINT4 if_unit; //主用路由的出接口
struct sLdpLblMap *local_label_map; //本地分配的標簽
struct tree remoteLblMapAvl; //peers為該FEC分配的標簽
struct list route_list; //路由信息鏈表
struct list need_label_from_peer; //需要來自peer的標簽記錄鏈表
}tLdpFecRt;
(2) route_list中的節點
sLdpFecRouteInfo{
SOCK_IN_ADDR nexthop; //路由信息中的下一跳
UINT4 if_unit; //路由信息中的出接口
UINT4 cost; //路由信息中的開銷屬性
struct sLdpLblMap * label_map; //nexthop對應peer分配的標簽
};
(3)封裝的標簽信息
sLdpLabelInfo{
PREFIX route; //目的網段即FEC
SOCK_IN_ADDR nexthop; //標簽對應的下一跳
UINT4 if_unit;//標簽對應的出接口
UINT4 cost; //路由信息中的開銷屬性
struct sLdpLblMap * inlabel; //本地分配的標簽
struct sLdpLblMap * outlabel; //peer分配的標簽
};
MPLS模塊原來的表項是,一個ILM對應一個NHLFE,表項通過處理LDP模塊通告的標簽信息得到,擴展支持快速重路由可以仿照LDP模塊中的route_list方式,即一個ILM對應一個NHLFE鏈表,在NHLFE中添加cost字段保存sLdpLabelInfo中的cost信息,鏈表按cost值從小到大排序,對于ECMP也采用LDP模塊中的處理方式,減少路勁切換,主用轉發條目始終為鏈表的頭結點,這樣,當一個打了標簽的MPLS包送到MPLS模塊,根據標簽找到ILM表項,ILM表項對應一個NHLFE鏈表,使用這個鏈表的頭節點指示的方式進行標簽操作(交換標簽、壓入標簽),然后繼續轉發。
當發生故障時,BFD模塊通告故障信息給MPLS模塊,信息中包含故障對應的接口,所有以該接口為出接口的主用NHLFE將被替換,替換方式是把主用NHLFE加入到NHLFE鏈表的尾部,原來的第二個表節點自動成為頭結點,作為主用轉發條目。為了降低故障恢復時間,需要為每一個接口建立一個鏈表,主用NHLFE條目的出接口是該接口的條目所在的鏈表頭(route_list)作為該鏈表的節點,這樣,發生故障時,不用遍歷所有的NHLFE鏈表,只用對該故障對應接口的鏈表中的每一個route_list做替換即可,減少完成所有替換的時間,從而減少故障恢復時間。
MPLS模塊收到刪除的標簽信息時,根據route和nexthop兩個字段即可找到NHLFE節點,刪除即可。
圖5為測試用拓撲圖,A、B、C為交換機,接口配置在圖上標明,儀表從I1接口發送不帶MPLS標簽的流量,經過中間的環形MPLS網絡,由I2接口接收,發流的速率為100Mbps,包長為1024Bytes。測試時,在交換機A上經過路由協議計算,得到到達接口I2的主用路由下一跳是C,備用路由下一跳為B,拔掉AC之間的網線以模擬故障,在此期間,儀表統計得到的丟包數為728個,之后重復測試5次得到的丟包數為688、701、715、734、690。下面估計一下故障恢復時間:
發包速率為100Mbps/1024Bytes = 12800Packets/s,那么每10ms應該發送128個包,計算6次測試的平均丟包數為709,709/128的值在5和6之間,即恢復時間在50ms到60ms之間。

本文給出了一種基于IP FRR的MPLS快速重路由的軟件實現方法,以流程圖的方式說明了LDP模塊對路由消息的處理過程,給出了關鍵表節點的定義,給出以鏈表來組織MPLS的轉發表項的思路,最后組網驗證該設計的可行性,結果表明MPLS流只中斷了50ms到60ms,該設計具有故障恢復功能,對實現基于IP FRR的MPLS快速重路由有一定參考價值。
[1] 華為3com公司.網絡之路N03MPLS技術專刊[DB/OL].
[2] D. Haskin,R.Krishnan. A Method for Setting an Alternative Label Switched Paths to Handle Fast Reroute. draft-haskin-mpls-fast-reroute-05.txt,2000.
[3] S. Makam,V.Sharma,et al. Protection/Restoration of MPLS Networks. draft-makam-mplsprotection-00.txt,1999.
[4] A. Atlas,A. Zinin. Basic Specification for IP Fast Reroute: Loop-Free Alternates[S]. RFC5286,2008.
[5] L. Andersson , I. Minei, B. Thomas. LDP Specification[S]. RFC 5036,2007.
[6] E. Rosen,A. Viswanathan,R. Callon. Multiprotocol Label Switching Architecture[S].RFC 3031,2001.