FTP 协议解析
FTP全称: File Transfer Protocol,是一个用于文件传输的协议,本文主要讲解FTP协议。如果有不懂的地方可以查询FTP的定义文档: RFC 959 或者在评论中提出,同时有写错的地方也希望能提出来,大家一起进步。
FTP 是一个协议而不是一个服务,很多人把FTP理解为了一个服务,这里是不正确的,其实应用了FTP协议的服务也有很多,例如:vsftpd, pure-ftpd, Filezila Server等。
我这里主要讲解一下FTP的工作模式、FTP的命令和FTP应答代码的作用三个部分。以及在最后有一个ftp连接抓包作为讲解内容便于理解。
FTP工作模式
FTP的完整工作有2个TCP连接,分别用于命令传输和数据传输(文件传输)。其分开为2个连接主要就是为了防止传输二进制文件破坏了命令连接的终端,可以在命令连接中指定数据传输的模式,以此来降低程序开发的复杂性。
FTP 的工作模式分主动连接
和被动连接
,这两者的区别主要就在于数据连接的连接方式:
- 主动连接:服务器 20/TCP 端口主动发起连接到客户端指定的端口。
- 被动连接:客户端主动发起连接到服务器端指定端口。
这里也会有人问,主动模式和被动模式的意义何在? 这里我也就说一下:
- 现在大部分用户的网络其实都并不是公网地址,都是使用NAT转换过的内网地址,如果使用主动连接模式服务器不可能连接到客户端开启的端口。所以只能使用被动连接模式,让客户端主动连接服务器端口,以此来达到数据传输的目的。
- 主动连接的好处其实就在于便于配置防火墙规则,由服务器的20/TCP主动连接客户端端口,防火墙只需要配置出口允许20/TCP连接即可,不像被动连接需要开启多个TCP端口监听数据连接。
FTP命令
FTP的命令有很多,我这里也就不一一讲解了,主要讲解以下一些常用常见的命令:
接入命令
命令 | 解释 |
---|---|
USER | 输入用户名 |
PASS | 输入用户密码 |
QUIT | 退出用户登录 |
REIN | 重新登入用户 |
ACCT | 部分服务软件并不需要在一开始就认可, 可能在进入某个目录后开始要求用户认证 |
文件管理类命令
命令 | 解释 |
---|---|
CWD | 更改服务上的工作目录 |
CDUP | 切换到父目录(上级目录) |
DELE | 删除服务器上的文件 |
LIST | 列出当前目录的文件(UNIX形式) |
NLST | 列出当前目录下的文件(只包含文件名) |
MKD | 在服务器上创建一个目录 |
PWD | 显示当前工作路径 |
RMD | 从服务器上删除目录 |
RNFR | 指定需要重命令的文件。(需要配合RNTO使用) |
RNTO | 更名为指定命令 |
传输时的数据模式
命令 | 解释 |
---|---|
TYPE | 定义文件类型。A(ASCII)、E(EBCDIC)、I(Image)、L(Local byte size) |
STRU | 数据组织类型。F(file)、R(record structure)、P(page structure) |
MODE | 定义传输方式。S(stream)、B(block)、C(compressed) |
PASV | 指定服务器开启被动连接模式 |
文件传送命令
命令 | 解释 |
---|---|
RETR | 下载文件 |
STOR | 上传文件 |
STOU | 与STOR类似,但是文件名称不由客户端控制, 由服务器端自动生成文件名,并且使用 250 代码返回文件名称。 |
STAT | 放回服务器状态 |
ALLO | 指定服务器需要预留的空间大小 |
ABORT | 停止之前的所有命令,包括文件传输 |
APPE | 如果文件不存在则创建文件, 如果文件已存在则以追加形式添加到文件中。 |
PORT | 指定数据连接端口。共6位,按, 分割。前4位为IP位,后2位为端口位,端口位1*256+端口位2 = 指定开启的端口。 |
REST | 类似于断点续传功能。 |
其他命令
命令 | 解释 |
---|---|
HELP | 查询服务器的帮助信息 |
NOOP | 检测服务器允许状态 |
SITE | 此命令用于查询特定于服务器的专有服务 |
SYST | 查询服务器使用的操作系统 |
FTP应答代码
FTP 客户端是通过应答码来检测服务所表达的意思,除了几个特殊的应答码,大部分应答码后面的内容是给用户查看的。
FTP 应答码的分类:
第一个标志位:
-
1xx:服务器正在积极响应,但是还未准备完成。
-
2xx:命令已经正常启动。
-
3xx:命令被接收,需要等待进一步响应。
-
4xx:命令错误,无法接收该命令,客户端可以重新尝试命令。
-
5xx:命令无法被接收,客户端无需再次尝试该命令。
第二标志位:
-
x0x:有关语法是否正确。
-
x1x:对信息请求的回复。
-
x2x:连接状态信息。
-
x3x:认证和通过信息。
-
x4x:预留。
-
x5x:文件系统对于请求的回复。
响应代码 | 解释说明 |
---|---|
110 | 重启标志位,后面的提示信息标志服务器状态,提示信息固定 |
120 | 服务器准备就绪的时间 |
125 | 数据连接已正常开启,开始传输文件 |
150 | 文件状态正常,开始开启数据连接 |
200 | 命令执行成功 |
202 | 命令尚未实现,该站点不支持该命令 |
211 | 系统状态,或系统帮助信息 |
212 | 目录状态 |
213 | 文件状态 |
214 | 命令帮助信息 |
215 | 该系统类型 |
220 | 服务已为新连接的用户就绪 |
221 | 服务退出控制连接 |
225 | 打开数据连接,未开始数据传输 |
226 | 结束数据连接,数据传输已完成 |
227 | 进入被动模式(IP 地址、ID 端口) |
230 | 用户登入成功 |
250 | 请求文件操作完成 |
257 | 路径名建立成功 |
331 | 用户名正确,需要用户密码 |
332 | 需要登入用户 |
350 | 请求文件的工作需要得到进一步确认 |
421 | 服务不可能,即将关闭控制连接 |
425 | 无法打开数据连接 |
426 | 连接中止,传输关闭。 |
450 | 请求文件尚不可用,文件可能被占用 |
451 | 请求操作终止,遇到本地错误 |
452 | 请求操作终止,磁盘空间不足 |
500 | 命令语法错误,可能包含命令过长的错误 |
501 | 命令参数错误 |
502 | 命令尚未被执行 |
503 | 命令次序错误 |
504 | 该命令尚未被完成 |
530 | 尚未登入服务器 |
532 | 存储文件需要账号 |
550 | 请求的动作尚未执行,文件不可用 |
551 | 请求操作终止,不知道的页类型 |
552 | 请求操作终止,超出用户配额 |
553 | 请求操作终止,文件名不允许 |
FTP 命令抓包分析
这个是我用 wireshark 抓包抓到的命令连接的数据。
这里我干了3件事情,上传文件、下载文件和目录浏览(2次)。所以这里实际上完成了四次数据传输,我们待会一一查看。
眼尖的人应该已经发现了,是由客户端发送了 PORT 指令,所以是由服务器端连接客户端,也就是主动连接模式,这里需要注意!!
第一段:登入前的服务器配置
220 (vsFTPd 3.0.3) # 220,表示服务器准备完成,客户端客户发送命令了。 后面跟的是服务器的版本信息。
OPTS UTF8 ON # 表示服务器需要切换到UTF8字符集进行工作。
200 Always in UTF8 mode. #200,表示命令执行成功,后面的提示信息表示已经工作在UTF8模式下了。
第二段:用户认证
USER ftp # 指定用户ftp(匿名用户,anonymous也是匿名用户)
331 Please specify the password. # 331 表示需要输入密码
PASS # 表示输入密码,FTP规定匿名用户可以选择需要输入自己的邮箱,但是这里可以省略不写。
230 Login successful. # 230 表示用户登入成功
第三段内容:目录当前浏览
PORT 192,168,10,103,211,216 # PORT,这里用于指定客户端的IP地址和端口
200 PORT command successful. Consider using PASV. # 表示命令执行成功, 这里是端口连接成功
LIST # 表示列出当前工作目录下的文件
150 Here comes the directory listing. # 150 表示即将开始传输数据。
226 Directory send OK. # 226 表示文件传输成功。
PORT命令中的前四位为IP地址,后2位为端口,其中端口应该这样计算: 211 * 256 + 216 = 54232
这个是这条命令的返回结果(在数据连接中,所以这里当前的命令连接中是看不到的)
第四段内容:切换目录
CWD pub # CWD,表示切换到pub目录下。
250 Directory successfully changed. # 250 表示请求操作执行完成。
第五段内容:再次浏览当前目录
# 与第三段相同,不过多讲解。
PORT 192,168,10,103,211,217
200 PORT command successful. Consider using PASV.
LIST
150 Here comes the directory listing.
226 Directory send OK.
下图为返回内容:
第六段内容:上传文件
PORT 192,168,10,103,211,218
200 PORT command successful. Consider using PASV.
STOR test.c # STOP 表示上传文件,文件名为 test.c
150 Ok to send data. # 150,表示文件状态正常,开始传输数据。
226 Transfer complete. # 226,表示文件传输完毕。
第六段内容:下载文件
PORT 192,168,10,103,211,219
200 PORT command successful. Consider using PASV.
RETR test.file # RETR 下载文件。
150 Opening BINARY mode data connection for test.file (12 bytes). # 150,表示文件正常,开始传输文件,后面会提示文件名称和文件大小。
226 Transfer complete.
第六段内容:退出
QUIT # 退出
221 Goodbye. # 服务退出控制连接
本文经「原本」原创认证,作者乾坤盘,访问yuanben.io查询【2MLRYL4K】获取授权信息。
经常会有各种错别字,请留言提醒,或者向我邮件 mailto:somata@foxmail.com.