浅析FTP的工作原理
FTP概述
起初,FTP并不是应用于IP网络的协议,而是ARPANEt网络中计算机之间的文件传输协议。阿帕网是美国国防部建立的旧网络,在1960-1980年间使用。那时,FTP的主要功能是在主机之间高速可靠地传输文件。目前,FTP仍然保持其可靠性,甚至在今天,它允许远程访问文件。这允许用户在一个系统上工作,并在其他系统上存储文件。例如,如果用户运行Web服务器,需要从远程主机获取HTML文件和CGI程序以便在这台计算机上工作,他需要从远程存储站点获取文件(远程站点也需要安装Web服务器)。当用户完成工作后,他们可以使用FTP将文件发送回Web服务器。使用这种方法,用户不需要使用Telnet登录到远程主机来工作,这使得Web服务器的更新变得如此容易。
FTP是TCP/IP的具体应用。它工作在OSI模型的第七层和TCP模型的第四层,也就是应用层。与UDP不同,FTP客户端在与服务器建立连接之前,必须经历一个众所周知的“三次握手”过程。它带来的意义是客户端和服务器之间的连接是可靠的,面向连接的。
接下来,我们来看看FTP客户端是如何连接服务器的(以标准FTP端口号为例)。
首先,与HTTP协议不同,FTP只需要一个端口进行连接(HTTP的默认端口是80,FTP的默认端口是21)。FTP需要两个端口,一个端口是控制连接端口,是端口21,用于向服务器发送指令,等待服务器响应;另一个端口是数据传输端口,端口号为20(仅端口模式),用于建立数据传输通道,主要有三个功能
从客户端向服务器发送文件。
从服务器向客户发送文件。
从服务器向客户发送文件或目录列表。
其次,FTP连接方式有两种,端口和PASV。端口模式是主动模式,PASV是被动模式,这些都是相对于服务器而言的。为了让大家对这两种模式有一个清晰的认识,分别以郎悦的明星为例。
端口模式
当FTP客户端以端口模式连接到服务器时,他动态选择一个端口号(本实验中为6015)连接到服务器的21号端口。注意这个端口号必须在1024以上,因为1024之前的端口已经提前定义好了,当然是被一些典型的服务使用。经过TCP的三次握手后,连接(控制通道)建立(如图1和图2所示)。现在,如果用户想要列出服务器上的目录结构(使用ls或dir命令),那么应该首先建立一个数据通道,因为只有数据通道才能传输目录和文件列表。这时用户会发出一个端口命令,告诉服务器连接到哪个端口建立数据通道(这个命令是通过控制通道发送给服务器的)。当服务器接收到这个命令时,服务器将使用20个端口连接到用户在port命令中指定的端口号来发送目录列表(如图3所示)。当这个操作完成时,FTP客户端可能想要下载一个文件,所以它将发出一个get命令。请注意,此时客户端将再次发送端口命令,告诉服务器要连接到哪个“新”端口。您可以首先使用命令netstat -na来验证上次使用的6044是否已经处于TIME_WAIT状态(如图4所示)。当这个新的数据传输通道建立后(在微软的系统中,客户端通常使用连续端口,也就是说,这次客户端将使用端口6045),文件传输开始。
PASV模式
但是,当FTP客户端以PASV模式连接到服务器时,情况就有些不同了。在初始化连接的过程中,也就是连接到服务器,这个过程和端口模式是一样的。不同的是,当FTP客户端发送ls、dir、get等需要返回数据的命令时,他发送给服务器的不是端口命令,而是PASV命令。在这个命令中,用户告诉服务器连接到服务器的某个端口。如果这个服务器上的这个端口空空闲可用,那么服务器会返回ACK的确认信息,然后建立数据传输通道,返回用户需要的信息(根据用户发送的指令,比如ls,dir,get等。);如果服务器的这个端口被另一个资源使用,那么服务器返回UNACK的信息,然后FTP客户端会再次发送PASV命令,也就是所谓的连接建立的协商过程。为了验证这个过程,我们不得不使用常用的FTP客户端软件CUTEFTP Pro,因为微软自己的FTP命令客户端不支持PASV模式。虽然您可以使用QUOTE PASV命令强制PASV模式,但是当您使用ls命令列出服务器目录时,您会发现它仍然使用端口模式连接到服务器。现在我们使用CUTEFTP Pro在PASV模式下连接到服务器(如图5所示)。请注意连接日志里有这些话:
命令: > PASV
227进入被动模式(127,0,0,1,26,108)
命令:>列表
状态:>连接ftp数据套接字127.0.0.1: 6764...
125数据连接已经打开;转移。
226传输完成。
其中
227进入被动模式(127,0,0,1,26,80)。26x256+108 = 6760,用于客户端在PASV模式下连接到服务器。(当然,服务器应该支持这种模式)
125数据连接已经打开;转移中。指示服务器的该端口可用,并返回ACK信息。
我们来看看用CUTEFTP Pro在端口模式下连接服务器。日志中有这样的记录:
命令:> port127,0,0,1,28,37
200 PORT命令成功。
COMMAND:> LIST
150打开/bin/ls的ASCII模式数据连接。
状态: >接受连接:127.0.0.1: 20。
226传输完成。
状态: >传输完成。
其中,
PORT 127,0,0,1,28,37在收到这个端口指令后告诉服务器连接FTP客户端的28x256+37=7205端口。
接受连接:127.0.0.1: 20是指服务器收到指令后用端口20连接到端口7205,被FTP客户端接受。
对比分析
在这两个例子中,请注意,端口模式下数据传输通道的建立是由服务器发起的,服务器使用20个端口连接一个大于客户端1024的端口;在PASV模式下,数据传输通道的建立由FTP客户端发起,客户端使用大于1024的端口连接到服务器的1024以上的端口。从C/S模式的角度来看,如果端口对于服务器来说是出站的,PASV模式对于服务器来说是入站的,请特别注意这一点,尤其是在使用防火墙的企业,比如发布一个使用微软的ISA Server 2000的FTP服务器,这一点非常关键。如果设置错误,客户将无法连接。
最后请注意,在FTP客户端连接服务器的整个过程中,控制通道始终是连接的,而数据传输通道是临时建立的。
本文中,郎月星重点介绍FTP的连接方式,不涉及FTP的其他内容,如FTP的文件类型、格式控制、传输方式等。不过你可能不需要花太多时间去理解这些规范,因为现在流行的FTP客户端都可以自动选择正确的模式来处理,而且FTP服务器上通常会有一些限制,比如
type: A S C I I或者image。
格式控制:只允许非打印。
Structure:只允许文件结构。
传输模式:仅允许流模式。
至于这些内容,由于篇幅有限,我不想在这里介绍。希望这篇文章能对大家有所帮助,尤其是正在学习ISA Server2000的人和对FTP了解不多的人。
好,就这样。希望大家可以和我交流。
0条评论