F T P与我们已描述的另一种应用不同,它采用两个 T C P连接来传输一个文件。
这些细节均由两个协议解释器来完成。标有“用户接口”的方框功能是按用户所需提供各种交互界面(全屏幕菜单选择,逐行输入命令,等等),并把它们转换成在控制连接上发送的 F T P命令。类似地,从控制连接上传回的服务器应答也被转换成用户所需的交互格式。
从图中还可以看出,正是这两个协议解释器根据需要激活文件传送功能。
F T P协议规范提供了控制文件传送与存储的多种选择。在以下四个方面中每一个方面都必须作出一个选择。
如果算一下所有这些选择的排列组合数,那么对传输和存储一个文件来说就有 7 2种不同的方式。幸运的是,其中很多选择不是废弃了,就是不为多数实现环境所支持,所以我们可以忽略掉它们。 通常由U n i x实现的FTP 客户和服务器把我们的选择限制如下: • 类型:A S C I I或图像。 • 格式控制:只允许非打印。 • 结构:只允许文件结构。 • 传输方式:只允许流方式。
这就限制我们只能取一、两种方式: A S C I I或图像(二进制)。该实现满足主机需求 R F C的最小需求(该 R F C也要求能支持记录结构,但只有操作系统支持它才行,而U n i x不行)。
很多非U n i x的实现提供了处理它们自己文件格式的 F T P功能。主机需求R F C指出“F T P协议有很多特征,虽然其中一些通常不实现,但对 F T P中的每一个特征来说,都存在着至少一种实现”。
命令和应答在客户和服务器的控制连接上以 NVT ASCII码形式传送。这就要求在每行结尾都要返回C R、L F对(也就是每个命令或每个应答)。
从客户发向服务器的 Te l n e t命令(以I A C打头)只有中断进程( < I A C , I P >)和Te l n e t的同步信号(紧急方式下 < I A C , D M >)。我们将看到这两条 Te l n e t命令被用来中止正在进行的文件传输,或在传输过程中查询服务器。另外,如果服务器接受了客户端的一个带选项的 Te l n e t命令(W I L L,W O N T,D O或D O N T),它将以DONT 或W O N T响应。
这些命令都是3或4个字节的大写A S C I I字符,其中一些带选项参数。从客户向服务器发送的F T P命令超过3 0种。图2 7 - 2给出了一些常用命令,其中大部分将在本章再次遇到。
下节我们将通过一些例子看到,在用户交互类型和控制连接上传送的 F T P命令之间有时是一对一的。但也有些操作下,一个用户命令产生控制连接上多个 F T P命令。
应答都是A S C I I码形式的3位数字,并跟有报文选项。其原因是软件系统需要根据数字代码来决定如何应答,而选项串是面向人工处理的。由于客户通常都要输出数字应答和报文串,一个可交互的用户可以通过阅读报文串(而不必记忆所有数字回答代码的含义)来确定应答的含义。
应答3位码中每一位数字都有不同的含义(我们将在第 2 8章看到简单邮件传送输协议,S M T P,使用相同的命令和应答约定)。 图2 7 - 3给出了应答代码第1位和第2位的含义。
第3位数字给出差错报文的附加含义。例如,这里是一些典型的应答,都带有一个可能的报文串。 • 125 数据连接已经打开;传输开始。 • 200 就绪命令。 • 214 帮助报文(面向用户)。 • 331 用户名就绪,要求输入口令。 • 425 不能打开数据连接。 • 452 错写文件。 • 500 语法错误(未认可的命令)。 • 501 语法错误(无效参数)。 • 502 未实现的M O D E (方式命令)类型。 通常每个F T P命令都产生一行回答。例如, Q U I T命令可以产生如下应答:
221 Goodbye.
如果需要产生一条多行应答,第1行在3位数字应答代码之后包含一个连字号,而不是空格,最后一行包含相同的3位数字应答代码,后跟一个空格符。例如,HELP命令可以产生如下应答:
数据连接有以下三大用途:
F T P服务器把文件列表从数据连接上发回,而不是控制连接上的多行应答。这就避免了行的有限性对目录大小的限制,而且更易于客户将目录列表以文件形式保存,而不是把列表显示在终端上。
我们已说过,控制连接一直保持到客户-服务器连接的全过程,但数据连接可以根据需要随时来,随时走。那么需要怎样为数据连接选端口号,以及谁来负责主动打开和被动打开?首先,我们前面说过通用传输方式( U n i x环境下唯一的传输方式)是流方式,并且文件结尾是以关闭数据连接为标志。这意味着对每一个文件传输或目录列表来说都要建立一个全新的数据连接。其一般过程如下:
服务器总是执行数据连接的主动打开。通常服务器也执行数据连接的主动关闭,除非当客户向服务器发送流形式的文件时,需要客户来关闭连接(它给服务器一个文件结束的通知)。
客户也有可能不发出P O RT命令,而由服务器向正被客户使用的同一个端口号发出主动打开,来结束控制连接。这是可行的,因为服务器面向这两个连接的端口号是不同的:一个是2 0,另一个是2 1。不过,下节我们将看到为什么现有实现通常不这样做。