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