本方案立足于应用最为普遍的浏览器技术,而直接改写浏览器本身的代码是不现实的,因此我们采用一种比较直接的解决方案:在双协议栈主机的传输层中,借鉴传统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;i<len;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() { Socket 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