Java虚拟机支持IPV6的实现方法

文档序号:6610723阅读:286来源:国知局
专利名称:Java虚拟机支持IPV6的实现方法
技术领域
本发明涉及到Java程序设计语言和Socket网络设计技术,涉及到java虚拟机技术。
背景技术
在互联网技术发展进程中,人们普遍认为IPv6最终取代IPv4是大势所趋,几乎无限的地址容量是IPv6最根本的优势。IPv4的32位地址方案最多可以容纳43亿个潜在的网络地址,而早期的地址分配又非常浪费,导致网络IP地址使用效率低下。随着互联网应用类型日趋复杂,终端形式特别是移动终端更加多样化,全球独立IP地址的提供必将面临沉重的压力。而IPv6的128位地址格式可支持的IP地址数量为10亿的平方,从而彻底解决IP地址枯竭的问题。
Java语言是Sun公司推出的跨平台面向对象的高级程序设计语言,目前正在各个领域获得越来越广泛的应用,已经成为最重要的程序设计语言之一。Java虚拟机是一台抽象的计算机,其主要任务是装载class文件并且执行其中的字节码,其对于用户的体验是负责运行一个Java程序。
目前,Java虚拟机正逐渐成为中高端移动终端的标准配置,终端IP地址对于Java在线应用以及OTA网络应用下载安装都是必须的,终端用户数量的大量增加对目前逐渐枯竭的IPv4网络地址资源提出了很大的挑战性。为了解决这一难题,在终端设备上推广IPv6技术将是很好的解决办法之一,但目前IPv6技术除了在PC互联网领域取得一些研究成果,进行了相应的实验网研究外,在手机等终端设备上的研究成果还非常罕见。在这种情况下,Java虚拟机作为终端设备上的业务之一,其对IPv6技术的支持还没有相应的指导性规范,目前国内外各大著名研发机构(如Sun、NOKIA等)开发的Java虚拟机仍然只支持IPv4技术。

发明内容
本发明所解决的技术问题在于提供Java虚拟机支持IPV6的实现方法,以解决Java虚拟机不支持IPv6技术的问题。
为了解决上述问题,本发明提供了一种Java虚拟机支持IPv6的实现方法,应用于TCP类型的网络连接结构中,其特征在于,包括以下步骤(1)利用AF INET6获取socket套接字;(2)根据IPv6协议设置数据结构体addrinfo对网络信息进行初始化操作;(3)通过标准接口getaddrinfo利用所述初始化的信息和入参的主机名获取与待连接的IPv6网络地址关联的信息,根据该信息所述Java虚拟机通过标准的socket函数建立支持IPv6的网络连接和数据收发。
本发明所述的方法,其中,步骤(3)中所述IPv6网络地址关联的信息,包括根据步骤(1)建立socket连接所需的套接字地址信息。
为了解决上述问题,本发明还提供了一种Java虚拟机支持IPv6的实现方法,应用于UDP类型的网络连接结构中,其特征在于,包括以下步骤(1)所述Java虚拟机中的Java层利用网络地址字符串替代整型IP地址;(2)更改所述Java虚拟机的KNI接口参数;(3)针对所述Java虚拟机KNI接口参数的变更,重新设计KNI函数;(4)根据重新设计KNI函数修改所述Java虚拟机与平台操作系统接口C代码层,建立支持IPv6的网络连接和数据收发。
本发明所述的方法,其中,所述步骤(4)进一步包括(41)利用AF_INET6获取socket套接字;
(42)根据IPv6协议设置数据结构体addrinfo对网络信息进行初始化操作,同时根据重新设计KNI函数修改所述Java虚拟机的socket函数类型ai_socktype以及协议ai_protocol分别设置为SOCK_DGRAM和IPPROTO_UDP,并且网络连接不需要指定网络地址名称;(43)根据重新设计KNI函数修改平台操作系统接口C代码层,建立支持IPv6的网络连接和数据收发。
其中,所述步骤(42)进一步包括利用getaddrinfo获取网络地址信息时设置为null。
本发明所述的方法,其中,所述KNI接口参数包括网络地址字符串以及整型端口号。
本发明所述的方法,其中,所述接口C代码层为本地接口层。
本发明所述的方法,其中,所述数据收发,为根据KNI接口做相应的调整,通过getaddrinfo对网络地址字符串进行解析,以获取对应的IPv6地址信息并将其填入地址结构中,而后从该地址获取UDP数据或者将UDP数据发送到该地址。
本发明所述的方法,其中,步骤(4)进一步包括获取本地的IPv6网络地址字符串,通过gethostbyname获得本地网络地址字符串,再根据IPv6的网络地址格式利用字符串操作方式进行格式转换。
采用本发明所述方法,与现有技术相比,实现了Java虚拟机从IPv4到IPv6的过渡,从而可以缓减Java应用对IPv4有限网络地址资源的需求,同时拓展了虚拟机对多种网络协议的支持。


图1是本发明实施例所述的应用于TCP类型的网络连接结构中的Java虚拟机支持IPV6的实现方法流程图;图2是本发明实施例所述的应用于UDP类型的网络连接结构中的Java虚拟机支持IPV6的实现方法流程图。
具体实施例方式
本发明的目的是介绍Java虚拟机支持IPV6的实现方法,以解决Java虚拟机不支持IPv6技术的问题。以下对具体实施方式
进行详细描述,但不作为对本发明的限定。
Java虚拟机涉及到互联网的操作主要有两种方式TCP和UDP,本发明将分别针对这两种方式提供相应的IPv4过渡到IPv6的实现方法。本发明解决其技术问题所采用的技术方案如下对于TCP方式众所周知,为了达到IPv4到IPv6的顺利过渡,使IPv6系统能够向后兼容IPv4系统,IPv6接口函数相对于IPv4改动并不大,其主要的改动集中在地址结构和地址解析函数上,这些改动是32位地址过渡到128位地址所必需的,其他诸如网络数据的收发以及网络设置操作均沿用了IPv4的实现方式。
Java虚拟机的TCP操作在Java层兼容IPv4和IPv6(主要体现在支持IPv6地址的HTTP网络地址解析),Java虚拟机相对平台操作系统的接口与具体的网络技术无关,即Java虚拟机在TCP方式下操作,涉及到socket操作的实现全部集中在C代码层,从而使得Java虚拟机在TCP层从IPv4过渡到IPv6的实现比较简单,在Java虚拟机与平台操作系统接口的C代码层根据IPv4和IPv6的实现差异进行相应的修改即可。
Java虚拟机TCP网络操作不论在Java层还是KNI层,其代码本身对IPv4和IPv6具有良好的兼容性。IPv4与IPv6最大的区别在于网络地址格式以及处理这些网络地址接口函数的不同,Java虚拟机的TCP网络实现在Java和KNI代码层本身并没有涉及到网络地址的专函等操作,网络地址在Java虚拟机内部以主机名字符串和端口号的形式存在,从而避免了Java虚拟机对网络地址格式的敏感性,基于这种原因,Java虚拟机在TCP层从IPv4过渡到IPv6所需做的变动主要体现在涉及网络地址结构和地址解析函数的接口上面,或者说仅仅针对网络连接(socket connect)一个操作,其他诸如数据的收发等等操作在IPv4和IPv6上并没有任何区别。Java虚拟机一旦建立TCP连接,其在之后的数据收发过程中将不再涉及到网络地址的操作,从而使得虚拟机从IPv4道IPv6的转换变得很简单。
根据IPv4和IPv6二者之间的差异,结合附图1所示,Java虚拟机进行TCP连接操作时步骤101,首先需要利用AF_INET6获取socket套接字;步骤102,然后根据IPv6协议的特性设置数据结构体addrinfo对网络信息进行初始化操作,在对addrinfo进行初始化操作时主要的工作是指定该地址结构体的协议簇,如ipv6协议;步骤103,接下来通过标准接口getaddrinfo利用上述初始化的数据和入参的主机名获取与待连接的IPv6网络地址关联的信息,该信息中包含了建立socket连接所需的套接字地址信息sockaddr,根据这个数据结构的内容,通过标准的socket函数connect即可完成基于IPv6地址的网络连接操作。
对于UDP方式相对于TCP网络连接,UDP的数据收发并非基于可靠的网络连接。虚拟机在进行UDP网络数据收发过程中,其实现方式与TCP有较大的差别,除了上述TCP层所涉及到的平台操作系统接口的C代码层外,虚拟机在Java层的UDP代码实现完全基于IPv4技术,如虚拟机在Java层的UDP操作利用64位长整型存储转换后的整形网络IP地址,显然,这对于IPv6128位的地址会造成溢出,从而导致虚拟机UDP层的IPv6实现要复杂的多。结合附图2所示,具体实现方式如下步骤201,在Java虚拟机中的Java层利用网络地址字符串替代整型IP地址,使虚拟机在Java层兼容IPv4和IPv6地址;步骤202,更改Java虚拟机的KNI(KVM Native Interface)接口函数,使虚拟机在KNI层兼容IPv4和IPv6地址;步骤203,针对Java虚拟机KNI接口的变更,重新设计KNI函数;步骤204,利用IPv6的专用函数修改Java虚拟机与平台操作系统接口C代码层,包括网络连接以及数据收发等等,实现虚拟机从IPv4到IPv6的过渡。
由于UDP基于非可靠网络连接的特性,虚拟机在进行UDP网络连接时仅会利用网络端口号而并不会涉及到网络地址,所有的网络地址解析均在进行UDP数据收发时完成,这是UDP和TCP网络操作最大的不同之处。目前,Java虚拟机UDP网络操作的整个数据流程都绑定在IPv4之上,不论Java还是KNI层的代码都是基于IPv4方式实现的,要实现虚拟机从IPv4过渡到IPv6,达到虚拟机在UDP实现上兼容IPv4和IPv6,首先需要进行IPv4相关代码的剥离,包括Java层实现和KNI接口的重新设计、KNI相关代码的实现以及平台操作系统相关底层接口的IPv6实现,其具体的实现原理如下(1)Java层UDP数据收发现有的Java虚拟机在UDP协议层通过64位整型存储网络IP地址值,网络地址的解析和转换在本地C代码层实现。显然,这种实现方式完全不适合IPv6地址,128位的IPv6地址如果按照现有的方式转换成整型肯定会产生溢出,因此需要对该实现方式进行重新设计。Java虚拟机进行UDP网络连接时并未涉及网络地址操作(仅针对端口号),因此重新设计实现主要针对UDP数据的收发,即receive和send。有两种方式可以选择1、利用64位整型数组存储IPv6的IP地址值;优点在于对整个java虚拟机的代码结构调整较小,但缺点是IPv6地址转换成整型的实现难度较大,同时这种方式不易做到虚拟机对IPv4和IPv6的兼容;2、直接利用网络地址字符串替代整型IP地址值;这种方案的代码实现以及接口方式变化较大,但实现相对比较简单,且可以使java虚拟机兼顾IPv4和IPv6,相比之下采用第二种方案。
首先对Java虚拟机收发数据的KNI接口根据第二种方案进行重新设计,将网络地址字符串和端口号设置为上述两个接口的参数。
Java虚拟机通过上述KNI接口实现UDP数据的收发,Java代码在调用这些本地接口时需要对相应的Java代码做一定调整,需要改变整型网络地址的操作方式,用网络地址字符串进行替换,这种方式忽略了IPv4和IPv6地址格式之间的差异,从而达到兼容IPv4和IPv6的目的。
(2)KNI层UDP数据收发Java虚拟机KNI实现需要符合Java规范。KNI接口的实现需要适应接口参数的变化,不同类型的参数类型需要采用不同的处理方式,如参数的声明以及数据的读取等等。对于KNI接口新增的网络地址字符串以及整型端口号这两个参数的处理,Java虚拟机KNI规范有相应的规范进行约束。
(3)本地接口层的数据收发本地接口层与平台操作系统紧密相关,本地接口层的UDP数据收发依赖于平台操作系统侧的实现方式。上述实现方式的调整和重新设计从虚拟机内部剥离了采用不同的网络技术所造成的影响,最终使得虚拟机在UDP网络操作上能够同时兼容IPv4和IPv6。接下来的工作只是如何使java虚拟机在平台操作系统符合IPv6的实现要求;Java虚拟机UDP操作在本地接口层的操作主要涉及到三个方面的修改网络连接-connect、接收数据-receive和发送数据-send。其中UDP网络socket连接实现方式与TCP操作大致相同,不同之处在于网络地址信息结构addrinfo初始化时,UDP必须将socket类型ai_socktype以及协议ai_protocol分别设置为SOCK_DGRAM和IPPROTO_UDP,同时UDP类型的网络socket连接不需要指定网络地址名称,在利用getaddrinfo获取网络地址信息时可将其设置为null。
而在UDP数据收发过程中,由于不再采用类似IPv4整型网络地址的实现方式,这里的接口形式也需要根据KNI接口做相应的调整,通过getaddrinfo对网络地址主机名称(字符串格式)进行解析,以获取对应的IPv6地址信息并将其填入地址结构中,而后从该地址获取UDP数据或者将UDP数据发送到该地址。
除上述几点外,另外一个值得注意的是如何获取本地的IPv6网络地址(字符串),该地址由IPv6服务器为手机分配。如何获取本地IPv6网络地址的方式不同于IPv4,获取本地IPv4网络地址通过gethostbyname即可实现,而获取IPv6地址在此基础之上还需要根据IPv6的网络地址格式利用字符串操作方式进行格式转换。
本发明分别从Java虚拟机两个主要的网络流程(TCP和UDP)介绍了如何使虚拟机满足IPv6网络操作的方法,该方法在实际的项目中验证是可行的。目前,还没有其他研究机构发布过有关Java虚拟机支持IPV6协议的研究成果。该方法不但可以为其它类型的虚拟机(如高通的QVM)提供实现参考,同时为在Java虚拟机上开展基于IPv6的数据业务提供了可靠的保证。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员可根据本发明做出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
权利要求
1.一种Java虚拟机支持IPv6的实现方法,应用于TCP类型的网络连接结构中,其特征在于,包括以下步骤(1)利用AF_INET6获取socket套接字;(2)根据IPv6协议设置数据结构体addrinfo对网络信息进行初始化操作;(3)通过标准接口getaddrinfo利用所述初始化的信息和入参的主机名获取与待连接的IPv6网络地址关联的信息,根据该信息所述Java虚拟机通过标准的socket函数建立支持IPv6的网络连接和数据收发。
2.如权利要求1所述的方法,其特征在于,步骤(3)中所述IPv6网络地址关联的信息,包括根据步骤(1)建立socket连接所需的套接字地址信息。
3.一种Java虚拟机支持IPv6的实现方法,应用于UDP类型的网络连接结构中,其特征在于,包括以下步骤(1)所述Java虚拟机中的Java层利用网络地址字符串替代整型IP地址;(2)更改所述Java虚拟机的KNI接口参数;(3)针对所述Java虚拟机KNI接口参数的变更,重新设计KNI函数;(4)根据重新设计KNI函数修改所述Java虚拟机与平台操作系统接口C代码层,建立支持IPv6的网络连接和数据收发。
4.如权利要求4所述的方法,其特征在于,所述步骤(4)进一步包括(41)利用AF_INET6获取socket套接字;(42)根据IPv6协议设置数据结构体addrinfo对网络信息进行初始化操作,同时根据重新设计KNI函数修改所述Java虚拟机的socket函数类型ai_socktype以及协议ai_protocol分别设置为SOCK_DGRAM和IPPROTO_UDP,并且网络连接不需要指定网络地址名称;(43)根据重新设计KNI函数修改平台操作系统接口C代码层,建立支持IPv6的网络连接和数据收发。
5.如权利要求4所述的方法,其特征在于,所述步骤(42)进一步包括利用getaddrinfo获取网络地址信息时设置为null。
6.如权利要求3所述的方法,其特征在于,所述KNI接口参数包括网络地址字符串以及整型端口号。
7.如权利要求3所述的方法,其特征在于,所述接口C代码层为本地接口层。
8.如权利要求3所述的方法,其特征在于,所述数据收发,为根据KNI接口做相应的调整,通过getaddrinfo对网络地址字符串进行解析,以获取对应的IPv6地址信息并将其填入地址结构中,而后从该地址获取UDP数据或者将UDP数据发送到该地址。
9.如权利要求3所述的方法,其特征在于,步骤(4)进一步包括获取本地的IPv6网络地址字符串,通过gethostbyname获得本地网络地址字符串,再根据IPv6的网络地址格式利用字符串操作方式进行格式转换。
全文摘要
本发明公开了Java虚拟机支持IPv6的实现方法,通过修改Java虚拟机网络操作模块对应的本地接口层和协议层,实现了Java虚拟机对IPv6协议的支持,使得同一个在IPv4环境下运行的Java应用能够在IPv6环境下运行,从而实现了Java虚拟机从IPv4到IPv6的转换,这对于在手机上推广基于IPv6的Java数据业务具有非常重要的意义。
文档编号G06F9/445GK101079904SQ20071012619
公开日2007年11月28日 申请日期2007年6月15日 优先权日2007年6月15日
发明者何平 申请人:中兴通讯股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1