蔣建峰
(1.蘇州工業(yè)園區(qū)服務(wù)外包職業(yè)學(xué)院,江蘇 蘇州 215123;2.南京郵電大學(xué) 計算機學(xué)院,江蘇 南京 210003)
隨著智能終端、移動設(shè)備的不斷增加,IPv4網(wǎng)絡(luò)的地址空間已經(jīng)面臨耗盡的危險。IPv6網(wǎng)絡(luò)已經(jīng)在運營商核心網(wǎng),教育網(wǎng)的核心設(shè)備上成功部署。但是在很長一段時間內(nèi)IPv4網(wǎng)絡(luò)仍然占據(jù)著一席之地,因此產(chǎn)生了大量的IPv6孤立網(wǎng)絡(luò)群,在下一代通信網(wǎng)絡(luò)中IPv6網(wǎng)絡(luò)與IPv4網(wǎng)絡(luò)共存是一個常態(tài)。
基于業(yè)務(wù)的融合,IPv4網(wǎng)絡(luò)與IPv6網(wǎng)絡(luò)無法相互分離,當(dāng)前雙棧,隧道技術(shù)能夠很好地實現(xiàn)在IPv4網(wǎng)絡(luò)上對IPv6業(yè)務(wù)的承載,保證業(yè)務(wù)的共存和過渡,已定義的隧道技術(shù)種類很多,主要包括手工配置隧道、兼容地址自動配置隧道、6over4、6to4隧道等[1-3]。
國內(nèi)外學(xué)者對于IPv6網(wǎng)絡(luò)過渡技術(shù)的研究很多,主要有三種主流的過渡技術(shù):雙棧、網(wǎng)絡(luò)地址轉(zhuǎn)換和隧道技術(shù)。而這三種過渡技術(shù)都是基于軟件實現(xiàn)數(shù)據(jù)包的封裝,這就要求網(wǎng)絡(luò)設(shè)備具有良好的CPU計算性能,而在數(shù)據(jù)包的封裝過程中會影響設(shè)備的數(shù)據(jù)轉(zhuǎn)發(fā)效率。由于硬件條件的限制,通過硬件驅(qū)動的方法來提升隧道數(shù)據(jù)包的轉(zhuǎn)發(fā)效率的研究還很少。
當(dāng)前利用隧道技術(shù)進(jìn)行數(shù)據(jù)轉(zhuǎn)發(fā)的行為,多數(shù)網(wǎng)絡(luò)設(shè)備廠家只是注重軟件的驅(qū)動,雖然使用軟件的驅(qū)動能夠解決數(shù)據(jù)的封裝,但是對于網(wǎng)絡(luò)的延遲和通信速率沒有很好的性能保障。該文通過驅(qū)動指令指導(dǎo)數(shù)據(jù)發(fā)送,在性能方面有明顯的優(yōu)勢。
手工隧道[4-5]是實現(xiàn)IPv6孤島連接的一個基本方法,通過手工指定隧道的源和目的,在IPv4主干網(wǎng)絡(luò)中建立一條永久虛鏈路。手工隧道主要有GRE隧道和IPv6手動隧道。手工隧道轉(zhuǎn)發(fā)的原理如圖1所示。
圖1 手工隧道原理
自動隧道是目前實現(xiàn)IPv6孤島連接的主要隧道技術(shù),包括IPv4兼容IPv6隧道、ISATAP隧道[6-8]、6to4隧道、6 to 4relay等。
6to4隧道是一種自動連接隧道[9-10],通過在IPv6地址中嵌入IPv4地址信息,自動獲取隧道的目的方,6to4地址格式如表1所示。
表1 6to4地址格式
6to4隧道的地址是一種特殊的IPv6地址,6to4地址以2002為固定的前16位前綴,緊跟著的32位是由IPv4地址轉(zhuǎn)換而來的地址,其格式為:2002:abcd:efgh:子網(wǎng)號::接口ID/64。6to4隧道可以實現(xiàn)利用IPv4網(wǎng)絡(luò)完成IPv6網(wǎng)絡(luò)的互連,克服了IPv4兼容IPv6自動隧道使用的局限性。
6to4隧道的地址只能是以2002前綴的網(wǎng)絡(luò),所以如果要和其他的IPv6網(wǎng)絡(luò)通信,必須有一臺6to4路由器作為網(wǎng)關(guān)轉(zhuǎn)發(fā)到IPv6網(wǎng)絡(luò)的報文,這臺路由器就叫做6to4中繼(6to4 relay)路由器。6to4中繼路由器負(fù)責(zé)轉(zhuǎn)發(fā)去往其他IPv6網(wǎng)絡(luò)的數(shù)據(jù),所以,當(dāng)邊緣設(shè)備需要和外界IPv6網(wǎng)絡(luò)通信時,必須要配置到底中繼的靜態(tài)路由。
因此,可以看出6to4隧道不僅可以克服手動隧道配置的點對點單一性,而且其擴(kuò)展隧道6to4relay能夠與IPv6網(wǎng)絡(luò)進(jìn)行互聯(lián),所以該文主要對6to4隧道的原理以及驅(qū)動實現(xiàn)進(jìn)行研究。
驅(qū)動是平臺操作系統(tǒng)和硬件通信的程序,可以說相當(dāng)于硬件的接口,操作系統(tǒng)只能通過這個接口,才能控制硬件設(shè)備的工作,基于硬件的數(shù)據(jù)轉(zhuǎn)發(fā)比軟件操作的速度要快很多。隧道驅(qū)動模塊系統(tǒng)結(jié)構(gòu)如圖2所示。
圖2 系統(tǒng)結(jié)構(gòu)
平臺模塊負(fù)責(zé)與用戶交互,當(dāng)用戶進(jìn)行配置時,創(chuàng)建隧道命令時,平臺模塊將這個指令傳遞給驅(qū)動相關(guān)模塊,主控板和接口板的平臺是一套代碼,維護(hù)相同的資源。
驅(qū)動的實現(xiàn)設(shè)計主控板和接口板,需要兩套代碼對應(yīng)不同的處理方式,維護(hù)的資源也不相同,主控板主要負(fù)責(zé)數(shù)據(jù)層面的處理,接口板負(fù)責(zé)轉(zhuǎn)發(fā)層面的處理。平臺下發(fā)指令給驅(qū)動時先與主控板的驅(qū)動模塊進(jìn)行交互,主控板驅(qū)動進(jìn)行相應(yīng)處理后同步下發(fā)指令給各個接口板進(jìn)行處理。最終驅(qū)動模塊將相關(guān)信息下發(fā)芯片后,隧道報文從接口板上的端口進(jìn)入后芯片就會正確指導(dǎo)報文的轉(zhuǎn)發(fā)。
NP芯片(network processor)編程模式簡單,可以很方便地通過微碼編程進(jìn)行實現(xiàn),是該研究所使用的芯片,NP芯片三層單播轉(zhuǎn)發(fā)流程如圖3所示。
圖3 NP芯片單播三層轉(zhuǎn)發(fā)流程
(1)報文從入接口進(jìn)入芯片,首先查詢INSW(in logical switch)表,對于IPv6報文,INSW中L3和IPv6相關(guān)標(biāo)記置1,允許報文進(jìn)行三層轉(zhuǎn)發(fā)。
(2)報文在芯片中繼續(xù)查詢MAC2ME表項,如果報文中以太頭的mac地址與接口的mac相同,說明報文是要本機處理走三層轉(zhuǎn)發(fā)。
(3)使用報文IP頭中的DIP作為KEY查詢FIB(forward information base)表項,進(jìn)行最長匹配查找,得到的KEY為OUTINFO的ID,如果是等價路由則會得到一個BASEID和ECMP標(biāo)記,進(jìn)行等價負(fù)載分擔(dān)。
(4)通過OUTINFO ID查詢OUTINFO(out interface info)表項,這個表項中存儲著報文的出端口信息以及ARP INDEX。
(5)報文出crossbar后,使用ARP INDEX查詢ARP表項,得到目的MAC地址,封裝MAC頭后從接口轉(zhuǎn)發(fā)出去。
隧道技術(shù)的關(guān)鍵是封裝與解封裝過程[11-12],在三層單播轉(zhuǎn)發(fā)基礎(chǔ)上實現(xiàn)隧道功能即在入隧道時可以對報文進(jìn)行封裝,由于OUTINFO表項內(nèi)存大,易于擴(kuò)展,所以在OUTINFO表中可以添加隧道標(biāo)記以及隧道信息,如果為隧道報文就會以封裝的新的IP頭的目的IP重新查找IPv4 FIB表進(jìn)行正常的轉(zhuǎn)發(fā),具體如圖4所示。
圖4 入隧道報文轉(zhuǎn)發(fā)流程
出隧道流程是對報文的解封裝過程,在MAC2ME后增加對報文類型判斷,如果為隧道報文,就會以sip+dip+protocol+payload為key查詢TNLEND表項,如果是在本機終結(jié)則執(zhí)行解封裝過程,隨后進(jìn)行正常的IPv6報文轉(zhuǎn)發(fā),如圖5所示。
圖5 出隧道報文轉(zhuǎn)發(fā)流程
3.2.1 初始化階段
主控板主要負(fù)責(zé)隧道資源池的初始化,隧道計數(shù)的維護(hù),隧道引用者的記錄,資源池的初始化狀態(tài)以及分配回收過程如圖6所示。
圖6 隧道資源索引分配
接口板主要記錄隧道屬性相關(guān)信息,并對這些信息進(jìn)行維護(hù)、更新、刪除,下發(fā)芯片硬件指導(dǎo)芯片對報文進(jìn)行轉(zhuǎn)發(fā)。
接口板維護(hù)的信息包括:
(1)隧道基本信息。
{
隧道類型;
隧道目的IP;
隧道源IP;
OUTINFOID;
TNLEND標(biāo)記;
}
隧道驅(qū)動信息是以設(shè)備支持的最大隧道數(shù)目為數(shù)組下標(biāo),在初始化時申請相應(yīng)的內(nèi)存,以后有隧道創(chuàng)建刪除更新時直接對驅(qū)動隧道信息進(jìn)行操作。
(2)TNLEND信息。
{
隧道目的IP;
隧道源IP;
隧道協(xié)議類型;
負(fù)載類型;
引用計數(shù);
}
TNLEND信息以鏈表形式存儲,因為多個隧道可能會共用一個TNLEND,所以初始化時只申請首節(jié)點,后續(xù)再進(jìn)行添加刪除更新等操作。
(3)6to4 relay信息。
{
6to4 ID;
6to4Relay ID;
DIP;
OUTINFOID;
}
由于6to4隧道可以擴(kuò)展出多個6to4 relay隧道,6to4 relay與6to4隧道不同的信息在于DIP以及OUTINFO信息,所以需要建立兩者的映射關(guān)系,在初始化時,以設(shè)備最大支持隧道數(shù)目為值,為每個隧道都創(chuàng)建一個鏈表,但只申請首節(jié)點內(nèi)存,后續(xù)有6to4 relay隧道創(chuàng)建時再加入鏈表。
3.2.2 隧道創(chuàng)建事件響應(yīng)
(1)用戶創(chuàng)建6to4隧道時,配置隧道的SIP、DIP、隧道類型、隧道的IP地址,主控板平臺模塊會將這些信息保存下來,然后主控板的平臺隧道模塊會通知主控板的驅(qū)動隧道模塊隧道的創(chuàng)建,驅(qū)動會從主控板的隧道資源池分配一個索引并且回填到平臺隧道信息中,隧道使用計數(shù)加一,并且將這個隧道資源的引用者設(shè)置為隧道模塊。
(2)主控板的平臺隧道模塊將隧道信息同步給接口板,接口板的平臺隧道模塊再通知驅(qū)動隧道的建立,驅(qū)動隧道模塊將平臺帶來的信息經(jīng)過處理儲存在驅(qū)動信息中,并且申請OUTINFO資源,將相關(guān)信息如6to4隧道標(biāo)示以及SIP下發(fā)到芯片的OUTINFO信息中并且ID保存在驅(qū)動隧道信息中。
TNLEND的下發(fā)條件比較嚴(yán)格,TNLEND下發(fā)需要隧道為UP狀態(tài),隧道UP的條件如下:
(1)自動隧道會用SIP檢查配置該IP的接口是否為UP狀態(tài),如果為UP,則隧道UP,手動隧道還需要檢查DIP是否可達(dá)。
(2)當(dāng)兩條隧道配置相同的SIP時,有一個先達(dá)到UP條件,另一條隧道就不能UP。
隧道UP后,會將SIP、DIP、隧道協(xié)議類型、負(fù)載類型作為KEY下發(fā)到TNLEND表中,Result為隧道終結(jié)解封裝隧道IP頭;由于TNLEND是以HashTree表形式存儲在芯片內(nèi)存上,所以具有相同KEY的報文會查詢到同一張TNLEND表,對于驅(qū)動也可以將具有相同屬性的隧道TNLEND信息保存在驅(qū)動TNLEND鏈表中的同一個節(jié)點中,只是將引用計數(shù)加一。
表項下發(fā)好后,還不能實現(xiàn)6to4隧道功能,需要在設(shè)備上配置一條靜態(tài)路由,目的ip為2002::掩碼為16位,下一條為6to4 tunnel,這樣驅(qū)動單播模塊就會下發(fā)一條fib表項到芯片,且fib表項的Result為6to4隧道申請的OUTINFOID,這樣就將路由與隧道關(guān)聯(lián)起來,當(dāng)有目的IP地址為6to4地址時的報文查詢fib時,會進(jìn)入隧道轉(zhuǎn)發(fā)流程。
3.2.3 Relay隧道創(chuàng)建事件響應(yīng)
6to4 relay隧道比較特殊,由于平臺不區(qū)分6to4隧道與6to4中繼隧道,所以并不能創(chuàng)建隧道類型為6to4 relay的隧道,所以6to4 relay隧道創(chuàng)建的流程如下:
(1)6to4 relay隧道的創(chuàng)建需要2001::/64位網(wǎng)段的用戶進(jìn)行通信,配置一條靜態(tài)路由,目的IP為2001::/16,下一跳為在連接該網(wǎng)段的6to4 relay中繼路由器的6to4地址下一跳,由于下一跳地址為非直連網(wǎng)段,所以會進(jìn)行路由迭代使用下一跳的IP作為目的IP查詢路由表,得到下一跳為6to4隧道。
(2)主控板平臺模塊會通知驅(qū)動單播模塊下發(fā)一條帶有隧道標(biāo)記的路由,這時需要驅(qū)動自己判斷是否為中繼路由,判斷條件為路由下一跳地址是6to4地址,路由目的地址不是6to4,路由帶有隧道標(biāo)記,路由下一跳出接口指向6to4隧道ID。當(dāng)滿足以上條件時,驅(qū)動單播模塊會通知驅(qū)動隧道模塊進(jìn)入6to4 relay分支。
(3)主控板的驅(qū)動隧道模塊響應(yīng)單播模塊的隧道創(chuàng)建事件,分配一個隧道索引給單播模塊,并且將這個索引的引用者設(shè)置為單播模塊,之所以要為每個隧道資源設(shè)置占用者是因為有可能會出現(xiàn)下面這種時序問題情況。由于單播模塊和隧道模塊處于不同的任務(wù)隊列,在板件通信的時候可能會出現(xiàn)由于任務(wù)異步通信原因發(fā)生資源搶占,最終在刪除6to4 relay隧道時會將IP隧道保存好的驅(qū)動軟件表項以及下發(fā)的硬件表項全部刪除,導(dǎo)致平臺收到隧道創(chuàng)建成功的應(yīng)答,并且在用戶側(cè)成功配置隧道,但是隧道功能卻是沒有實現(xiàn),如圖7所示。
圖7 任務(wù)異步通信機制導(dǎo)致資源搶占示意圖
所以為每個隧道資源標(biāo)記使用者,如果有在申請隧道資源時,在主控板分配資源后,會檢查該資源的引用者是否為本模塊,如果不是則返回平臺信息,要求重新申請隧道資源,這就是重刷機制。
主控板的驅(qū)動單播模塊將路由信息以及隧道索引同步給接口板的驅(qū)動單播模塊,然后接口板的驅(qū)動單播模塊通知驅(qū)動隧道模塊6to4 relay隧道的建立,并將新申請的隧道索引以及相關(guān)聯(lián)的6to4隧道索引帶給驅(qū)動隧道模塊。
(4)驅(qū)動隧道模塊會為6to4 relay隧道申請OUTINFO資源,然后以相關(guān)聯(lián)的6to4隧道信息中的SIP和路由下一跳的6to4地址高位偏移兩字節(jié)后的4字節(jié)作為DIP以及6to4 relay標(biāo)記下發(fā)OUTINFO,將6to4 relay信息加入到驅(qū)動6to4 relay鏈表中,便于維護(hù),TNLEND表項下發(fā)過程與6to4隧道TNLEND類似。
(5)當(dāng)驅(qū)動隧道模塊將6to4 relay創(chuàng)建好后,會通知單播模塊,單播模塊這時會將路由表項下發(fā)芯片,并且FIB表項中的key為6to4 relay申請的OUTINFO ID。這時6to4 relay隧道功能完成,當(dāng)與2001::/64網(wǎng)段用戶通信時,查詢fib表會進(jìn)入6to4 relay隧道轉(zhuǎn)發(fā)流程[4]。
RouterA為6to4路由器,網(wǎng)絡(luò)地址使用IPv6 6to4地址。RouterB是6to4中繼路由器,連接到網(wǎng)絡(luò)2001::/16。需要在RouterA和RouterB之間配置6to4隧道,使Hosts可以與網(wǎng)絡(luò)中的IPv6 Hosts通信,網(wǎng)絡(luò)拓?fù)淙鐖D8所示。
圖8 6to4 relay組網(wǎng)圖
設(shè)備主要配置部分命令如下:
[RouterA]ipv6
[RouterA-GigabitEthernet3/1/2]ip address 2.1.1.1 255.255.255.0
[RouterA-GigabitEthernet3/1/2]ipv6 address 2002:0201:0101:1::1/64
[RouterA]interface tunnel 0
[RouterA-Tunnel0]ipv6 address 2002:0201:0101::1/64
[RouterA-Tunnel0]source GigabitEthernet3/1/2
[RouterA-Tunnel0]tunnel-protocol ipv6-ipv4 6to4
[RouterA]ipv6 route-static 2002:0601:0101::64 tunnel 0
[RouterA]ipv6 route-static ::0 2002:0601::1
完成配置后,驗證配置結(jié)果如下所示,Host A可以Ping通Host B。
D:>ping6 -s 2002:201:101::2 2001::2
Pinging 2001::2
From 2002:201:101:1::2 with 32 bytes of data:
Reply from 2001::2 bytes=32 time=13ms
通過仿真軟件[13-15]連續(xù)抓取通信報文統(tǒng)計,當(dāng)數(shù)據(jù)發(fā)送速率比較低的時候,網(wǎng)絡(luò)數(shù)據(jù)包的延遲,語音的抖動影響很小;當(dāng)數(shù)據(jù)包發(fā)送速率較大時,通過軟件算法實現(xiàn)隧道技術(shù)的網(wǎng)絡(luò)數(shù)據(jù)延遲較大,而且語音的抖動比較嚴(yán)重,通過硬件驅(qū)動算法之后能改善數(shù)據(jù)包的延遲,并且保證了語音和視頻的延遲抖動,充分保證了網(wǎng)絡(luò)的利用率。
如圖9和圖10顯示,當(dāng)發(fā)送的數(shù)據(jù)包數(shù)量明顯增加時,由硬件驅(qū)動的數(shù)據(jù)轉(zhuǎn)發(fā)延遲明顯較小,而且隨著數(shù)量的增加,軟件驅(qū)動的數(shù)據(jù)轉(zhuǎn)發(fā)延遲增幅較大。實驗結(jié)果表明,說明該驅(qū)動方案能夠很好地提升網(wǎng)絡(luò)性能。
圖9 網(wǎng)絡(luò)延遲性能比較
圖10 網(wǎng)絡(luò)抖動性能比較
隨著運營商和企業(yè)IPv6網(wǎng)絡(luò)的部署,IPv4和IPv6網(wǎng)絡(luò)將在很長一段時間內(nèi)共存。IPv6隧道實現(xiàn)了IPv4海洋中IPv6孤島的連接。當(dāng)IPv6網(wǎng)絡(luò)進(jìn)行大規(guī)模部署時,隧道技術(shù)是實現(xiàn)通信網(wǎng)絡(luò)的關(guān)鍵過渡技術(shù),它將IPv6報文封裝在IPv4報文中實現(xiàn)骨干網(wǎng)絡(luò)的連接,并且6to4隧道能夠?qū)崿F(xiàn)隧道目的IPv4地址的自動匹配。依據(jù)IPv6隧道技術(shù)設(shè)計了一套驅(qū)動流程,基于NP芯片實現(xiàn)了驅(qū)動的設(shè)計指導(dǎo)隧道報文轉(zhuǎn)發(fā)。實驗結(jié)果顯示,驅(qū)動能夠很好的指導(dǎo)報文的轉(zhuǎn)發(fā),并且在網(wǎng)絡(luò)延遲和抖動方面有著顯著的性能優(yōu)勢。