FTP再学习 (三)

来源:互联网 发布:java 字符串转成字节 编辑:程序博客网 时间:2024/05/21 22:36
<script type="text/javascript"><!--google_ad_client = "pub-5143338080895292";/* 728x90, created 4/10/08 */google_ad_slot = "8165396160";google_ad_width = 728;google_ad_height = 90;//--></script> <script type="text/javascript"src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>

4) FTP数据连接管理

另外,FTP命令和应答在客户和服务器的控制连接上以NVT ASCII码形式传送,这就要求每行结尾都要返回CR、LF字符对。而服务器向客户端传送文件和目录列表时使用数据连接而非控制连接上的多行应答,这样可以避免行的有限性限制目录和文件的数量。

数据连接默认在客户端和服务器端使用TCP20端口,但客户端此端口号可以更改。它主要有以下三个用途:
    i) 从客户向服务器发送一个文件。
    ii) 从服务器向客户发送一个文件。
    iii) 从服务器向客户发送文件或目录列表。

控制连接在整个FTP会话期间将一直保持,而数据连接则是按需创建,文件传输完成后即被关闭。那么需要怎样为数据连接选端口号,以及谁来负责主动打开和被动打开?

 Unix环境下唯一的传输方式是流方式(stream),并且文件结尾是以关闭数据连接为标志。这意味着对每一个文件传输或目录列表来说都要建立一个全新的数据连接。其一般过程如下:

 i). 客户通常在客户端主机上为所在数据连接端选择一个临时端口号X开始侦听。
 ii) 客户使用PORT命令从控制连接上把端口号X发向服务器。
 iii) 服务器在控制连接上接收端口号,并向客户端主机上的端口X发布一个连接请求。服务器的数据连接端一直使用20端口(Active模式下)。

这也就是说服务器端总是执行数据连接的主动打开。通常服务器也执行数据连接的主动关闭,除非当客户向服务器发送流形式的文件时,需要客户来关闭连接(它给服务器一个文件结束的通知)。

但是这种模式对于使用NAT或者在防火墙后的客户端来讲有着致命的缺点:这种客户端是无法被外部主机访问到的,或者是由于防火墙的阻隔,或者是由于NAT(Network Address Translation)技术。这也是PASV模式产生的原因。

在上面提到的Active模式下,服务器端使用本地20端口向客户端端口X发送一个连接请求。出于安全方面的考虑,客户端的防火墙不会允许这个请求通过;或者是在NAT的情况下,服务器端只能连接到客户端的代理服务器,而不是实际的客户端本身。实际上目前的企业环境中防火墙和NAT技术是同时使用的。

为了解决这个问题,在Passive(PASV)模式下,客户端并不使用port命令,相反它发送一个PASV命令;服务器接到这个命令后,随机选择一个本地非特权端口N(N>1023)并在控制连接上通过port命令将N告知客户端,而客户端此时选择一个端口向服务器的N端口发出连接请求;由于客户端防火墙一般都会允许由内向外的数据流,因此这个连接可以完成。

由此带来的一个问题是,服务器端的防火墙就需要允许任何对大于1023端口的TCP连接请求。这会引起潜在的安全问题。因而大部分的FTP服务器实现都允许管理员指定它产生的数据端口的范围,那么防火墙规则就可以根据这个范围进行设定,将隐患大大降低。

待续......