基于双栈协议的IPV4向IPV6过渡方案设计
摘要 随着Internet网络在全球范围内的迅速扩大,应用日益增加,IP地址即将耗尽的矛盾更加突出,同时为解决IPv4的设计缺陷,国际互联网工程任务组开发了新一代Internet协议-IPv6,但由于IPv4与IPv6之间存在着很大的差异,同时存在众多基于IPv4协议的网络及应用,因此,要用新的IPv6代替旧的IPv4必然存在一个过渡时期。针对上述问题我们研究了一种过渡机制,并针对该过渡机制设计实现了浏览器模式的IPv4客户机对 IPv6服务器的访问。
关键词 IPv4 IPv6 过渡机制 双协议栈 代理服务 Java
前 言
如今,Internet在全球范围内的普及应用超过了历史上的任何一项新技术所产生的影响和带来的变化,实践证明,IPv4不仅是健壮的、而且是易于实现的,并具有很好的互操作性。这些都充分肯定了IPv4协议(IPv4 protocol)初始设计的正确性。但是随着Internet迅速发展,接入Internet的网络设备和运行在其上的应用程序急剧增加,由此带来了 IP地址的迅速耗尽与路由表膨胀等问题,对IP地址范围的扩大也迫在眉睫。针对IP地址的问题,IETF(Internet 工程任务组)提出了新一代网际互联协议――IPv6协议(IPv6 protocol),它不但解决了IPv4的地址问题,并且改善了IP协议的性能[1,2]。而在现阶段中,由于Internet完全是建立在IPv4的体系结构上,所有的应用程序也是按照IPv4格式书写的。因此如何由IPv4向IPv6过渡以及由此而产生的过渡机制成为了一个新的研究热点。针对IPv4向IPv6的过渡,我们研究了用双协议栈来过渡的方式,遵循IPv4中的代理服务机制,尝试实现了用Firefox为浏览器通过双协议栈的代理服务器访问基于IPv6的网页。
1 IPv4向IPv6的过渡
1.1 过渡的必然性
随着Internet应用范围的扩大,发现IPv4有着很多不可克服的问题,必须通过新的协议来最终替代。通常,协议的过渡是很不容易的,从IPv4向 IPv6的过渡也是如此。目前由于IPv4协议已经成功的使用了将近20年,基于IPv4的应用程序和设备已经相当成熟和具有相当的规模,不可能一夜之间完成所有升级变更。而另一方面,IPv6的应用程序和设备还不成熟完备,这样必然会出现许多孤立的IPv6网络。那么如何完成从IPv4向IPv6的过渡,是发展IPv6首要解决的问题。由此在相当长时间内,IPv6节点之间的通信还要依赖于原有IPv4网络的设施,同时IPv6节点也必不可少的要与 IPv4节点通信,因此过渡是不可避免的,并且过渡[3]必将是分布式的、渐进的进行。据专家的预测,过渡初期的 Internet将由少量运行 IPv6协议设备组成小的网络“孤岛”和大量运行 IPv4协议的设备组成的“海洋”组成。如图1所示:
图1:IPv4网络海洋中的IPv6孤岛 |
而随着时间的推移,IPv4的海洋将会逐渐变小,而IPv6的小岛不仅会越来越多,而且越来越大 ,并最终完全取代IPv4形成新的下一代Internet网络。
1.2 过渡策略的主要原则
考虑到网络技术的飞速发展和现实世界的商业需求,在进行IPv4网络向IPv6网络过渡策略的设计中,如下方向性问题必须遵循,在“下一代协议建议规范”(RFC1752)中,明确定义了以下的过渡原则:
1. 过渡方式应该是逐步的和渐进的,保护IPv4网络设备的投资,确保在一个相当长的历史阶段,IPv4网络设备可以在过渡时期中正常地独立使用。
2. IPv4网络世界和IPv6网络世界相互渗透,长期并存,这就要求IPv4和IPv6网络设备彼此可以互连互通,实现互操作。
3. IPv4网络世界向IPv6网络世界过渡过程中,IPv4向IPv6升级的费用应尽可能地低,过渡技术应尽可能地简单,以尽快地吸引广大用户主动的向IPv6过渡。
由于IPv4协议和IPv6协议之间不具有相关性,因此IPv4和IPv6体系结构之间还需要构建相关的过渡机制来支持二者无缝地并存。
2 过渡方案设计与实现
2.1 IPv4/IPv6双协议栈代理服务器原理
借鉴传统的IPv4代理服务器原理,联想到在一台代理服务器上安装具有IPv4/IPv6双协议栈,那么代理服务器就可以作为IPv4客户端向IPv6服务器的“中转站”,从而实现两者间的间接通信。其具体实现原理如图2。
图2 IPv4应用程序通过代理访问IPv6服务器 |
2.2 IPv4/IPv6过度方案设计与实现
本方案立足于应用最为普遍的浏览器技术,而直接改写浏览器本身的代码是不现实的,因此我们采用一种比较直接的解决方案:在双协议栈主机的传输层中,借鉴传统IPv4的传输层代理机制对IPv4和IPv6协议进行“转换”,从而让仅支持IPv4的应用程序无需升级就能够“无缝”地访问纯IPv6服务。这样我们只需对代理服务器编程,同时利用socket的独立于网络协议的特性,通过编写程序完成对socket套接字中某些参数的修改,让代理服务器调用系统的 IPv6协议栈来通信,实现接入IPv6。实现上述设计思路的关键就是对编写修改完成对socket套接字中某些参数的修改并完成调用,下面是构造代理服务器过程相关代码提炼如下:
//
在给定
Socket
上创建一个代理线程。
public HttpProxy(Socket s) { socket=s; start(); }
public void writeLog(int c, boolean browser) throws IOException {
log.write(c);
}
public void writeLog(byte[] bytes,int offset,
int len, boolean browser) throws IOException {
for (int i=0;ilen;i++) writeLog((int)bytes[offset+i],browser);
}
public String processHostName(String url, String host, int port, Socket sock) {
java.text.DateFormat cal=java.text.DateFormat.getDateTimeInstance();
System.out.println(cal.format(new java.util.Date()) + " - " +
url + " " + sock.getInetAddress()+"BR>");
return host;
//
执行操作的线程
public void run() {
S
ocket outbound=null;
try {
socket.setSoTimeout(TIMEOUT);
InputStream is=socket.getInputStream();
OutputStream os=null;
……
outbound.setSoTimeout(TIMEOUT);
os=outbound.getOutputStream();
os.write(line.getBytes());
os.write(' ');
os.write(host0.getBytes());
os.write(' ');
……
……
和所有线程对象一样,HttpProxy类的主要工作在run方法内完成。run方法实现了一个简单的状态机,从Web浏览器每次一个读取字符,持续这个过程直至有足够的信息找出目标Web服务器。然后,run打开一个通向该Web服务器的Socket(如果有多个代理服务器被链接在一起,则run方法打开一个通向链里面下一个代理服务器的Socket)。打开Socket之后,run先把部分的请求写入Socket,然后调用pipe方法。pipe方法直接在两个Socket之间以最快的速度执行读写操作。完成了代理服务器程序的设计后,要使得客户端能使用代理,还需要在客户端的浏览器进行相应的设置,即在浏览器中配置代理服务器,这样就完成了全部过程。
3 结论
Internet的发展趋势将证明IPv4必将会被IPv6所替代,但其过渡过程也一定会是一个漫长的、艰难的。因此,对过渡问题的研究不仅有利于完成过渡,而且还能保障Internet网络长期稳定运行。本设计不仅能够完成转换同时采用较低成本模式,形成一个解决方案,系统测试的结果表明所采取的技术是合理的,能够满足实际运行需要。
参考文献
[1]周玲,尹霞, 吴建平. 实现IPv4向IPv6过渡的隧道技术.计算机工程与应用,2002:156
[2]Jim Bound, L aurent Toutain. Dual Stack transition mechanism(DSTM) http://www.ietf.org/interner-drafts/draft-ietf-ngtrans-dstm-00.txt, October,1999
[3]R.Hinden . RFC2732: Format for Literal IPv6 Address in URL’s , 2002-12
评论