1.4.1 FTP的工作细节
与大多数Internet服务一样,FTP也是一个客户端/服务器系统。用户通过一个支持FTP的客户端程序连接到在远程主机上的FTP服务器程序。用户通过客户端程序向FTP服务器程序发出命令,FTP服务器程序执行用户所发出的命令,并将执行的结果返回到客户端。例如,客户端程序发出一条命令,要求FTP服务器向客户端传输某一个文件的一份副本,FTP服务器会响应这条命令,将指定文件送至客户端。客户端程序代表用户接收到这个文件,将其存放在用户目录中。
一个FTP服务器进程可以为多个客户进程提供服务。FTP服务器由两大部分组成:一个主进程,负责接收新的请求;若干从属进程,负责处理单个请求,如图1-23所示。下面是主进程的工作过程。
图1-23 FTP工作过程
(1)打开熟知端口(如21),使客户进程能够连接上。
(2)等待客户进程发送连接请求。
(3)启动从属进程处理客户进程发送的连接请求,从属进程处理完请求后结束,从属进程在运行期间可以根据需要创建其他一些子进程。
(4)回到等待状态,继续接收其他客户进程发起的请求,主进程与从属进程的处理是并发进行的。
FTP和其他协议不一样的地方就是客户端访问FTP服务器需要建立两个TCP连接,一个用来传输FTP命令(控制连接),另一个用来传输数据。FTP控制连接在整个会话期间都保持打开,只用来发送连接或传输请求。当客户进程向FTP服务器发送连接请求时,寻找连接服务器进程的熟知端口21,同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传输连接。接着,服务器进程用自己传输数据的熟知端口20与客户进程所提供的端口号码建立数据传输连接,FTP使用了两个不同的端口号,所以数据连接和控制连接不会混乱。
在FTP服务器上需要开放两个端口,一个命令端口(或称为“控制端口”)和一个数据端口。通常21端口是命令端口,20端口是数据端口。应注意的是,当混入主动或被动模式的概念时,数据端口就有可能不是20端口了。
FTP建立传输数据的TCP连接模式分为主动模式和被动模式。
1.主动模式FTP
主动模式下,FTP客户端从任意的非特殊端口1026( >1023)连入FTP服务器的命令端口——21端口,如图1-24所示。然后客户端在1027( +1)端口监听。
图1-24 FTP主动模式
第①步,FTP客户端提交PORT命令并允许FTP服务器回连它的数据端口(1027端口)。
第②步,FTP服务器返回确认。
第③步,FTP服务器向客户端发送TCP连接请求,目标端口为1027,源端口为20,为传输数据发起建立连接的请求。
第④步,FTP客户端发送确认数据报文ACK包,目标端口为20,源端口为1027,建立起传输数据的连接。
主动模式下FTP服务器防火墙只需要打开TCP的21端口和20端口,FTP客户端防火墙要将TCP端口号大于1023的端口全部打开。
主动模式下FTP的主要问题实际上在于客户端。FTP客户端并没有实际建立一个到FTP服务器数据端口的连接,它只是简单地告诉FTP服务器自己监听的端口号,FTP服务器再回来连接客户端这个指定的端口。对客户端的防火墙来说,这是从外部系统建立的到内部客户端的连接,通常会被阻塞,除非关闭客户端防火墙。
2.被动模式FTP
为了解决FTP服务器发起的到客户端的连接问题,人们开发了一种不同的FTP连接方式。这就是所谓的被动方式,或者叫作“PASV”,当客户端通知FTP服务器它处于被动模式时才启用。
在被动模式FTP中,命令连接和数据连接都由客户端发起,这样就可以解决从FTP服务器到客户端建立的数据传输连接请求被客户端防火墙过滤掉的问题,如图1-25所示。当开启一个FTP连接时,客户端打开两个任意的非特权的本地端口( >1024和 +1)。第一个端口连接服务器的21端口,但与主动模式的FTP不同,客户端不会提交PORT命令并允许服务器回连它的数据端口,而是提交PASV命令。这样做的结果是FTP服务器会开启一个任意的非特权的端口( >1024),并发送PORT P命令给客户端。然后客户端发起从本地端口 +1到FTP服务器的端口的连接用来传输数据。
图1-25 FTP被动模式
对FTP服务器端的防火墙来说,需要打开TCP的21端口和大于1023的端口。
第①步,客户端的命令端口与FTP服务器的命令端口建立连接,并发送命令PASV。
第②步,FTP服务器返回命令PORT 2024,告诉客户端服务器用哪个端口侦听数据连接。
第③步,客户端初始化一个从自己的数据端口到服务器端指定的数据端口的数据连接。
第④步,FTP服务器给客户端的数据端口返回一个ACK响应。
被动模式的FTP解决了客户端的许多问题,但同时给服务器端带来了更多的问题。最大的问题是需要允许从任意远程终端到FTP服务器高位端口的连接。幸运的是,许多FTP守护程序允许管理员指定FTP服务器使用的端口范围。