牛曉妍
(長治醫(yī)學(xué)院 計(jì)算機(jī)系,山西 長治 046000)
隨著互聯(lián)網(wǎng)的快速發(fā)展,傳統(tǒng)的互聯(lián)網(wǎng)協(xié)議IPv4存在路由選擇效率低、IP地址匱乏、服務(wù)質(zhì)量差等諸多問題。針對以上情況,下一代互聯(lián)網(wǎng)協(xié)議IPv6做了較大改進(jìn),并新增加了一些特性,例如改進(jìn)的路由結(jié)構(gòu)、龐大的地址空間、完善的服務(wù)質(zhì)量保證等等。
但是現(xiàn)有的網(wǎng)絡(luò)結(jié)構(gòu)都是以網(wǎng)際互聯(lián)協(xié)議IPv4為基礎(chǔ)構(gòu)建的,所以IPv4向IPv6的轉(zhuǎn)變將是一個(gè)漫長的過程,在這一過程中IPv4與IPv6兩種協(xié)議將會(huì)長期共存。因此當(dāng)前不僅要考慮Ipv4向Ipv6的過度,而且應(yīng)研究如何在IPv4和IPv6兩種協(xié)議共存的情況下,更好、更安全地保證網(wǎng)絡(luò)可靠的通信傳輸。
目前已有的過渡技術(shù)[1]有三種:
(1)雙協(xié)議棧(Dual Stack):這種技術(shù)就是在同一節(jié)點(diǎn)上同時(shí)支持IPv4協(xié)議棧和IPv6協(xié)議棧。
(2)隧道技術(shù)(手動(dòng)隧道、自動(dòng)隧道、6to4,6over4):基于IPv4隧道的IPv6是由路由器將IPv6的數(shù)據(jù)分組封裝入IPv4數(shù)據(jù)包中,以此來實(shí)現(xiàn)在現(xiàn)有的IPv4網(wǎng)絡(luò)中IPv6節(jié)點(diǎn)和IPv4節(jié)點(diǎn)之間的IP通信。這個(gè)過程比較復(fù)雜,分為打包?解包和隧道管理[2]75-783個(gè)步驟。
(3)NAT-PT(Network Address Translation-Protocol Translation):其核心是地址和協(xié)議的轉(zhuǎn)換。
雙協(xié)議棧是指在同一個(gè)網(wǎng)絡(luò)結(jié)點(diǎn)同時(shí)支持IPv4和IPv6兩種協(xié)議棧。因?yàn)镮Pv4和IPv6在形式、功能等方面如出一轍,所以IPv6是IPv4的改進(jìn)版本[3]101-111。IPv4和IPv6這兩種網(wǎng)絡(luò)層協(xié)議基于相同的物理平臺,而且加載于其上的傳輸層協(xié)議(TCP/UDP)也極其相似,所以無論從理論上,還是實(shí)踐上都可以實(shí)現(xiàn)支持雙協(xié)議棧的結(jié)點(diǎn)既能與支持IPv4協(xié)議的結(jié)點(diǎn)通信,又能與支持IPv6協(xié)議的結(jié)點(diǎn)通信。雙協(xié)議棧的概念模型如圖1所示:
圖1 雙協(xié)議棧模型
在雙協(xié)議棧體系模型中,大部分采用了節(jié)點(diǎn)技術(shù)完成IPv4向IPv6過度[4]。節(jié)點(diǎn)模型如圖2所示。
圖2 節(jié)點(diǎn)模型
系統(tǒng)的主體結(jié)構(gòu)采用socket技術(shù),并提供client/server通信模式。采用socket函數(shù)來進(jìn)行IPv4和IPv6下的網(wǎng)絡(luò)編程存在很多弊端,如:IPv4協(xié)議下的網(wǎng)絡(luò)軟件系統(tǒng)在向支持IPv6協(xié)議的網(wǎng)絡(luò)系統(tǒng)的升級[5]過程中存在一些問題。針對這個(gè)現(xiàn)實(shí)難題,本文提出了解決方案:首先設(shè)計(jì)和實(shí)現(xiàn)一組網(wǎng)絡(luò)通信功能的接口;然后分別在IPv4和IPv6下使用socket函數(shù)設(shè)計(jì)和實(shí)現(xiàn)網(wǎng)絡(luò)通信功能,最終屏蔽了IPv4和IPv6在網(wǎng)絡(luò)編程方面的差異。系統(tǒng)的主體結(jié)構(gòu)程序?qū)崿F(xiàn)流程圖如圖3所示。
圖3 主體結(jié)構(gòu)程序?qū)崿F(xiàn)流程圖
該模塊使用類繼承的思想實(shí)現(xiàn)網(wǎng)絡(luò)通信中的客戶端功能部分。設(shè)計(jì)如下:首先設(shè)計(jì)并實(shí)現(xiàn)通用的抽象接口父類;然后分別在IPv4和IPv6下使用socket函數(shù)繼承此抽象接口父類并實(shí)現(xiàn)通信功能的具體接口類。
下面具體舉例說明父類Client的實(shí)現(xiàn)代碼。
該模塊同樣采用類繼承的思想[6]來實(shí)現(xiàn)網(wǎng)絡(luò)通信中的服務(wù)器端的功能部分。設(shè)計(jì)如下:首設(shè)計(jì)并實(shí)現(xiàn)通用的抽象接口父類;然后分別在IPv4和IPv6下使用socket函數(shù)繼承此接口類,并且使用統(tǒng)一的接口格式實(shí)現(xiàn)支持IPv4和IPv6通信功能的接口類。
IPv4服務(wù)器端接口類的設(shè)計(jì)與CSrvL-stv4Thread繼承自父類CSrvThread,它提供的接口方法StartUp()包含了父類CSrvThread所規(guī)定的主要接口方法。
IPv6服務(wù)器端接口類的設(shè)計(jì)與IPv4非常相似。IPv6服務(wù)器端通信功能的類CSrvLstv6Thread繼承自父類CSrvThread,其提供了接口方法startUp(),依照IPv6下的socket函數(shù),其具體實(shí)現(xiàn)為:初始化Winsock,綁定本地地址并開始偵聽?實(shí)現(xiàn)原理與IPv4下的接口方法startUp()相同,只是socket函數(shù)在兩種協(xié)議下的使用有所不同。具體流程為:首先調(diào)用WSAStartup()函數(shù)初始化Winsock,再調(diào)用getaddrinfo()解析服務(wù)器地址,接著創(chuàng)建socket準(zhǔn)備偵聽;然后調(diào)用bind()將該socket綁定到本地;最后調(diào)用listen()開始偵聽并調(diào)用freeaddrinfo()釋放解析服務(wù)器地址時(shí)獲得的地址列表。具體流程與IPv4稍有區(qū)別。值得注意的是,還需要根據(jù)所開發(fā)軟件的實(shí)際需求,設(shè)計(jì)與之相配套的接收線程類,該類也需要處理少量與IPv6協(xié)議相關(guān)的細(xì)節(jié)。
使用本文提出的設(shè)計(jì)思想及設(shè)計(jì)方法,使面向雙棧的應(yīng)用編程變得相對簡單,不必過多地考慮和處理涉及IPv6協(xié)議的細(xì)節(jié),就能使用與IPv4協(xié)議下的類似方法來編制程序,提高了開發(fā)效率?應(yīng)用實(shí)例代碼如下:
通過實(shí)例分析可以得到如下結(jié)論:在已開發(fā)的網(wǎng)絡(luò)軟件的原有功能的基礎(chǔ)上,添加IPv6通信功能模塊并擴(kuò)充頂層通信模塊,就可以實(shí)現(xiàn)雙棧通信。
隨著基于IPv6的應(yīng)用需求日益增大,IPv6取代IPv4是網(wǎng)絡(luò)發(fā)展趨勢,IPv6和IPv4共存是實(shí)際問題。本文結(jié)合具體實(shí)例分析和闡述了IPv4/IPv6雙棧通信的優(yōu)點(diǎn),并在設(shè)計(jì)的模塊中提出了實(shí)用性較強(qiáng)的方法。
[1]黃偉,刁海南等.一種嵌入式IPv4/IPv6雙棧協(xié)議的實(shí)現(xiàn)[J].微計(jì)算機(jī)信息,2008,(24):30-32.
[2]楊濤等譯,Steve Shah著,Linux管理員指南[M].機(jī)械工業(yè)出版社,2005.
[3]周遜著,IPv6—下一代互聯(lián)網(wǎng)的核心[M].電子工業(yè)出版社,2003.
[4]安燕,方濱興.基于SOCKET協(xié)議的IPv4/IPv6轉(zhuǎn)換器[J].高通信技術(shù),2002,(11):30-35.
[5]鄒建峰.基于雙棧的 IPv6翻譯方案即實(shí)現(xiàn)[J].計(jì)算機(jī)工程與應(yīng)用,2003,(2):23-24.
[6]張愛華等.IPv6協(xié)議下域名系統(tǒng)的擴(kuò)展與實(shí)現(xiàn)[J].微機(jī)發(fā)展,2004,(7):79-81.