文件传输协议FTP(File Transfer Protocol)是因特网中使用最广泛的文件传输协议。FTP使用交互式的访问,允许客户指定文件的类型和格式(如指明是否使用ASCII码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输入有效的口令)。
文件传输协议有基于TCP的FTP和基于UDP的简单文件传输协议TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存取一个文件,就必须先获得一个本地的文件副本。如果要修改文件,只能对文件的副本进行修改,然后再将修改后的文件传回到原节点。
FTP屏蔽了各计算机系统的细节,因而适合在异构网络中任意计算机之间传送文件。FTP只提供文件传送的一些基本服务,它使用TCP可靠地运输服务,FTP主要功能是减小或消除在不同系统下处理文件的不兼容性。
FTP使用客户端-服务器模型,一个FTP服务器进程可以为多个客户进程提供服务。FTP服务器有两大部分组成:一个主进程,负责接受新的请求;还有若干从属进程,负责处理单个请求。主进程工作步骤
FTP工作时情况
FTP控制连接在整个会话期间都保持打开,只用来发送连接/传送请求。当客户进程向服务器发送连接请求时,寻找连接服务器进程的熟知端口21,同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口20与客户进程所提供的端口号码建立数据传送连接,FTP使用了2个不同的端口号,所以数据连接和控制连接不会混乱。
FTP协议规定了控制协议传送与存储的多种选择,在以下4个方面必须做出一个选择。
命令和应答在客户和服务器的控制连接上以 NVT ASCII码形式传送。这就要求在每行结尾都要返回C R、 L F对(也就是每个命令或每个应答)。这些命令都是3或4个字节的大写ASCII字符,其中一些带选项参数。从客户向服务器发送的FTP命令超过30种。下图是比较常用的几种命令:
应答都是A S C I I码形式的3位数字,并跟有报文选项。其原因是软件系统需要根据数字代码来决定如何应答,而选项串是面向人工处理的。由于客户通常都要输出数字应答和报文串,一个可交互的用户可以通过阅读报文串(而不必记忆所有数字回答代码的含义)来确定应答的含义。
FTP有两种工作模式,分别是主动模式(PORT)和被动模式(PASV)两种模式,这两种模式是按照FTP服务器的“角度”来说的,更通俗一点说就是:在传输数据时,如果是服务器主动连接客户端,那就是主动模式;如果是客户端主动连接服务器,那就是被动模式。关于主动模式和被动模式更具体的讲解请点击:图解FTP的主动模式与被动模式以及客户端设置。
不同的模式建立数据连接的方式有所不同。在两种模式下,都是客户端从一个随机端口N向FTP服务器的命令端口21建立TCP连接。
这个问题比较经典,也是一次面试被问到的问题。前面说过,通用传输方式是流方式,并且文件的结尾是以关闭数据连接为标志,这意味着对每一个文件传输或目录列表来说都要建立一个全新的数据连接。其一般过程如下:
图27- 4给出了第3步执行时的连接状态。假设客户用于控制连接的临时端口是 11 7 3,客户用于数据连接的临时端口是 11 7 4。客户发出的命令是PORT命令,其参数是6个ASCII中的十进制数字,它们之间由逗点隔开。前面 4个数字指明客户上的 I P地址,服务器将向它发出主动打开(本例中是 140.252.13.34),而后两位指明16 bit端口地址。由于16 bit端口地址是从这两个数字中得来,所以其值在本例中就是 4×256+150=1174。
图27-5给出了服务器向客户所在数据连接端发布主动打开时的连接状态。服务器的端点是端口20。
服务器总是执行数据连接的主动打开。通常服务器也执行数据连接的主动关闭,除非当客户向服务器发送流形式的文件时,需要客户来关闭连接(它给服务器一个文件结束的通知)。
HTTP本质上解决了FTP传输许多小而短的网络内容不方便的问题。
FTP通过一个有状态的控制连接(control connection)来维护当前的工作目录和其他flags,而数据传输需要另起一路连接(data connection)来实现。在被动模式下,data connection是由客户端向服务器发起的,而在默认的主动模式下,data connection则是由服务器向客户端发起。在主动模式下的这种明显的角色转换,以及所有传输都使用随机端口号,使得FTP在穿越防火墙和NAT时非常困难。相反,HTTP是无状态协议,并且控制和数据都被复用在一个从客户端到服务器的单一连接上,使用熟知端口,使得HTTP能够很容易穿透NAT网关和防火墙。
由于发送命令并等待接收响应的所需的往返时间,使得建立FTP连接的速度很慢,因此,一贯的处理是,建立起一条控制连接后即保持该连接的开放状态,该控制连接可用于多个文件的传输控制,而不是在多个文件之间反复地关闭并重建会话。相比之下,HTTP在最初的实现中,每当传输完一个文件(或其他数据)后,都会关闭连接,虽然后来HTTP也支持了重用一个TCP连接实现多次传输的功能,但其基本的概念模型仍然是独立的请求而非会话。
当FTP在数据连接上传输数据时,控制连接处于空闲状态,如果传输时间过长,防火墙或NAT会认为控制连接已断开而停止跟踪,从而使得文件下载中断。而HTTP连接仅在多个请求之间处于空闲态,因此在超时后将该连接断开是正常的,也是合理的。