楊秋航
(武漢郵電科學研究院,湖北 武漢 430074)
SR-MPLS 的出現,引入了源路由的思想,被一致認為是IP 領域最重要的突破技術[1]。隨著云網融合的逐步推進以及IPv6 的廣泛部署,這一思想滲入到IP 地址中,考慮到可以充分利用IPv6 原生的擴展頭機制[2],使用IPv6 地址本身作為Segment 標識,通過在IPv6 報文頭和凈荷之間插入SRH 的方式實現源路由路徑信息的編碼[3],極大地增強了SRv6 技術的擴展性和部署的靈活性[4],支持網絡可編程,充分發揮了SDN 的能力[5],這也賦予SRv6 技術未來豐富的想象空間。
該文主要研究SRv6 的轉發平面,并提出新的轉發流程設計,使用烽火通信公司的設備進行實驗,來驗證該方案的完成度以及準確度,并總結該文方案的優點以及不足。
SRv6(基于IPv6 轉發平面的段路由)是基于源路由理念而設計的在網絡上轉發IPv6 數據包的一種協議。SRv6 通過在IPv6 報文中插入一個路由擴展頭SRH,在其中壓入一個顯式的IPv6 地址棧,利用中間節點不斷更新目的地址和偏移地址棧的操作來完成逐跳轉發[6]。SRv6 完全兼容現有IPv6 網絡,中間節點可以不支持SRv6,繼續按照正常路由轉發含有SRH 的IPv6 報文。同時SRv6 還可支持FRR 保護功能,在SRv6 技術的基礎上結合RLFA 算法,利用高效的TI-FLA 算法彌補傳統隧道保護技術的不足[7]。
IPv6 報文由IPv6 標準頭、擴展頭、負載組成,為實現SRv6 的轉發,新增加IPv6 擴展頭SRH 用于存儲IPv6 的Segment List 信息。標準SRv6 擴展頭SRH 的封裝格式如圖1 所示。

圖1 標準SRv6的擴展頭SRH的封裝格式
SRv6 擴展頭的封裝長度為IPv6 頭+SRH 固定頭+Segment List。因此隨著SID 封裝層數的增加,SRv6 擴展頭開銷也隨之增大,且由于報文長度的增加,其對硬件處理芯片的要求也隨之提高,而部分芯片由于封裝階段能力有限,導致最終出口報文的封裝出現SID 信息封裝不全的問題。
在SRv6 網絡中,節點角色大致分為三類:源節點、中間節點、尾節點[8]。
SRv6 源節點:網絡拓撲中的首站,封裝Segment List標簽棧。
中間節點/中轉節點:對SRv6 報文作轉發處理,但不作SRv6 相關處理。
尾節點:檢查報文的目標地址必須是本地配置的SID 或是本地的接口地址,若完成匹配則將整個標簽棧全部彈出。
如圖2 所示,在SRH 的處理中,SL 字段指向具體的SID 標簽,每經過一個SRv6 節點,SL 字段減1,在普通的IPv6 報文中,IPv6 DA 固定不變,而在SRv6 中IPv6 DA 僅表示當前報文的下一個節點,因此每經過一個節點,IPv6 DA 會根據SL 的指向做相應的變化[9],且無需將最外層SID標簽彈出(與SR-MPLS的區別),只需根據SL 字段的指向更新DA,繼續根據更新后的DA 做轉發 即可[10]。

圖2 SRv6轉發原理圖
SRv6 Segment為IPv6地址,長度為128 bit,主要由三部分組成,通常可簡單表示為Locator、Function、Arg[11]。
Locator 占據高比特位,具有定位功能,節點在配置Locator 后系統會生成一條Locator 網段路由,通過IGP 在SR 域內擴散。網絡里其他節點可通過Locator網段路由來定位該節點。
Function 表示設備指令,其中End 指令用于決定具體的終結動作,可根據具體業務需求來決定,如End.DT4用于IPv4網絡,End.DT6用于IPv6網絡等[12]。
Arg 參數占據低比特位,作為參數填充字段,可用于部分業務的特殊需求,比如SRv6 的防環,以及SRv6 的壓縮處理等,該字段的具體使用將在后文中進行具體介紹。
芯片對報文的轉發以流水線的方式進行處理,根據業務報文的轉發方向將報文的處理分為報文的封裝和解封裝。
現有的SRv6 報文封裝流程如圖3 所示。

圖3 現有SRv6報文封裝流程圖
在驅動轉發層面主要涉及以下幾個模塊。
AC 模塊:接入電路,是連接CE 與PE[13]的物理電路或虛擬電路,原始報文從AC 模塊正式進入網絡。需要獲取端口port 和AC 的Inlif(Ingress logical interface)和Outlif 值,在后續模塊中用于交叉連接以及流匹配處理的處理。
FLOW 模塊:基于AC 模塊中的port 和Inlif 值,設置報文入口方向的vlan,根據不同需求基于不同的流匹配規則區分不同業務報文入口的具體AC,這樣便可以確定CE 接收到的報文屬于哪一個特定的用戶網絡。
VC FEC 模塊:VC 轉發等價類,掛接需要封裝的最內層VPN SID 的相關信息。這里VC 以轉發等價類的形式出現主要是為了實現保護功能。
CROSS CONNECT 模塊:由兩條物理電路或虛擬電路串聯而成的一條連接,基于AC 的Inlif 和VC FEC 模塊中申請到的FEC ID 做交叉連接,完成UNI和NNI 之間的連接。
SRv6 TUNNEL 模塊:隧道轉發等價類,指向出接口,并掛接需要封裝的外層TXSID,即封裝需要攜帶的IP 地址信息。這里隧道同樣以轉發等價類的形式出現,同樣是為了作保護處理。
ARP 模塊:封裝業務出口的DMAC,以及業務的出口VLAN 封裝,但出口的這層vlan 并不是必要的,根據業務需求來決定。
RIF 模塊:與DMAC 的封裝相對應,封裝業務出口的SMAC。
TXSID 模塊:指定封裝的隧道標簽,同時指向封裝的目的mac 接口的相關信息。封裝的SID 層數可以根據需求來決定。
SRv6 不同于SR-MPLS 過站的處理,SRv6 不再需要彈出最外層標簽,僅根據暴露出的下一層SID標簽進行轉發即可,中間節點過站處理流程圖如圖4所示。

圖4 中間節點過站處理流程圖
RIF 模塊:對DMAC 進行檢查,當匹配上MACT表項時,則終結報文中的MAC 頭,暴露出報文后面的IPv6 DA 信息。
VSI CONNECT VRF 模塊:從RIF 獲取到綁定的VSI 信息,通過該VSI 信息找到對應的VRF 信息。
ROUTE 模塊功能描述:根據從VSI CONNECT VRF 模塊中獲取到的VRF 信息以及RIF 模塊中獲取到的IPv6 DA 信息查找路由表,基于所查到路由表中的信息完成轉發。
ARP 模塊:為了根據IPv6 DA 信息查找路由,在RIF 模塊中剝掉了MAC 頭的信息,因此需要通過ARP 模塊重新封裝之前剝掉的MAC 頭信息。
尾站對報文作解封裝處理,直接匹配標簽棧的最內層VPN SID,實現所有標簽的終結,這樣的處理也是因為SRv6 轉發的特殊性決定的,由于SRv6 在轉發過程中不再彈出標簽,因此報文的解封裝操作并非伴隨著每一跳轉發來完成,而是在最后一跳或者是在倒數第二跳時一次性彈出整個標簽棧[12],而無論標簽層數有多少,最內層的標簽一定是VPN SID,因此在彈出標簽時只需要匹配最內層標簽就可以將所有標簽全部彈出。
報文解封裝流程圖如圖5 所示。

圖5 報文解封裝流程圖
RIF 模塊:對DMAC 進行檢查,當匹配上MACT表項時,則將報文中的mac 頭部終結,暴露出報文后面的VPN SID。
IN VC 模塊:匹配標簽棧最內層VPN SID,上文已經提到若匹配上VPN SID 為本地local SID,則將所有的TXSID 標簽全部彈出。
AC FEC 模塊功能描述:轉發等價類,同樣是為了作保護處理。
CROSS CONNECT 模塊:基于AC 的Outlif 和AC FEC 模塊中申請到的FEC id 作交叉連接,完成NNI和UNI 之間的連接。
AC 模塊:NNI 側AC 即為出口,從AC 出去的報文已完成整個終結流程,出口報文即為原始報文。
不同芯片在不同階段的處理能力不同,導致當封裝信息過長時,芯片處理封裝階段出現封裝信息不全的問題,如期望封裝9 層SID 信息,但出口報文真正封裝成功的可能只有4 層SID 信息,目前很多芯片都出現了這類問題,因此針對SID 層數過多的情況,提出了新的封裝方案。
部分芯片當封裝的報文中SID 層數小于或等于4 層時,報文封裝流程不變,當SID 層數超過4 層時,在轉發流程上增加環回的處理,多層SID 封裝流程圖如圖6 所示。

圖6 多層SID封裝流程圖
該方案差異部分從TXSID 模塊之后開始,考慮到SID 信息無法在一個流程中完整封裝,因此,在二級FEC 后環回,再次掛接TXSID 模塊,將剩下的未成功封裝的SID 進行二次封裝,所有SID 信息都完成封裝后,再掛接ARP 模塊。
對于Ingress 節點的封裝模式,一般分為normal encapsulation 和reduce encapsulation 兩種模式。上文中提到的均為普通模式,當設置為reduce 模式時,為下一個節點提供DIP 的SID 不會出現在SRH 頭中,因此設置為reduce 模式同樣也可以達到減小SRv6 報文開銷的目的。在Ingress 節點設置模式與驅動的流程設計不相沖突,可以同時使用。
由于報文過長而引發的封裝信息不全的問題,除了改善驅動的流程設計,還可以針對SRv6 報文進行處理。考慮到SRv6 報文過長,在上文中提到Segment List 部分占據了SRv6 報文的大部分[14],因此對Segment List 進行壓縮同樣能解決封裝信息不全的問題。
在上文中提及SID 可以劃分為Locator、Function、Arg 三個部分,其中,Locator 還可以細分為B(前綴)、N(節點ID),前綴一般由運營商分配給某個子網[15],事實上在一個SRv6 網絡中,很多SID 都有共同的前綴,因此將SID 信息的前綴公用,將Locator 中的節點ID 和Fuction 以及Arg 進行組合,成為壓縮后的SID信息[16]。
為方便壓縮SID 信息的定位,可將SID 信息壓縮為能被128 bit 整除的長度,比如16 bit、32 bit、64 bit。針對壓縮SID 的定位文中以P 指針來代替,而P 指針的長度根據公式length=log2n(128/n)計算,n表示壓縮SID 的長度,以32 bit為例,P指針的長度即為2 bit。與SL 指針類似,每訪問一個壓縮SID 后P 減一,指向下一個壓縮SID,因此P 指針的功能可以利用Arg 參數實現。
在源節點處判斷需要封裝的SID 層數,可以如圖7 所示進行壓縮。

圖7 封裝層數和壓縮SID的長度
對于混編SID,在中間節點處需要根據SL 以及P來確定DA 作轉發。下文以32 bit 壓縮SID 為例,根據上文提到的公式可以推算出P 占據2 bit,因此取值為0~3,具體壓縮SID 封裝格式圖如圖8 所示。

圖8 壓縮SID封裝格式圖
SL 初始狀態指向標簽棧的最底層SID,更新IPv6 DA,完成第一次轉發后,SL 減1,進入壓縮域,此時P 為3,SL 字段不發生變化,根據P 指針更新IPv6 DA,完成第二次轉發后,SL 字段依然不發生變化,P 字段繼續減一,更新IPv6 DA 信息,直到P 字段減到0,SL 字段便開始減1,依次類推。
利用烽火的設備將該文提出的方案和傳統方案進行對比實驗,來驗證文中提出的設計方案的優點與不足。
經過對比實驗,SID 層數超過4 層時,該文提出的方案可以完成全部SID 信息的封裝,解決部分芯片封裝階段處理能力受限導致SID 封裝不全的問題,與傳統方案進行比較,結果如表1 所示,該方案由于引入了環回的思想,因此交換容量會因此受到一定的影響,且會增大時延,經過多次測試,時延為納秒級,因此該方案雖然會引入帶寬、時延的問題,但其完成全部SID 信息的優點相對其影響更加顯著,且該方案具有通用性,出現這類問題的芯片均可使用該方案。

表1 完成封裝SID層數方案對比表
經過對比實驗可知,該文中提出的壓縮方案可以完成全部信息的封裝,且不需要修改傳統驅動封裝流程,但由于數據平面發生了改變,因此需要控制平面的配合,比如需要相關ISIS 協議以及BGP 協議通告SID 的壓縮能力以及壓縮SID 的長度等信息。與傳統方案進行比較,結果如表2 所示。

表2 完成封裝SID層數方案對比表
針對部分芯片封裝能力受限的問題,文中提供了兩種解決思路,方案一,可根據芯片的封裝能力對報文的SID 層數進行一定的劃分,并且文中針對芯片處理能力內以及封裝能力外的SID 層數的封裝都提出了封裝設計方案,且文中提出的環回方案所引入的時延為納秒級,因此不會有太大影響;方案二,可通過使用壓縮SID 的方案完成全部SID 的封裝,當然設計到SID 的壓縮就會需要協議層面提供足夠的支持與配置。兩種方案均有優點與不足,因此方案的設計與選擇可視具體情況而定。