1、浅析 FTP 的工作原理FTP 协议概述起初, FTP 并不是应用于 IP 网络上的协议,而是 ARPANEt 网络中计算机间的文件传输协议, ARPANET 是美国国防部组建的老网络,于 1960-1980 年使用。在那时, FTP 的主要功能是在主机间高速可靠地传输文件。目前 FTP 仍然保持其可靠性,即使在今天,它还允许文件远程存取。这使得用户可以在某个系统上工作,而将文件存贮在别的系统。例如,如果某用户运行 Web 服务器,需要从远程主机上取得 HTML 文件和 CGI 程序在本机上工作,他需要从远程存储站点获取文件(远程站点也需安装 Web 服务器)。当用户完成工作后,可使用 FTP
2、 将文件传回到 Web 服务器。采用这种方法,用户无需使用 Telnet 登录到远程主机进行工作,这样就使 Web 服务器的更新工作变得如此的轻松。FTP 是 TCP/IP 的一种具体应用,它工作在 OSI 模型的第七层,TCP 模型的第四层上,即应用层,使用 TCP 传输而不是 UDP,这样 FTP 客户在和服务器建立连接前就要经过一个被广为熟知的 “三次握手“的过程,它带来的意义在于客户与服务器之间的连接是可靠的,而且是面向连接,为数据的传输提供了可靠的保证。下面,让我们来看看,一个 FTP 客户在和服务器连接是怎么样的一个过程(以标准的 FTP 端口号为例) 。首先,FTP 并不像 HT
3、TP 协议那样,只需要一个端口作为连接( HTTP 的默认端口是 80,FTP 的默认端口是 21) ,FTP 需要 2 个端口,一个端口是作为控制连接端口,也就是 21 这个端口,用于发送指令给服务器以及等待服务器响应;另一个端口是数据传输端口 ,端口号为 20(仅 PORT 模式) ,是用来建立数据传输通道的,主要有 3 个作用从客户向服务器发送一个文件。从服务器向客户发送一个文件。从服务器向客户发送文件或目录列表。其次,FTP 的连接模式有两种,PORT 和 PASV。PORT 模式是一个主动模式,PASV 是被动模式,这里都是相对于服务器而言的。为了让大家清楚的认识这两种模式,朗月繁星
4、分别举例说明。PORT 模式当 FTP 客户以 PORT 模式连接服务器时,他动态的选择一个端口号(本次试验是 6015)连接服务器的 21 端口,注意这个端口号一定是 1024 以上的,因为 1024 以前的端口都已经预先被定义好,被一些典型的服务使用,当然有的还没使用,保留给以后会用到这些端口的资源服务。当经过 TCP 的三次握手后,连接(控制信道)被建立(如图 1 和图 2) 。现在用户要列出服务器上的目录结构(使用ls 或 dir 命令),那么首先就要建立一个数据通道,因为只有数据通道才能传输目录和文件列表,此时用户会发出 PORT 指令告诉服务器连接自己的什么端口来建立一条数据通道(
5、这个命令由控制信道发送给服务器) ,当服务器接到这一指令时,服务器会使用 20 端口连接用户在 PORT 指令中指定的端口号,用以发送目录的列表(如图 3) 。当完成这一操作时,FTP 客户也许要下载一个文件,那么就会发出 get 指令,请注意,这时客户会再次发送 PORT 指令,告诉服务器连接他的哪个“新“端口,你可以先用 netstat -na 这个命令验证,上一次使用的 6044 已经处于 TIME_WAIT 状态(如图 4)。当这个新的数据传输通道建立后(在微软的系统中,客户端通常会使用连续的端口,也就是说这一次客户端会用 6045 这个端口 ),就开始了文件传输的工作。PASV 模式
6、然而,当 FTP 客户以 PASV 模式连接服务器时,情况就有些不同了。在初始化连接这个过程即连接服务器这个过程和 PORT 模式是一样的,不同的是,当 FTP 客户发送 ls、dir 、get 等这些要求数据返回的命令时,他不向服务器发送 PORT 指令而是发送 PASV 指令,在这个指令中,用户告诉服务器自己要连接服务器的某一个端口,如果这个服务器上的这个端口是空闲的可用的,那么服务器会返回 ACK 的确认信息,之后数据传输通道被建立并返回用户所要的信息(根据用户发送的指令,如 ls、dir、get 等) ;如果服务器的这个端口被另一个资源所使用,那么服务器返回 UNACK 的信息,那么这
7、时,FTP 客户会再次发送 PASV 命令,这也就是所谓的连接建立的协商过程。为了验证这个过程我们不得不借助 CUTEFTP Pro 这个大家经常使用的 FTP 客户端软件,因为微软自带的 FTP 命令客户端,不支持 PASV 模式。虽然你可以使用 QUOTE PASV 这个命令强制使用 PASV 模式,但是当你用 ls 命令列出服务器目录列表,你会发现它还是使用 PORT 方式来连接服务器的。现在我们使用 CUTEFTP Pro 以 PASV 模式连接服务器(如图 5) ,请注意连接 LOG 里有这样几句话:COMMAND: PASV227 Entering Passive Mode (12
8、7,0,0,1,26,108)COMMAND: LISTSTATUS: Connecting ftp data socket 127.0.0.1: 6764.125 Data connection already open; Transfer starting.226 Transfer complete.其中,227 Entering Passive Mode (127,0,0,1,26,80). 代表客户机使用 PASV 模式连接服务器的 26x256+108=6764 端口。 (当然服务器要支持这种模式)125 Data connection already open; Transfer
9、starting.说明服务器的这个端口可用,返回 ACK 信息。再让我们看看用 CUTEFTP Pro 以 PORT 模式连接服务器的情况。其中在 LOG 里有这样的记录:COMMAND: PORT 127,0,0,1,28,37200 PORT command successful.COMMAND: LIST150 Opening ASCII mode data connection for /bin/ls.STATUS: Accepting connection: 127.0.0.1:20.226 Transfer complete.STATUS: Transfer complete.其中
10、,PORT 127,0,0,1,28,37 告诉服务器当收到这个 PORT 指令后,连接 FTP 客户的 28x256+37=7205 这个端口。Accepting connection: 127.0.0.1:20 表示服务器接到指令后用 20 端口连接 7205 端口,而且被 FTP 客户接受。比较分析在这两个例子中,请注意: PORT 模式建立数据传输通道是由服务器端发起的,服务器使用 20 端口连接客户端的某一个大于 1024的端口;在 PASV 模式中,数据传输的通道的建立是由 FTP 客户端发起的,他使用一个大于 1024 的端口连接服务器的 1024 以上的某一个端口。如果从 C/
11、S 模型这个角度来说,PORT 对于服务器来说是 OUTBOUND,而 PASV 模式对于服务器是 INBOUND,这一点请特别注意,尤其是在使用防火墙的企业里,比如使用微软的 ISA Server 2000 发布一个 FTP 服务器,这一点非常关键,如果设置错了,那么客户将无法连接。最后,请注意在 FTP 客户连接服务器的整个过程中,控制信道是一直保持连接的,而数据传输通道是临时建立的。在本文中,朗月繁星把重点放到了 FTP 的连接模式,没有涉及 FTP 的其他内容,比如 FTP 的文件类型(Type) ,格式控制(Format control)以及传输方式( Transmission mo
12、de)等。不过这些规范大家可能不需要花费过多的时间去了解,因为现在流行的FTP 客户端都可以自动的选择正确的模式来处理,对于 FTP 服务器端通常也都做了一些限制,如下类型:A S C I I 或图像。格式控制:只允许非打印。结构:只允许文件结构。传输方式:只允许流方式至于这些内容,限于篇幅朗月繁星在这里就不想再介绍了。希望这篇文章能对大家有些帮助,特别是正在学习 ISA Server2000 的朋友和一些对 FTP 不很了解的朋友。OK,就此驻笔了,希望大家与我交流。 图示图 1: FTP 客户使用 FTP 命令建立于服务器的连接图 2:用 netstat 命令查看,控制信道被建立在客户机的 6015 和服务器的 20 端口图 3: ls 命令是一个交互命令,它会首先与服务器建立一个数据传输通道。经验证本次试验客户机使用 6044 端口图 4:使用 netstat 命令验证上一次使用 ls 命令建立的数据传输通道已经关闭点这里看详图 图 5:使用 CUTEFTP Pro 以 PASV 模式连接服务器