FTP – 概述

B. P. Blackshaw
Enterprise Distributed Technologies

1. 介绍

FTP(文件传输协议)是一个成熟的互联网协议,旨在使用TCP(传输控制协议)在网络上传输文件(和文件信息)。

FTP在征求意见959文件(RFC 959)中进行了定义,可以从互联网工程任务组(www.ietf.org)获得。

FTP需要一个客户端程序(FTP客户端)和一个服务器程序(FTP服务器)。客户端可以从服务器上获取文件和文件详情,也可以向服务器上传文件。服务器一般是有密码保护的。

FTP命令由客户端发起,客户端打开一个TCP连接,称为与服务器的控制连接。这个控制连接在客户端和服务器之间的整个会话期间使用。一个会话通常在客户端登录时开始,并在向服务器发送退出命令时结束。控制连接只用于发送FTP命令和读取服务器的回复--它从不用于传输文件。

每当要传输数据(通常是文件的内容)时,就会建立称为数据连接的瞬时TCP连接。例如,客户端通过控制通道发出命令,从服务器上检索文件。

2. 主动和被动模式

数据连接可以用两种不同的方式设置,即主动和被动。注意,主动和被动指的是FTP服务器的操作,而不是客户端。

2.1. 被动模式

在被动模式下,客户端向服务器发送PASV命令。这告诉服务器监听客户端的连接尝试,因此服务器是被动等待的。服务器向PASV回复服务器正在监听的主机和端口地址。客户端解读这个回复,当需要数据连接时,就会尝试在这个地址发起与服务器的连接。

2.2. 主动模式

在主动模式下,服务器主动连接到客户端。要设置主动模式,客户端向服务器发送PORT命令,指定客户端监听的地址和端口号。当需要数据连接时,服务器就会在这个地址发起对客户端的连接。

通常,服务器负责关闭数据连接。

3. FTP命令

通过控制连接发送的FTP命令由简单的文本字符串组成(并遵循Telnet协议-请参见RFC 854)。例如,要检索文件,客户端将控制连接上的"RETR文件名"发送到FTP服务器。要传输文件,客户端发送"STOR文件名"。

FTP服务器使用一个FTP回复来确认每个命令,它由三个数字和可读文本组成。第一个数字指示响应是好的、坏的还是不完整的。如果发生错误,则可以使用第二个数字来指示发生的错误类型。同样,第三个数字可以表示错误的更多详细信息。

第一个数字是很重要的,下面介绍五个可能的值:

1yz 肯定的初步答复。请求操作已启动,但在客户端发出另一命令之前,需要进行另一个回复
2yz 肯定的完成回复。请求的操作已成功完成,客户端可能会发出另一个命令
3yz 肯定的中间回复。命令已被接受,但需要更多信息。客户端应在回复中发送另一个命令。
4yz 暂时性的否定回答。命令失败,但可以重试。
5yz 永久否定完成回复。该命令失败,不应重复。

4. 情景示例

4.1 示例1

例如,更改客户端发送的目录:

CWD dirname

服务器以以下方式响应:

250个CWD命令成功

由于回复以 "2 "开头,我们知道命令序列已经完成。

但是,如果我们尝试将目录更改为不存在的目录:

CWD nonexistentdir

服务器以以下方式响应:

550 nonexistentdir: 系统不能找到指定文件。

当回复以"5"开头时,我们知道该命令失败,如果重复,它将再次失败(除非在服务器上创建了缺失的目录)。

4.2 示例2

要传输文本文件,我们向服务器发出"RETR"命令。但是要传输文件,我们需要设置数据连接。这可以使用主动模式或被动模式来完成。

如前所述,在主动模式下,客户端发送"PORT"命令,指示服务器应连接到的地址和端口号:

端口192,168,10,1,4,93

前四位是IP地址,后两位对端口号进行编码(在两个8位字段中,第一位是16位端口号的高阶位)。

服务器以以下方式响应:

200 PORT命令成功。

这表明数据连接已经建立。

接下来,发出'RETR'命令。

RETR abc.txt

服务器以以下方式响应:

150 打开abc.txt(70776字节)的ASCII模式数据连接。

回复以'1'开头,所以我们知道命令成功了,但服务器将发送另一个回复--在收到这个回复之前,客户端不能再发出另一个命令。

最终,服务器发送:

226 传输完成。

命令序列完成,文件已经传输完毕,客户端可以发出另一条命令。

有关第二位数的详细信息,请参见RFC 959,以及更多的例子。

请注意,大多数标准的命令行FTP客户端都支持调试模式,它可以显示正在向服务器发送的FTP命令,以及收到的回复字符串。在提示符下输入 "debug "通常会使客户端进入调试模式。

5. 数据类型

最常用的两种数据类型是ASCII和二进制。

ASCII是默认数据类型,用于传输文本文件。一行文本后面跟的是.NET协议。请注意,不同的操作系统使用不同的行结束符。

二进制类型(在FTP中称为IMAGE)用于传输二进制文件。对源文件进行逐个字节的复制。图形图像、视频和可执行文件都是二进制文件。如果以ASCII码传输,它们将被破坏。

6. 会话命令

要开始一个FTP会话,需要向服务器发送USER命令。

USER javaftp

服务器以以下方式响应:

331 javaftp需要密码。

客户端必须回复密码。

PASS mypassword

服务器以以下方式响应:

230 用户javaftp已登录。

现在会话已经建立,用户可以开始发出各种文件和目录相关的命令。

要结束会话,客户端发送:

退出

服务器以以下方式响应:

221

会话现在已经关闭,任何进一步向服务器发送命令的尝试都将失败。

7. 文件命令

FTP支持许多与文件相关的命令。

文件可以被删除(DELE)和重命名(RNFR,RNTO),也可以存储(STOR)和检索(RETR)。当一个文件被存储时,它可以被写入或附加到(APPE)。

更多详情请参见示例场景示例。

8. 目录命令

FTP支持各种目录相关的命令。

目录可以创建(MKD)、删除(RMD)或改为(CWD、CDUP)。

用FTP可以进行两种目录列表。

LIST方法获取一个文件(可能还有目录)的列表。如果指定了一个目录,服务器将返回目录中的文件列表,以及关于文件的系统特定信息。发送的文件信息根据服务器系统的不同而不同。对于这个文件名列表,数据类型应设置为ASCII。如果没有指定目录,则发送当前工作目录列表的详细信息。

NAME LIST(NLST)方法与LIST类似,但只返回文件名。没有发送关于文件的其他信息。同样,数据类型应设置为ASCII。