李 強(qiáng) 李 強(qiáng) 王 賡
1 上海交通大學(xué) 上海 200240
2 希姆通信息技術(shù)(上海)有限公司 上海 200335
TCP/IP協(xié)議族是Internet國際互聯(lián)網(wǎng)的基礎(chǔ),其定義了電子設(shè)備連入因特網(wǎng)以及數(shù)據(jù)傳輸?shù)臉?biāo)準(zhǔn),其中,IPv4功不可沒。但隨著互聯(lián)網(wǎng)的快速發(fā)展,網(wǎng)絡(luò)主機(jī)和用戶數(shù)量急劇增加,IPv4地址正日益枯竭。為解決IP地址不足的問題,IETF(Internet Engineering Task Force,國際互聯(lián)網(wǎng)工程任務(wù)組)設(shè)計(jì)制定了下一代網(wǎng)絡(luò)層協(xié)議IPv6,用于替代現(xiàn)行的IPv4版本。
在不斷擴(kuò)充的網(wǎng)絡(luò)主機(jī)中,智能移動(dòng)終端特別是智能手機(jī)占了很大一部分比例。手機(jī)操作系統(tǒng)對(duì)于IPv6的支持是移動(dòng)互聯(lián)網(wǎng)支持IPv6的重要一環(huán)。伴隨著4G網(wǎng)絡(luò)的建設(shè),IPv6在4G網(wǎng)絡(luò)中也將得到廣泛應(yīng)用。目前,雖然已經(jīng)有部分適應(yīng)IPv6網(wǎng)絡(luò)的應(yīng)用,但大部分應(yīng)用仍只適用于IPv4網(wǎng)絡(luò),終端廠商在實(shí)現(xiàn)IPv6功能時(shí),必須要考慮IPv4到IPv6的平穩(wěn)過渡問題。同時(shí),對(duì)于開發(fā)者而言,在開發(fā)新的應(yīng)用時(shí)也要考慮后續(xù)應(yīng)用遷移到IPv6網(wǎng)絡(luò)的需求。
目前,主流的移動(dòng)操作系統(tǒng)主要包括Android、iOS、Windows Phone等。得益于Google免費(fèi)開源的優(yōu)勢,Android操作系統(tǒng)在中國市場長期處于主導(dǎo)地位,近幾年市場占有率一直處于上升勢態(tài)。如圖1所示,Kantar Worldpanel在2014年9月份進(jìn)行的消費(fèi)者調(diào)查結(jié)果顯示,在中國市場,Android操作系統(tǒng)的占有率達(dá)到83.4%,iOS占有率為15.2%,Windows Phone占有率為0.4%,其他各類操作系統(tǒng)的市場占有率之和約為1%[1]。
圖1 2014年9月中國地區(qū)移動(dòng)操作系統(tǒng)市場占有率
主流的移動(dòng)終端操作系統(tǒng)都已經(jīng)宣布開始支持IPv6,Android操作系統(tǒng)采用的是Linux 2.6以后版本的內(nèi)核,默認(rèn)安裝了IPv6協(xié)議棧,但尚不支持DHCPv6和ND RDNSS。使用Google Nexus 4最新的Android 4.4版本系統(tǒng)在Wi-Fi下測試時(shí),Android可以通過無狀態(tài)地址自動(dòng)配置獲取IPv6單播地址,但無法通過DHCPv6獲取IPv6地址。
在主流的移動(dòng)終端操作系統(tǒng)中,iOS對(duì)于IPv6的支持最為全面,各系統(tǒng)支持現(xiàn)狀如表1所示[2]。iOS 4開始在iPhone、iPod和iPad上加入對(duì)IPv6的支持。DHCPv6方面,iOS 4開始支持無狀態(tài)DHCPv6,iOS 4.3.1開始支持有狀態(tài)DHCPv6。iOS 6中進(jìn)一步增加了對(duì)于IPv6的支持,包括IPv6在LTE接口上的支持等。iOS用戶可以通過IPv6 Toolkit查看IPv6地址和路由信息[3]。
表1 主流移動(dòng)終端操作系統(tǒng)IPv6支持現(xiàn)狀
移動(dòng)終端對(duì)于IPv6終端的支持除了有賴于操作系統(tǒng)外,還有賴于基帶芯片。目前,大多數(shù)芯片都已經(jīng)支持IPv4/v6雙棧,高通2012年以后的產(chǎn)品都支持IPv4/v6雙棧,MTK芯片IPv4/v6解決方案也已經(jīng)通過了國外運(yùn)營商的測試[4]??梢?,目前主流的移動(dòng)芯片解決方案都已經(jīng)具備支持IPv4/v6雙棧的能力。
Android操作系統(tǒng)采用分層的架構(gòu),系統(tǒng)架構(gòu)如圖2所示。Android基于Linux內(nèi)核,并且針對(duì)手持設(shè)備的特點(diǎn)對(duì)電源管理、內(nèi)存管理和進(jìn)程間通信做了優(yōu)化,使Linux內(nèi)核更加適應(yīng)手機(jī)的硬件平臺(tái)。系統(tǒng)包含一些常用的C、C++庫,包括Google重寫的bionic C庫、媒體庫以及SQLite輕量級(jí)數(shù)據(jù)庫等核心庫。同時(shí),Android的所有APP都運(yùn)行在Dalvik虛擬機(jī)中。Android運(yùn)行時(shí)環(huán)境提供一個(gè)核心庫(Core Library),該核心庫包含了JAVA核心庫的大部分功能。系統(tǒng)框架Framework層提供開發(fā)人員使用的編程的API,它為Android應(yīng)用程序開發(fā)提供接口。最上面一層便是Android應(yīng)用層,普通用戶平時(shí)使用Android手機(jī)應(yīng)用都是工作在這一層。
圖2 Android操作系統(tǒng)架構(gòu)圖
Android采用Linux內(nèi)核,Linux Kernel從2.2版本就已經(jīng)開始支持IPv6。當(dāng)前,最新的Android 4.4采用的是3.4.0版本,默認(rèn)情況下,IPv6編譯選項(xiàng)已經(jīng)被打開;因此,除非終端廠商在編譯內(nèi)核將IPv6選項(xiàng)關(guān)閉,否則,IPv6協(xié)議棧是默認(rèn)安裝在操作系統(tǒng)中。目前,中國市場上大部分Android 4.0以上版本手機(jī)默認(rèn)安裝了IPv6協(xié)議棧。
Android使用的Bionic C庫已經(jīng)有支持IPv6的socket接口,IPv4和IPv6的socket接口并不兼容,移動(dòng)終端需要通過一定的機(jī)制解決IPv4/v6相互通信的問題。應(yīng)用方面,Google+、Google Map、Facebook等應(yīng)用支持IPv6訪問,并且當(dāng)前主流的瀏覽器Chrome、Firefox等也已經(jīng)支持IPv6訪問,但大部分應(yīng)用不支持IPv6,應(yīng)用開發(fā)者需要重寫部分代碼兼容IPv4/v6雙棧。
另外,Android中的開源DHCP客戶端dhcpcd已經(jīng)開始支持DHCPv6以及ND RDNSS,但從Android Open Source的更新情況來看,Android開源團(tuán)隊(duì)還沒有將支持DHCPv6的版本移植到Android平臺(tái)中,這也是目前Android平臺(tái)尚不支持DHCPv6的原因。
基于Android 4.4操作系統(tǒng),使用Google Nexus 4對(duì)IPv6的支持情況進(jìn)行了測試,測試環(huán)境為上海交通大學(xué)無線網(wǎng)絡(luò)環(huán)境。上海交通大學(xué)無線網(wǎng)絡(luò)已經(jīng)開啟IPv6協(xié)議棧,Android 4.4操作系統(tǒng)接入到無線網(wǎng)絡(luò)后可以獲取IPv6地址,能夠訪問IPv6網(wǎng)站,與PC可以實(shí)現(xiàn)IPv6互ping,如圖3所示。同時(shí),測試發(fā)現(xiàn)Android 4.4系統(tǒng)尚不支持動(dòng)態(tài)主機(jī)配置協(xié)議DHCPv6。
目前,大部分應(yīng)用都只支持IPv4網(wǎng)絡(luò),當(dāng)移動(dòng)網(wǎng)絡(luò)過渡到IPv6時(shí),為保證IPv4應(yīng)用在IPv6網(wǎng)絡(luò)中仍然能夠正常運(yùn)行,移動(dòng)終端廠商需要在操作系統(tǒng)層面進(jìn)行某種翻譯,將IPv4的網(wǎng)絡(luò)報(bào)文翻譯成IPv6的網(wǎng)絡(luò)報(bào)文。目前,常用的兩種終端翻譯機(jī)制主要為BIS (Bump into the Stack)和BIA (Bump into the API)。
圖3 Android 4.4支持IPv6情況測試
BIS翻譯機(jī)制(如圖4所示),將發(fā)出的IPv4包頭翻譯成IPv6包頭,將收到的IPv6包頭翻譯成IPv4包頭。Extension name resolver做地址解析的工作,按照返回的A記錄(IPv4)和AAAA記錄(IPv6)的對(duì)應(yīng)關(guān)系進(jìn)行地址翻譯,如果只有AAAA記錄返回,那么resolver會(huì)分配給這個(gè)AAAA記錄一個(gè)相應(yīng)的A記錄,這個(gè)A記錄不需要全球唯一,因?yàn)椴粫?huì)有IPv4的包傳輸?shù)骄W(wǎng)絡(luò)上。Address Mapper會(huì)維護(hù)AAAA記錄與A記錄的對(duì)應(yīng)關(guān)系。
如圖5所示,BIA翻譯機(jī)制與BIS翻譯機(jī)制類似,不同的是BIA并不是翻譯包頭,而是在socket API調(diào)用和TCP/IP協(xié)議棧之間插入翻譯模塊。按照這個(gè)原理,對(duì)于所有IPv4 socket的調(diào)用都會(huì)翻譯成對(duì)相應(yīng)IPv6 socket的調(diào)用,F(xiàn)unction Mapper會(huì)記錄IPv4/v6函數(shù)的映射關(guān)系。BIA相對(duì)于BIS有一定的優(yōu)勢,原因在于BIA獨(dú)立于網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng),并且不會(huì)引入額外的包頭翻譯開銷。
IPv4過渡到IPv6必須要考慮到大量為IPv4開發(fā)的應(yīng)用,因此,移動(dòng)終端廠商需要在操作系統(tǒng)層面引入相應(yīng)的翻譯機(jī)制,以保證IPv4到IPv6的平穩(wěn)過渡。
對(duì)于開發(fā)者而言,操作系統(tǒng)對(duì)于IPv4和IPv6編程接口是否一致影響巨大。如果IPv4和IPv6的接口兼容,那么當(dāng)網(wǎng)絡(luò)環(huán)境從IPv4過渡到IPv6中時(shí),開發(fā)人員無需對(duì)開發(fā)程序做很大改動(dòng),只需要將IPv4的地址改為IPv6地址即可。如果兩者不兼容,那么開發(fā)人員就需要重寫應(yīng)用中與網(wǎng)絡(luò)通信相關(guān)的代碼,這不僅給開發(fā)人員帶來不必要的麻煩,而且對(duì)IPv4向IPv6過渡也會(huì)產(chǎn)生很大阻力;因此,操作系統(tǒng)提供IPv4/IPv6兼容的接口十分重要。
Android操作系統(tǒng)通過SDK向開發(fā)者提供的Socket接口來自于Android架構(gòu)中的核心庫。Android核心庫包含了JAVA核心庫的大部分功能,Socket通信也包含其中。Android使用java.net提供Socket接口。采用JAVA編寫Socket Client程序,一個(gè)典型的例子如圖6所示[5]。
圖4 BIS翻譯機(jī)制框圖
圖5 BIA翻譯機(jī)制框圖
Android 4.0以后JAVA中的Socket接口同時(shí)支持IPv4和IPv6,JAVA Socket編程的接口十分簡單,只需要?jiǎng)?chuàng)建一個(gè)Socket套接字,便可以從中直接讀取數(shù)據(jù)信息。創(chuàng)建套接字的參數(shù)——為服務(wù)器的主機(jī)名或者IP地址,參數(shù)二為端口號(hào)。采用JAVA編寫Socket程序時(shí),如果第一個(gè)參數(shù)使用的是主機(jī)名的話,只要目標(biāo)主機(jī)也處在IPv6環(huán)境中,那么Socket程序無需做任何更改。如果第一個(gè)參數(shù)使用的是IP地址,只需要將IPv4地址改為IPv6地址即可。Java虛擬機(jī)底層會(huì)幫助開發(fā)者完成地址解析,在Socket創(chuàng)建的過程中,開發(fā)者不必關(guān)心創(chuàng)建的Socket類型。
圖6 JAVA Socket編程樣例
為測試在Android系統(tǒng)中是否同樣適用,文章編寫了一個(gè)測試程序。首先,在電腦上創(chuàng)建一個(gè)服務(wù)器,監(jiān)聽TCP的8888端口;然后,在Android系統(tǒng)上運(yùn)行一個(gè)測試APP,按鍵時(shí)將與電腦的服務(wù)器連接,連接后服務(wù)器會(huì)在命令行打印出一段指示信息。分別測試了Android采用全局單播地址、鏈路本地地址和IPv4地址等情況,測試情況如表2所示。
表2 Android Java IPv4/v6 Socket兼容測試
Android的另一個(gè)強(qiáng)大之處在于,在進(jìn)行Android開發(fā)時(shí),不僅可以使用JAVA語言進(jìn)行開發(fā),也可以使用C和C++語言開發(fā)自己的庫文件進(jìn)行調(diào)用,因此,Native層對(duì)于IPv4/v6兼容性也不可或缺。在Native層上采用C或者C++進(jìn)行開發(fā)時(shí),主要調(diào)用的是前文提到的Bionic C庫。
最初C庫中提供的Socket接口是不兼容的,因?yàn)樽畛鮨ibc庫中設(shè)計(jì)的函數(shù)并沒有考慮到IPv6的存在,但是新版本的C庫已經(jīng)提供了一系列IPv4/v6無關(guān)的API,使得使用C語言也可以創(chuàng)建IPv4/v6無關(guān)的Socket通信。
圖7給出了采用libc編程時(shí)IPv4/v6兼容性的代碼示例,其中上邊框圖中的Socket只支持IPv4,這是因?yàn)閯?chuàng)建Socket必須指定協(xié)議棧類型,代碼中明確指明了Socket協(xié)議棧類型為AF_INET,并且代碼中采用的主機(jī)名到地址的轉(zhuǎn)換函數(shù)gethostbyname只支持IPv4。而下邊框圖中的客戶端程序既支持IPv4又支持IPv6,這是因?yàn)槭褂昧诵碌膸旌瘮?shù)getifaddr,函數(shù)參數(shù)之一hints可以看做一個(gè)過濾器,hints.ai_family=AF_UNSPEC表示不指定IP協(xié)議類型,則getifaddr函數(shù)可以完成從主機(jī)名到IPv4或者IPv6地址的轉(zhuǎn)化;因此,該類型代碼可以兼容IPv4和IPv6,使用時(shí)如果使用主機(jī)名,則代碼不需做任何改動(dòng);如果使用IP地址,只需要將IPv4地址改為IPv6地址即可。服務(wù)器代碼同理,可以采用相似的方法實(shí)現(xiàn)。
圖7 IPv4/v6 socket兼容性客戶端代碼示例
最新的Android 4.4操作系統(tǒng)中提供的C庫函數(shù)已經(jīng)提供了getifaddr函數(shù),而且核心庫通過JNI技術(shù)實(shí)現(xiàn)的JAVA Socket接口也是通過上述兼容方法實(shí)現(xiàn)的。
綜上所述,開發(fā)者在開發(fā)Android應(yīng)用時(shí),應(yīng)盡量使用兼容的Socket接口和主機(jī)名參數(shù),避免硬編碼IP地址,這樣當(dāng)網(wǎng)絡(luò)環(huán)境從IPv4過渡到IPv6時(shí),原來開發(fā)的應(yīng)用基本上不用做任何修改,只需要將域名服務(wù)器中的A記錄替換為AAAA記錄即可。
隨著IPv4地址的耗盡和IPv6技術(shù)的成熟,IPv6的大規(guī)模部署將會(huì)成為通信產(chǎn)業(yè)的必然。在移動(dòng)互聯(lián)網(wǎng)時(shí)代,移動(dòng)終端特別是Android智能手機(jī)作為網(wǎng)絡(luò)主機(jī)的重要組成部分支持IPv6是十分必要的。
參考文獻(xiàn)
[1]Kantar Worldpanel.Smartphone OS market share[EB/OL].[2014-11-1].http://www.kantarworldpanel.com/global/smartphone-os-market-share/
[2]Wikipedia.Comparison of IPv6 support in operating systems[EB/OL].[2014-11-1].http://en.wikipedia.org/wiki/Comparison_of_IPv6_support_in_operating_systems
[3]曾晨曦,傅蓉蓉,匡曉 ,等.終端軟件的IPv6技術(shù)發(fā)展現(xiàn)狀[J].現(xiàn)代電信科技.2014(6):33-36
[4]嚴(yán)斌峰,張成巖,田新雪,等.IPv6終端關(guān)鍵技術(shù)研究與發(fā)展分析[J].信息通信技術(shù).2013,7(3):50-53
[5]Oracle,Networking IPv6 User Guide for JDK/JRE 5.0[EB/OL].[2014-11-1].http://docs.oracle.com/javase/1.5.0/docs/guide/net/ipv6_guide/index.html#using