服务器正在积极响应,FTP 协议解析 - osc_h9fpkpv6的个人空间 - OSCHINA - 中文开源技术交流社区...

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 端口主动发起连接到客户端指定的端口。

image-20191130111521996.png

被动连接:客户端主动发起连接到服务器端指定端口。

image-20191130111527356.png

这里也会有人问,主动模式和被动模式的意义何在? 这里我也就说以下:

现在大部分用户的网络其实都并不是公网地址,都是使用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 抓包抓到的命令连接的数据。

image-20191130150159361.png

这里我干了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

这个是这条命令的返回结果(在数据连接中,所以这里当前的命令连接中是看不到的)

image-20191130151243400.png

第四段内容:切换目录

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.

下图为返回内容:

image-20191130151759375.png

第六段内容:上传文件

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】获取授权信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值