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。