FTP协议介绍

FTP协议

协议格式

控制连接报文格式

控制连接的请求报文内容由FTP命令及参数构成,基本的FTP命令及其格式如下:

这些命令是通过控制连接传输的Telnet字符串,其中FTP命令字符串对大小写不敏感(例如,RETR、Retr、retr、ReTr都可以表示retrieve命令),参数字段的所有字符都是ASCII字符,表示NVT-ASCII下的空格,表示NVT-ASCII下的(回车符,换行符),用以表示命令的结尾。

进一步,上述命令中的参数字段格式的BNF表示法如下所示:

FTP命令根据功能可分为三类:
1) 访问控制命令
用以指定访问控制标识符。
2) 传输参数命令
用以更改传输参数的默认值,所有传输参数都具有默认值。
3) FTP服务命令
定义文件传输或用户请求的文件系统功能。
具体单个指令的功能释义可参见RFC 0959(https://tools.ietf.org/html/rfc959)。

每个FTP命令都会生成至少一个回复,控制连接的回复报文格式:
由三位数字(传输为三个字母数字字符)和一些文本组成。
xyz
在文本过长超过一行最大值时,会产生多行回复:
多行回复的格式是第一行将以确切的所需回复代码开头,紧接着是连字符,“-”(也称为Minus),后跟文本。最后一行将以相同的代码开头,紧接着是Space ,可选的是一些文本,以及Telnet行尾代码。
注意:以三个数字和一个Space开头的行应该被一些中性文本(如Space)偏移。
例子:

1
2
3
4
123-First line
Second line
234 A line beginning with numbers
123 The last line

三位响应码包含了回复报文的足够信息,其分类意义如下:

响应码 类别 意义
1yz 肯定初步回复 正在启动所要求的行动; 在继续执行新命令之前需要另一个回复。服务器-FTP进程最多可以发送每个命令一个1yz的回复。
2yz 肯定完成回复 请求的操作已成功完成。可以启动新请求。
3yz 肯定中间回复 该命令已被接受,但所请求的行动暂时搁置,等待收到进一步的信息。 用户应发送另一个指定此信息的命令。 此回复用于命令序列组。
4yz 瞬态拒绝完成回复 该命令未被接受且请求的操作未发生,但错误情况是暂时的,可能会再次请求操作。用户应返回命令序列的开头(如果有)。
5yz 永久拒绝完成回复 该命令未被接受,并且未执行所请求的操作。不鼓励用户进程重复确切的请求(以相同的顺序)。

响应码细化分类的表示意义参见RFC 0959(https://tools.ietf.org/html/rfc959)。

通讯过程

FTP协议[1]的通讯过程由图1中的FTP模型给出,首先由User-PI启动控制连接(控制连接遵循Telnet协议),用户启动时,标准FTP命令由User-PI生成,并通过控制连接传输到服务器进程。标准回复由Server-PI通过控制连接发送给User-PI来响应FTP命令。
文件仅通过数据连接传输。控制连接用于传输执行功能的命令,以及对这些命令的回复。数据传输一般有两种模式,分为主动模式和被动模式:
主动模式下的FTP客户端首先和FTP服务器的TCP 21端口建立控制连接,通过这个连接发送命令,客户端需要接受数据的时候会在这个通道上发送PORT命令。PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。FTP server必须和客户端建立一个新的连接用来传送数据。
被动模式在建立控制连接的时候和主动模式很类似,但建立连接后发送的不是PORT命令,而是PASV命令。FTP服务器收到PASV命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器的这个端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP服务器不再需要建立一个新的和客户端之间的连接。
注意在数据连接中,数据的连接可以是任意方向的,并且数据连接在整个控制连接期间,不需要保持一直开启。

参考文献


  1. 1.Postel, Jon, and Joyce Reynolds. 'Rfc 959: File transfer protocol (ftp).' InterNet Network Working Group (1985).