版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
使用Java開發(fā)兼容IPv6的網(wǎng)絡(luò)應(yīng)用程序IPv6背景介紹目前我們使用的是第二代互聯(lián)網(wǎng)IPv4技術(shù),它的最大問題是網(wǎng)絡(luò)地址資源有限,從理論上講,可以編址1600萬個網(wǎng)絡(luò)、40億臺主機。但采用A、B、C三類編址方式后,可用的網(wǎng)絡(luò)地址和主機地址的數(shù)目大打折扣,以至目前的IP地址近乎枯竭。網(wǎng)絡(luò)地址不足,嚴(yán)重地制約了全球互聯(lián)網(wǎng)的應(yīng)用和發(fā)展。一方面是地址資源數(shù)量的限制,另一方面是隨著電子技術(shù)及網(wǎng)絡(luò)技術(shù)的發(fā)展計算機網(wǎng)絡(luò)將進(jìn)入人們的日常生活,可能身邊的每一樣?xùn)|西都需要連入全球因特網(wǎng)。在這種網(wǎng)絡(luò)空間匱乏的環(huán)境下,IPv6應(yīng)運而生。它的產(chǎn)生不但解決了網(wǎng)絡(luò)地址資源數(shù)量的問題,同時也為除電腦外的設(shè)備連入互聯(lián)網(wǎng)在數(shù)量限制上掃清了障礙。如果說IPv4實現(xiàn)的只是人機對話,那么IPv6則擴展到任意事物之間的對話,它不僅可以為人類服務(wù),還將服務(wù)于眾多硬件設(shè)備,如家用電器、傳感器、遠(yuǎn)程照相機、汽車等,它將是無時不在,無處不在的深入社會每個角落的真正的寬帶網(wǎng),它所帶來的經(jīng)濟效益也將非常巨大。當(dāng)然,IPv6并非十全十美、一勞永逸,不可能解決所有問題。IPv6只能在發(fā)展中不斷完善,也不可能在一夜之間發(fā)生,過渡需要時間和成本,但從長遠(yuǎn)看,IPv6有利于互聯(lián)網(wǎng)的持續(xù)和長久發(fā)展。目前,國際互聯(lián)網(wǎng)組織已經(jīng)決定成立兩個專門工作組,制定相應(yīng)的國際標(biāo)準(zhǔn)。Java對IPv6的支持隨著IPv6越來越受到業(yè)界的重視,Java從1.4版開始支持Linux和Solaris平臺上的IPv6。1.5版起又加入了Windows平臺上的支持。相對于C++,Java很好得封裝了IPv4和IPv6的變化部分,遺留代碼都可以原生支持IPv6,而不用隨底層具體實現(xiàn)的變化而變化。那么Java是如何來支持IPv6的呢?Java網(wǎng)絡(luò)棧會優(yōu)先檢查底層系統(tǒng)是否支持IPv6,以及采用的何種IP棧系統(tǒng)。如果是雙棧系統(tǒng),那它直接創(chuàng)建一個IPv6套接字(如圖1)。圖1.雙棧結(jié)構(gòu)對于分隔棧系統(tǒng),Java則創(chuàng)建IPv4/v6兩個套接字(如圖2)。如果是TCP客戶端程序,一旦其中某個套接字連接成功,另一個套接字就會被關(guān)閉,這個套接字連接使用的IP協(xié)議類型也就此被固定下來。如果是TCP服務(wù)器端程序,因為無法預(yù)期客戶端使用的IP協(xié)議,所以IPv4/v6兩個套接字會被一直保留。對于UDP應(yīng)用程序,無論是客戶端還是服務(wù)器端程序,兩個套接字都會保留來完成通信。圖2.分隔棧結(jié)構(gòu)如何驗證IPv6地址IPv6地址表示從IPv4到IPv6最顯著的變化就是網(wǎng)絡(luò)地址的長度,IPv6地址為128位長度,一般采用32個十六進(jìn)制數(shù),但通常寫做8組每組4個十六進(jìn)制的形式。例如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344是一個合法的IPv6地址。如果四個數(shù)字都是零,則可以被省略。2001:0db8:85a3:0000:1319:8a2e:0370:7344等同于2001:0db8:85a3::1319:8a2e:0370:7344。遵從這些規(guī)則,如果因為省略而出現(xiàn)了兩個以上的冒號的話,可以壓縮為一個,但這種零壓縮在地址中只能出現(xiàn)一次。因此:CODE:2001:0DB8:0000:0000:0000:0000:1428:57ab2001:0DB8:0000:0000:0000::1428:57ab2001:0DB8:0:0:0:0:1428:57ab2001:0DB8:0::0:1428:57ab2001:0DB8::1428:57ab都是合法的地址,并且他們是等價的。但2001::25de::cade是非法的。(因為這樣會使得搞不清楚每個壓縮中有幾個全零的分組)。同時前導(dǎo)的零可以省略,因此:2001:0DB8:02de::0e13等于2001:DB8:2de::e13。IPv6地址校驗IPv4地址可以很容易的轉(zhuǎn)化為IPv6格式。舉例來說,如果IPv4的一個地址為2(十六進(jìn)制為0x874B2B34),它可以被轉(zhuǎn)化為0000:0000:0000:0000:0000:0000:874B:2B34或者::874B:2B34。同時,還可以使用混合符號(IPv4-compatibleaddress),則地址可以為::2。在IPv6的環(huán)境下開發(fā)Java應(yīng)用,或者移植已有的IPv4環(huán)境下開發(fā)的Java應(yīng)用到IPv6環(huán)境中來,對于IPv6網(wǎng)絡(luò)地址的驗證是必須的步驟,尤其是對那些提供了UI(用戶接口)的Java應(yīng)用。所幸的是,從Java1.5開始,Sun就增加了對IPv6網(wǎng)絡(luò)地址校驗的Java支持。程序員可以通過簡單地調(diào)用方法.util.IPAddressUtil.isIPv6LiteralAddress()來驗證一個String類型的輸入是否是一個合法的IPv6網(wǎng)絡(luò)地址。為了更深入一步地了解IPv6的網(wǎng)絡(luò)地址規(guī)范,及其驗證算法,筆者參閱了一些材料,包括上文所述的方法.util.IPAddressUtil.isIPv6LiteralAddress()的源代碼,以及目前網(wǎng)絡(luò)上流傳的一些IPv6網(wǎng)絡(luò)地址的正則表達(dá)式,發(fā)現(xiàn):由于IPv6協(xié)議所允許的網(wǎng)絡(luò)地址格式較多,規(guī)范較寬松(例如零壓縮地址,IPv4映射地址等),所以導(dǎo)致了IPv6網(wǎng)絡(luò)地址的格式變化很大。Java對于IPv6網(wǎng)絡(luò)地址的驗證是通過對輸入字符的循環(huán)匹配做到的,并沒有采取正則表達(dá)式的做法。其匹配過程中還依賴于其它的Java方法。目前網(wǎng)絡(luò)上流傳的IPv6網(wǎng)絡(luò)地址驗證的正則表達(dá)式通常都只能涵蓋部分地址格式,而且表達(dá)式冗長難讀,非常不易于理解。基于通用性考慮,以及為了使驗證方法盡量簡單易讀,筆者嘗試將IPv6網(wǎng)絡(luò)地址的格式簡單分類以后,使用多個正則表達(dá)式進(jìn)行驗證。這種做法兼顧了通用性(基于正則表達(dá)式,所以方便用各種不同的編程語言進(jìn)行實現(xiàn)),以及易讀性(每個獨立的正則表達(dá)式相對簡短);并且根據(jù)測試,支持目前所有的IPv6網(wǎng)絡(luò)地址格式類型,尚未發(fā)現(xiàn)例外。以下是筆者用Java編寫的對于IPv6網(wǎng)絡(luò)地址的驗證方法。此算法可被簡單地用其它編程語言仿照重寫。清單1.驗證地址CODE://IPv6addressvalidatormatchestheseIPv6formats//::ffff:21:21|2001:0db8:85a3:08d3:1319:8a2e:0370:7344//|::8a2e:0:0370:7344|2001:0db8:85a3:08d3:1319:8a2e:5//|2001:0db8::8a2e:5|::5|ffff:://Andsuchaddressesareinvalid//::8a2e:0:0370:7344.4|2001:idb8::111:11|2001::100.a2.44.55//|:2001::5publicstaticbooleanisIPV6Format(Stringip){ip=ip.trim();//inmanycasessuchasURLs,IPv6addressesarewrappedby[]return(1<Ppile(":").split(ip).length)//avalidIPv6addressshouldcontainsnolessthan1,//andnomorethan7“:”asseparators&&(Ppile(":").split(ip).length<=8)//theaddresscanbecompressed,but“::”canappearonlyonce&&(Ppile("::").split(ip).length<=2)//ifacompressedaddress&&(Ppile("::").split(ip).length==2)//ifstartswith—leadingzerosarecompressed?(((ip.substring(0,2).equals("::"))?Pattern.matches("入::([\\da-f]{1,4}(:)){0,4}(([\\da-f]{1,4}(:)[\\da-f]{1,4})|([\\da-f]{1,4})|((\\d{1,3}.){3}\\d{1,3}))",ip):Pattern.matches("入([\\da-f]{1,4}(:|::)){1,5}(([\\da-f]{1,4}(:|::)[\\da-f]{1,4})|([\\da-f]{1,4})|((\\d{1,3}.){3}\\d{1,3}))",ip)))//ifendswith"::"-endingzerosarecompressed:((ip.substring(ip.length()-2).equals("::"))?Pattern.matches("入([\\da-f]{1,4}(:|::)){1,7}",ip):Pattern.matches("入([\\da-f]{1,4}:){6}(([\\da-f]{1,4}:[\\da-f]{1,4})|((\\d{1,3}.){3}\\d{1,3}))",ip));}}如何正規(guī)化IPv6地址在網(wǎng)絡(luò)程序開發(fā)中,經(jīng)常使用IP地址來標(biāo)識一個主機,例如記錄終端用戶的訪問記錄等。由于IPv6具有有零壓縮地址等多種表示形式,因此直接使用IPv6地址作為標(biāo)示符,可能會帶來一些問題。為了避免這些問題,在使用IPv6地址之前,有必要將其正規(guī)化。除了通過我們熟知的正則表達(dá)式,筆者在開發(fā)過程中發(fā)現(xiàn)使用一個簡單的JavaAPI也可以達(dá)到相同的效果。清單2.正規(guī)化地址CODE:InetAddressinetAddr=InetAddress.getByName(ipAddr);ipAddr=inetAddr.getHostAddress();System.out.println(ipAddr);InetAddress.getByName(String)方法接受的System.out.println(ipAddr);參數(shù)既可以是一個主機名,也可以是一個IP地址字符串。我們輸入任一信息的合法IPv6地址,再通過getHostAddress()方法取出主機IP時,地址字符串ipAddr已經(jīng)被轉(zhuǎn)換為完整形式。例如輸入2002:97b:e7aa::97b:e7aa,上述代碼執(zhí)行過后,零壓縮部分將被還原,ipAddr變?yōu)?002:97b:e7aa:0:0:0:97b:e7aa。如何獲取本機IPv6地址有時為了能夠注冊listener,開發(fā)人員需要使用本機的IPv6地址,這一地址不能簡單得通過InetAddress.getLocalhost()獲得。因為這樣有可能獲得諸如0:0:0:0:0:0:0:1這樣的特殊地址。使用這樣的地址,其他服務(wù)器將無法把通知發(fā)送到本機上,因此必須先進(jìn)行過濾,選出確實可用的地址。以下代碼實現(xiàn)了這一功能,思路是遍歷網(wǎng)絡(luò)接口的各個地址,直至找到符合要求的地址。清單3.獲取本機IP地址CODE:InetAddressinetAddr=InetAddress.getByName(ipAddr);ipAddr=inetAddr.getHostAddress();System.out.println(ipAddr);InetAddress.getByName(String)方法接受的參數(shù)既可以是一個主機名,也可以是一個IP地址字符串。我們輸入任一信息的合法IPv6地址,再通過getHostAddress()方法取出主機IP時,地址字符串ipAddr已經(jīng)被轉(zhuǎn)換為完整形式。例如輸入2002:97b:e7aa::97b:e7aa,上述代碼執(zhí)行過后,零壓縮部分將被還原,ipAddr變?yōu)?002:97b:e7aa:0:0:0:97b:e7aa。如何獲取本機IPv6地址有時為了能夠注冊listener,開發(fā)人員需要使用本機的IPv6地址,這一地址不能簡單得通過InetAddress.getLocalhost()獲得。因為這樣有可能獲得諸如0:0:0:0:0:0:0:1這樣的特殊地址。使用這樣的地址,其他服務(wù)器將無法把通知發(fā)送到本機上,因此必須先進(jìn)行過濾,選出確實可用的地址。以下代碼實現(xiàn)了這一功能,思路是遍歷網(wǎng)絡(luò)接口的各個地址,直至找到符合要求的地址。清單3.獲取本機IP地址#div_codeimg{border:0px;}<!--CodehighlightingproducedbyActiproCodeHighlighter(freeware)http://www.CodeH/-->publicstaticStringgetLocalIPv6Address()throwsIOException{InetAddressinetAddress=null;Enumeration<NetworkInterface>networkInterfaces=NetworkInterface.getNetworkInterfaces();outer:while(networkInterfaces.hasMoreElements()){Enumeration<InetAddress>inetAds=networkInterfaces.nextElement().getInetAddresses();while(inetAds.hasMoreElements()){inetAddress=inetAds.nextElement();//Checkifit'sipv6addressandreservedaddressif(inetAddressinstanceofInet6Address&&!isReservedAddr(inetAddress)){breakouter;}}}StringipAddr=inetAddress.getHostAddress();//FilternetworkcardNointindex=ipAddr.indexOf('%');if(index>0){ipAddr=ipAddr.substring(0,index);}returnipAddr;}/***Checkifit's"localaddress"or"linklocaladdress"or*"loopbackaddress"**@paramipaddress**@returnresult*/privatestaticbooleanisReservedAddr(InetAddressinetAddr){if(inetAddr.isAnyLocalAddress()||inetAddr.isLinkLocalAddress()||inetAddr.isLoopbackAddress()){returntrue;}returnfalse;}為了支持IPv6,Java中增加了兩個InetAddress的子類:Inet4Address和Inet6Address。一般情況下這兩個子類并不會被使用到,但是當(dāng)我們需要分別處理不同的IP協(xié)議時就非常有用,在這我們根據(jù)Inet6Address來篩選地址isReservedAddr()方法過濾了本機特殊IP地址,包括“LocalAddress",“LinkLocalAddress"和“LoopbackAddress"。讀者可根據(jù)自己的需要修改過濾標(biāo)準(zhǔn)。另一個需要注意的地方是:在windows平臺上,取得的IPv6地址后面可能跟了一個百分號加數(shù)字。這里的數(shù)字是本機網(wǎng)絡(luò)適配器的編號。這個后綴并不是IPv6標(biāo)準(zhǔn)地址的一部分,可以去除。IPv4/IPv6雙環(huán)境下,網(wǎng)絡(luò)的選擇和測試我們先看一下筆者所在的IPv4/IPv6開發(fā)測試環(huán)境及其配置方法。筆者所處的IPv4/IPv6雙環(huán)境是一個典型的“6to4”雙棧網(wǎng)絡(luò),其中存在著一個IPv6到IPv4的映射機制,即任意一個IPv6地址2002:92a:8f7a:100:a:b:c:d在路由時會被默認(rèn)映射為IPv4地址a.b.c.d,所以路由表只有一套。在此環(huán)境內(nèi),IPv4地址與IPv6地址的——對應(yīng)是人工保證的。如果一臺客戶機使用不匹配的IPv4和IPv6雙地址,或者同時使用DHCPv4和DHCPv6(可能會導(dǎo)致IPv4地址和IPv6地址不匹配),會導(dǎo)致IPv6的路由尋址失敗。正因為如此,為了配置雙地址環(huán)境,我們一般使用DHCPv4來自動獲取IPv4地址,然后人工配置相對應(yīng)的IPv6地址。Windows系統(tǒng)Windows2000及以下:不支持IPv6Windows2003和WindowsXP:使用Windows自帶的netsh命令行方式添加IPv6地址以及DNS,例如:C:\>netshinterfaceipv6addaddress“LocalAreaConnection"2002:92a:8f7a:100:10:13:l:2和C:\>netshinterfaceipv6adddns“LocalAreaConnection”2002:92a:8f7a:100:10::250Windows2008和WindowsVista:既可以使用Windows網(wǎng)絡(luò)屬性頁面進(jìn)行配置,也可以使用類似Windows2003和WindowsXP的netsh命令行來配置Linux系統(tǒng)(以下是IPv6的臨時配置方法,即不修改配置文件,計算機重啟后配置失效)RedhatLinux:最簡單的方法是使用ifconfig命令行添加IPv6地址,例如:ifconfigeth0inet6add2002:92a:8f7a:100:10:14:24:106/96。SUSELinux:同上。從實踐上講,由于Java的面向?qū)ο筇匦?,以及包對于IP地址的良好封裝,從而使得將Java應(yīng)用從IPv4環(huán)境移植到IPv4/IPv6雙環(huán)境,或者純IPv6環(huán)境變得異常簡單。通常我們需要做的僅是檢查代碼并移除明碼編寫的IPv4地址,用主機名來替代則可。除此以外,對于一些特殊的需求,Java還提供了InetAddress的兩個擴展類以供使用:Inet4Address和Inet6Address,其中封裝了對于IPv4和IPv6的特殊屬性和行為。然而由于Java的多態(tài)特性,使得程序員一般只需要使用父類InetAddress,Java虛擬機可以根據(jù)所封裝的IP地址類型的不同,在運行時選擇正確的行為邏輯。所以在多數(shù)情況下,程
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度保安公司與酒店業(yè)者的專業(yè)安全守護(hù)服務(wù)合同
- 2025年度房地產(chǎn)開發(fā)項目墊資合作協(xié)議3篇
- 2025年度二零二五年度旅游培訓(xùn)機構(gòu)學(xué)生旅游文化素養(yǎng)提升協(xié)議2篇
- 2025年度房產(chǎn)證收訖后購房合同保管及責(zé)任界定合同2篇
- 2025年度變壓器維修知識產(chǎn)權(quán)保護(hù)與合作合同
- 2025年度海洋資源開發(fā)與保護(hù)戰(zhàn)略合作合同
- 2025年度大米加工產(chǎn)業(yè)投資合作合同3篇
- 2025年度廢品回收與環(huán)保技術(shù)研發(fā)與應(yīng)用合同
- 2025年度國際機票代購代理合同2篇
- 做賬實操-建筑企業(yè)合同管理制度
- 紀(jì)法培訓(xùn)課件
- 上海市浦東新區(qū)部分學(xué)校聯(lián)考2023-2024學(xué)年七年級上學(xué)期期末考試數(shù)學(xué)試題
- 南京理工大學(xué)物理化學(xué)課程考試8套卷(含答案)
- 泌尿外科工作總結(jié)及計劃
- 2023-2024學(xué)年度第一學(xué)期墻新學(xué)校小學(xué)部六年級課外閱讀答題活動
- 光伏發(fā)電項目現(xiàn)場安全檢查表(帶檢查依據(jù))
- Animate動畫設(shè)計與制作實例教程(Animate CC 2019)完整全套教學(xué)課件 第1-9章 VI 標(biāo)識- 網(wǎng)站應(yīng)用
- 敏迪MN3300程控電話系統(tǒng)維護(hù)和使用方法說明
- 2023固體礦產(chǎn)資源儲量核實報告編寫規(guī)范
- DCS基礎(chǔ)培訓(xùn)課程(和利時)課件
- 九年級物理上學(xué)期期末考試成績分析及整改措施
評論
0/150
提交評論