?

Android平臺下移動終端IPv6技術分析與研究

2015-05-13 23:30
信息通信技術 2015年2期
關鍵詞:開發者代碼終端

李 強 李 強 王 賡

1 上海交通大學 上海 200240

2 希姆通信息技術(上海)有限公司 上海 200335

引言

TCP/IP協議族是Internet國際互聯網的基礎,其定義了電子設備連入因特網以及數據傳輸的標準,其中,IPv4功不可沒。但隨著互聯網的快速發展,網絡主機和用戶數量急劇增加,IPv4地址正日益枯竭。為解決IP地址不足的問題,IETF(Internet Engineering Task Force,國際互聯網工程任務組)設計制定了下一代網絡層協議IPv6,用于替代現行的IPv4版本。

在不斷擴充的網絡主機中,智能移動終端特別是智能手機占了很大一部分比例。手機操作系統對于IPv6的支持是移動互聯網支持IPv6的重要一環。伴隨著4G網絡的建設,IPv6在4G網絡中也將得到廣泛應用。目前,雖然已經有部分適應IPv6網絡的應用,但大部分應用仍只適用于IPv4網絡,終端廠商在實現IPv6功能時,必須要考慮IPv4到IPv6的平穩過渡問題。同時,對于開發者而言,在開發新的應用時也要考慮后續應用遷移到IPv6網絡的需求。

1 移動終端操作系統IPv6支持現狀

目前,主流的移動操作系統主要包括Android、iOS、Windows Phone等。得益于Google免費開源的優勢,Android操作系統在中國市場長期處于主導地位,近幾年市場占有率一直處于上升勢態。如圖1所示,Kantar Worldpanel在2014年9月份進行的消費者調查結果顯示,在中國市場,Android操作系統的占有率達到83.4%,iOS占有率為15.2%,Windows Phone占有率為0.4%,其他各類操作系統的市場占有率之和約為1%[1]。

圖1 2014年9月中國地區移動操作系統市場占有率

主流的移動終端操作系統都已經宣布開始支持IPv6,Android操作系統采用的是Linux 2.6以后版本的內核,默認安裝了IPv6協議棧,但尚不支持DHCPv6和ND RDNSS。使用Google Nexus 4最新的Android 4.4版本系統在Wi-Fi下測試時,Android可以通過無狀態地址自動配置獲取IPv6單播地址,但無法通過DHCPv6獲取IPv6地址。

在主流的移動終端操作系統中,iOS對于IPv6的支持最為全面,各系統支持現狀如表1所示[2]。iOS 4開始在iPhone、iPod和iPad上加入對IPv6的支持。DHCPv6方面,iOS 4開始支持無狀態DHCPv6,iOS 4.3.1開始支持有狀態DHCPv6。iOS 6中進一步增加了對于IPv6的支持,包括IPv6在LTE接口上的支持等。iOS用戶可以通過IPv6 Toolkit查看IPv6地址和路由信息[3]。

表1 主流移動終端操作系統IPv6支持現狀

移動終端對于IPv6終端的支持除了有賴于操作系統外,還有賴于基帶芯片。目前,大多數芯片都已經支持IPv4/v6雙棧,高通2012年以后的產品都支持IPv4/v6雙棧,MTK芯片IPv4/v6解決方案也已經通過了國外運營商的測試[4]??梢?,目前主流的移動芯片解決方案都已經具備支持IPv4/v6雙棧的能力。

2 Android操作系統IPv6分析

Android操作系統采用分層的架構,系統架構如圖2所示。Android基于Linux內核,并且針對手持設備的特點對電源管理、內存管理和進程間通信做了優化,使Linux內核更加適應手機的硬件平臺。系統包含一些常用的C、C++庫,包括Google重寫的bionic C庫、媒體庫以及SQLite輕量級數據庫等核心庫。同時,Android的所有APP都運行在Dalvik虛擬機中。Android運行時環境提供一個核心庫(Core Library),該核心庫包含了JAVA核心庫的大部分功能。系統框架Framework層提供開發人員使用的編程的API,它為Android應用程序開發提供接口。最上面一層便是Android應用層,普通用戶平時使用Android手機應用都是工作在這一層。

圖2 Android操作系統架構圖

Android采用Linux內核,Linux Kernel從2.2版本就已經開始支持IPv6。當前,最新的Android 4.4采用的是3.4.0版本,默認情況下,IPv6編譯選項已經被打開;因此,除非終端廠商在編譯內核將IPv6選項關閉,否則,IPv6協議棧是默認安裝在操作系統中。目前,中國市場上大部分Android 4.0以上版本手機默認安裝了IPv6協議棧。

Android使用的Bionic C庫已經有支持IPv6的socket接口,IPv4和IPv6的socket接口并不兼容,移動終端需要通過一定的機制解決IPv4/v6相互通信的問題。應用方面,Google+、Google Map、Facebook等應用支持IPv6訪問,并且當前主流的瀏覽器Chrome、Firefox等也已經支持IPv6訪問,但大部分應用不支持IPv6,應用開發者需要重寫部分代碼兼容IPv4/v6雙棧。

另外,Android中的開源DHCP客戶端dhcpcd已經開始支持DHCPv6以及ND RDNSS,但從Android Open Source的更新情況來看,Android開源團隊還沒有將支持DHCPv6的版本移植到Android平臺中,這也是目前Android平臺尚不支持DHCPv6的原因。

基于Android 4.4操作系統,使用Google Nexus 4對IPv6的支持情況進行了測試,測試環境為上海交通大學無線網絡環境。上海交通大學無線網絡已經開啟IPv6協議棧,Android 4.4操作系統接入到無線網絡后可以獲取IPv6地址,能夠訪問IPv6網站,與PC可以實現IPv6互ping,如圖3所示。同時,測試發現Android 4.4系統尚不支持動態主機配置協議DHCPv6。

2.1 終端廠商的考慮——IPv4/v6互通

目前,大部分應用都只支持IPv4網絡,當移動網絡過渡到IPv6時,為保證IPv4應用在IPv6網絡中仍然能夠正常運行,移動終端廠商需要在操作系統層面進行某種翻譯,將IPv4的網絡報文翻譯成IPv6的網絡報文。目前,常用的兩種終端翻譯機制主要為BIS (Bump into the Stack)和BIA (Bump into the API)。

圖3 Android 4.4支持IPv6情況測試

BIS翻譯機制(如圖4所示),將發出的IPv4包頭翻譯成IPv6包頭,將收到的IPv6包頭翻譯成IPv4包頭。Extension name resolver做地址解析的工作,按照返回的A記錄(IPv4)和AAAA記錄(IPv6)的對應關系進行地址翻譯,如果只有AAAA記錄返回,那么resolver會分配給這個AAAA記錄一個相應的A記錄,這個A記錄不需要全球唯一,因為不會有IPv4的包傳輸到網絡上。Address Mapper會維護AAAA記錄與A記錄的對應關系。

如圖5所示,BIA翻譯機制與BIS翻譯機制類似,不同的是BIA并不是翻譯包頭,而是在socket API調用和TCP/IP協議棧之間插入翻譯模塊。按照這個原理,對于所有IPv4 socket的調用都會翻譯成對相應IPv6 socket的調用,Function Mapper會記錄IPv4/v6函數的映射關系。BIA相對于BIS有一定的優勢,原因在于BIA獨立于網絡設備驅動,并且不會引入額外的包頭翻譯開銷。

IPv4過渡到IPv6必須要考慮到大量為IPv4開發的應用,因此,移動終端廠商需要在操作系統層面引入相應的翻譯機制,以保證IPv4到IPv6的平穩過渡。

2.2 開發者的考慮——IPv4/v6兼容API

對于開發者而言,操作系統對于IPv4和IPv6編程接口是否一致影響巨大。如果IPv4和IPv6的接口兼容,那么當網絡環境從IPv4過渡到IPv6中時,開發人員無需對開發程序做很大改動,只需要將IPv4的地址改為IPv6地址即可。如果兩者不兼容,那么開發人員就需要重寫應用中與網絡通信相關的代碼,這不僅給開發人員帶來不必要的麻煩,而且對IPv4向IPv6過渡也會產生很大阻力;因此,操作系統提供IPv4/IPv6兼容的接口十分重要。

2.2.1 Android Java Socket接口兼容性

Android操作系統通過SDK向開發者提供的Socket接口來自于Android架構中的核心庫。Android核心庫包含了JAVA核心庫的大部分功能,Socket通信也包含其中。Android使用java.net提供Socket接口。采用JAVA編寫Socket Client程序,一個典型的例子如圖6所示[5]。

圖4 BIS翻譯機制框圖

圖5 BIA翻譯機制框圖

Android 4.0以后JAVA中的Socket接口同時支持IPv4和IPv6,JAVA Socket編程的接口十分簡單,只需要創建一個Socket套接字,便可以從中直接讀取數據信息。創建套接字的參數——為服務器的主機名或者IP地址,參數二為端口號。采用JAVA編寫Socket程序時,如果第一個參數使用的是主機名的話,只要目標主機也處在IPv6環境中,那么Socket程序無需做任何更改。如果第一個參數使用的是IP地址,只需要將IPv4地址改為IPv6地址即可。Java虛擬機底層會幫助開發者完成地址解析,在Socket創建的過程中,開發者不必關心創建的Socket類型。

圖6 JAVA Socket編程樣例

為測試在Android系統中是否同樣適用,文章編寫了一個測試程序。首先,在電腦上創建一個服務器,監聽TCP的8888端口;然后,在Android系統上運行一個測試APP,按鍵時將與電腦的服務器連接,連接后服務器會在命令行打印出一段指示信息。分別測試了Android采用全局單播地址、鏈路本地地址和IPv4地址等情況,測試情況如表2所示。

表2 Android Java IPv4/v6 Socket兼容測試

2.2.2 Android Native C/C++ Socket接口兼容性

Android的另一個強大之處在于,在進行Android開發時,不僅可以使用JAVA語言進行開發,也可以使用C和C++語言開發自己的庫文件進行調用,因此,Native層對于IPv4/v6兼容性也不可或缺。在Native層上采用C或者C++進行開發時,主要調用的是前文提到的Bionic C庫。

最初C庫中提供的Socket接口是不兼容的,因為最初libc庫中設計的函數并沒有考慮到IPv6的存在,但是新版本的C庫已經提供了一系列IPv4/v6無關的API,使得使用C語言也可以創建IPv4/v6無關的Socket通信。

圖7給出了采用libc編程時IPv4/v6兼容性的代碼示例,其中上邊框圖中的Socket只支持IPv4,這是因為創建Socket必須指定協議棧類型,代碼中明確指明了Socket協議棧類型為AF_INET,并且代碼中采用的主機名到地址的轉換函數gethostbyname只支持IPv4。而下邊框圖中的客戶端程序既支持IPv4又支持IPv6,這是因為使用了新的庫函數getifaddr,函數參數之一hints可以看做一個過濾器,hints.ai_family=AF_UNSPEC表示不指定IP協議類型,則getifaddr函數可以完成從主機名到IPv4或者IPv6地址的轉化;因此,該類型代碼可以兼容IPv4和IPv6,使用時如果使用主機名,則代碼不需做任何改動;如果使用IP地址,只需要將IPv4地址改為IPv6地址即可。服務器代碼同理,可以采用相似的方法實現。

圖7 IPv4/v6 socket兼容性客戶端代碼示例

最新的Android 4.4操作系統中提供的C庫函數已經提供了getifaddr函數,而且核心庫通過JNI技術實現的JAVA Socket接口也是通過上述兼容方法實現的。

綜上所述,開發者在開發Android應用時,應盡量使用兼容的Socket接口和主機名參數,避免硬編碼IP地址,這樣當網絡環境從IPv4過渡到IPv6時,原來開發的應用基本上不用做任何修改,只需要將域名服務器中的A記錄替換為AAAA記錄即可。

3 總結

隨著IPv4地址的耗盡和IPv6技術的成熟,IPv6的大規模部署將會成為通信產業的必然。在移動互聯網時代,移動終端特別是Android智能手機作為網絡主機的重要組成部分支持IPv6是十分必要的。

參考文獻

[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技術發展現狀[J].現代電信科技.2014(6):33-36

[4]嚴斌峰,張成巖,田新雪,等.IPv6終端關鍵技術研究與發展分析[J].信息通信技術.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

猜你喜歡
開發者代碼終端
X美術館首屆三年展:“終端〉_How Do We Begin?”
通信控制服務器(CCS)維護終端的設計與實現
創世代碼
創世代碼
創世代碼
創世代碼
GSM-R手持終端呼叫FAS失敗案例分析
“85后”高學歷男性成為APP開發新生主力軍
16%游戲開發者看好VR
ABB Elastimold 10kV電纜終端及中間接頭
91香蕉高清国产线观看免费-97夜夜澡人人爽人人喊a-99久久久无码国产精品9-国产亚洲日韩欧美综合