APP下载

Android平台下移动终端IPv6技术分析与研究

2015-05-13

信息通信技术 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电缆终端及中间接头