欢迎来到学术参考网

构建基于java实现的IPv6环境下的FTP系统

发布时间:2015-11-17 09:52

摘 要:相对于目前广泛使用的IPv4协议,IPv6则是下一代的IP协议,注入了许多新的内容。随着互联网技术的飞速发展,IP协议将慢慢从IPv4过渡到IPv6。文件传输协议是互联网上广泛使用的在远程计算机系统和本地计算机系统之间传输文件的标准。本文提出了采用支持IPv6 Socket编程的JDK5.0,实现了绝大部分的FTP传输命令。

关键词:IPv6 FTP C/S JDK5.0
1、IPv 6简介
  随着互联网用户数量不断增长以及对互联网应用的要求不断提高,基于IPv4的现有互联网地址的不足逐渐凸现出来,另外,由于IPv4地址方案不能很好地支持地址汇聚,现有的互联网正面临路由表不断膨胀的压力,同时,对服务质量、移动性和安全性等方面的需求都迫切要求开发新一代IP协议。
  为了彻底解决互联网的地址危机,IETF早在20世纪90年代中期就提出了拥有128位地址的IPv6互联网协议,并在1998年进行了进一步的标准化工作。与传统的IPv4相比有以下的优势:采用128位地址长度、扩大了地址空间、提高了网络的整体吞吐量、服务质量得到很大改善、安全性有了更好的保证、支持即插即用和移动性、更好地实现了多播功能。
2、FTP传输模式和工作原理
  FTP(文件传输协议)是Internet上使用非常广泛的一种通讯协议,它是为Internet用户进行文件传输(包括文件的上传和下载)而制定的。FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。
3、FTP对IPv6的扩展
  FTP仅仅提供了建立在IPv4上进行数据通信的能力,它基于网络地址是32位这一假设。但当IPv6出现以后,地址就比32位长许多了。原来对FTP进行的扩展在多协议环境中有时会失败。因此我们必须针对IPv6对FTP再次进行扩展。本文主要说明一种在非IPv4上传送信息的方法,我们熟悉的两个FTP命令PORT和PASV通过扩展后,我们称它们为EPRT和EPSV。
  EPRT考虑到数据连接的扩展地址问题,扩展地址必须包括网络协议以及网络和传输地址。格式如下:
  EPRT<空格><网络协议><网络地址>
  EPRT后要跟空格,空格后面必须是分隔符,分隔符必须在ASCII的33到126范围之内。推荐使用,除非它已有它用。网络协议是一个数字,它指出使用的是什么协议。
  EPSV请求服务器在一个数据端口上侦听等待连接,它可以带参数。对它的响应是TCP端口号。响应的格式与EPRT参数的类似。而且响应还留下了网络协议和/或网络地址的空位,可以供以后使用。使用扩展地址进行被动模式的响应码必须是229。
  标准错误代码500和501对EPSV已经足够了。在EPSV命令没有使用参数时,服务器会基于控制连接所使用的协议选择数据连接使用的网络协议。但是在有代理的情况下,这种机制可能不合适。因此客户也需要能够要求一个指定协议。如果服务器返回说明它在指定端口不支持此协议,客户必须发送ABOR(放弃)命令使服务器关闭连接,然后客户再使用EPSV命令要求使用特定的网络协议,具体格式如下:
  EPSV<空格><网络协议>
  如果请求的网络协议是服务器支持的,那就必须使用此协议;如果不支持,则返回522。最后,EPSV命令可以使用参数""ALL""通过网络地址翻译器,EPRT命令不再使用。
4、FTP服务器基于Java在IPv6下的实现
  Socket是网络上运行的两个程序间双向通讯的一端,利用它可以较为方便的编写网络上数据的传递。在Java中,有专门的Socket类来处理用户的请求和响应。
  常用的Socket类型有两种:流式Socket和数据报式Socket。流式是一种面向连接的Socket,针对于面向连接的TCP服务应用;数据报式Socket是一种无连接的Socket,对应于无连接的UDP服务应用。Socket利用网间通信设施实现进程通信,但对通信设施的细节毫不关心,如右图所示。
  在Java中Socket可以理解为客户端或者服务器端的一个特殊的对象,这个对象有两个关键的方法,一个是getInputStream方法,另一个是getOutputStream方法。getInputStream方法可以得到一个输入流,其实就是从服务器端发回的数据流。GetOutputStream方法得到一个输出流,其实就是将要发送到服务器端的数据流,(其实是一个缓冲区,暂时存储将要发送过去的数据)。
  FTP是面向连接的TCP服务应用,分为服务器与客户端。在Java中,所有的服务器都要有以下的基本的步骤:
  (1)建立一个服务器socket并开始监听
  (2)使用accept()方法取得新的连接
  (3)建立输入和输出流
  (4)在已有的协议上产生会话
  (5)关闭客户端流和socket
  (6)回到第二步或者到第七步
  (7)关闭服务器socket
  相应的,所有的客户端程序也有下面的基本步骤:
  (1)建立客户端socket连接
  (2)得到socket的读和写的流
  (3)利用流
  (4)关闭流
  (5)关闭socket
  下面我们来描述IPv6是怎样工作于Java平台的:Java网络协议栈首先检测底层的操作系统是否支持IPv6,如果支持,它将尝试使用IPv6协议栈,更确定的是,在双协议栈系统里IPv6套接口将肯定被创建。在分离协议栈系统里则要复杂多了,Java会创建两个套接口,一个用于IPv4通信,一个用于IPv6通信。对于客户端的TCP程序,套接口一连接,IP协议的版本将被确定,同时多余的套接口就可以关闭了。对于服务端的TCP程序,因为无法预知下一个客户端请求的IP协议版本,两个套接口都需要维护。对于UDP程序,则两个套接口在通讯的整个周期里都是必需的。
5、FTP客户端的实现
  找一个优秀的适合我们需要的java FTP 客户端库并不简单。首先找到一个FTP客户端库需要一些时间,其次,在我们找到所有的存在的库后,我们该选哪一个呢?每个库都适合不同的需求。这些库在性能上是不等价的,并且它们的设计上有着根本上的差别。每个类库都各具特点并使用不同的术语来描述它们。因而,评价和比较FTP客户端库是一件困难的事情。jdk的jrelib路径里的,就带有FTP客户端库。所需的有包和InputStream,但并没有源文件代码。因此,需要利用Java的反编译命令javap,得到相关的类信息,属性和方法。在客户端的实现过程中我们主要要用到FtpClient、TelnetInputStream、和RandomAccessFile这三个类:
  FtpClient类定义在包中,负责客户端与服务端的通信,实现了客户端FTP传输的功能。
  TelnetInputStream类定义在sun. net包中,负责辅助完成FTP的传输,是一种输入输出类。
  RandomAccessFile类定义在包中,是一个随即访问的文件类。
6、系统环境配置
  以Redhat Linux 9为例介绍在Linux 操作系统中安装和配置IPv6协议。
  在RedHat9.0中,系统默认的内核版本为2.4.20-8,已经自带了IPv6这个模块,配置过程如下:
  以root用户登录
  (1)加载ipv6模块,运行命令insmod ipv6,然后用命令lsmod可以查看系统已加载的模块列表,若看到ipv6,则表示模块已经加载成功。用命令rmmod ipv6可以删除ipv6模块。
  (2)配置ipv6地址
  默认情况下,一旦加载了ipv6模块,系统会自动给网卡配置好ipv6的本地链路地址(link local address),这里地址的特点是以.中国数据通信,2005(5):32—36.

上一篇:基于J2EE和J2ME技术的移动学习系统的设计

下一篇:高职院校学生管理系统数据仓库的设计