FTP 协议解析

本文首发:https://www.somata.work/2019/FTPExplanation.html

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

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

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

  1. 现在大部分用户的网络其实都并不是公网地址,都是使用NAT转换过的内网地址,如果使用主动连接模式服务器不可能连接到客户端开启的端口。所以只能使用被动连接模式,让客户端主动连接服务器端口,以此来达到数据传输的目的。
  2. 主动连接的好处其实就在于便于配置防火墙规则,由服务器的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】获取授权信息。

原文地址:https://www.cnblogs.com/somata/p/12173279.html

时间: 2024-10-09 02:59:08

FTP 协议解析的相关文章

SOCKS5 协议解析

意图 SOCKS5 是一个代理协议,旨在为位于 Intranet 防火墙后的用户提供访问 Internet 的代理服务(Intranet,你没听错,这是个有一定年头的协议,其 RFC 提案的时间比 HTTP 1.0 还要早两个月). 代理 根据 HTTP 1.1 的定义,proxy 是: An intermediary program which acts as both a server and a client for the purpose of making requests on be

通用轻量级二进制格式协议解析器

在通信协议中,经常碰到使用私有协议的场景,报文内容是肉眼无法直接看明白的二进制格式.由于协议的私有性质,即使大名鼎鼎的 Wireshark,要解析其内容,也无能为力. 面对这种情况,开发人员通常有两个办法:第一,对照报文内容和协议规范进行人工分析(假设内容没有经过加密.压缩):第二,编程实现协议报文的解析(源于程序员的懒惰 ^_^). 很明显,第二条道路是主流.目前比较常见的实现方式是开发对应的 Wireshark 插件,包括 C.Lua 等插件.当然,插件完成后需要运行 Wireshark 才

马哥教育第二十四ftp协议、vsftpd的高级应用、rpc概念及nfs的基本应用、samba及其基本应用

1.ftp协议及vsftpd的基本应用         文件共享服务:                 工作在应用层:ftp(file transfer protocol)                          应用层协议:tcp,                  工作在内核:nfs                 跨平台:samba           ftp工作在221号端口,传输数据:                  命令连接:文件管理类命令,始终在线的连接       

ftp协议基础

文件共享服务 ftp:应用层,可以跨平台,但对数据的编辑难以实现: nfs(Sun):内核,跨平台困难: samba:跨平台,在Linux或Unix实现CIFS(SMB)协议--即Unix通用文件系统协议: 现有的三类存储模型 DNS:直接附加存储,例如机箱内的硬盘: NAS:网络附加存储,通过网络文件服务器提供文件级别的共享存储,工作于应用空间,nfs和samba的CIFS就是NAS的实现: SAN:网络附加存储,通过网络文件服务器提供块级别的共享存储,工作于内核空间: ftp:Flie Tr

ftp协议及vsftpd的基本应用

1.ftp协议及vsftpd的基本应用         文件共享服务:                 工作在应用层:ftp(file transfer protocol)                          应用层协议:tcp,                  工作在内核:nfs                 跨平台:samba           ftp工作在221号端口,传输数据:                  命令连接:文件管理类命令,始终在线的连接       

twemproxyRedis协议解析探索——剖析twemproxy代码正编

这篇文章会对twemproxyRedis协议解析代码部分进行一番简单的分析,同时给出twemproxy目前支持的所有Redis命令.在这篇文章开始前,我想大家去简单地理解一下有限状态机,当然不理解也是没有问题的,有限状态机仅仅能帮助我们更好地理解twemproxyRedis协议解析代码部分. redis 协议 这边我们首先需要简单介绍一下redis协议.参考自https://redis.io/topics/protocol redis协议即RESP 的数据类型有5类,简单字符串.错误.整数.大字

FTP协议

FTP协议 FTP即文件传输协议是应用层提供交互式会话系统,基于TCP连接的,FTP客户端和服务器之间是可靠的.面向连接的.为数据提供可靠保证,标准连接端口端口是21,数据传输端口是20. FTP主要作用:让用户连接上一个远程计算机(这些计算机运行着FTP服务器程序),来查看远程计算机有什么文件,将远程计算机的文件拷贝到本地计算机上(下载-get),或将本地计算机文件送到远程计算机上(上传-put). FTP的协议的特点: 支持C/S模式,一个FTP服务器可以同时给多个客户端传送数据. 是一个应

理解FTP协议

为了防止无良网站的爬虫抓取文章,特此标识,转载请注明文章出处.LaplaceDemon/ShiJiaqi. http://www.cnblogs.com/shijiaqi1066/p/5186117.html FTP协议用于在本地文件系统与远程文件系统之间传送文件. FTP使用两个并行的TCP连接: 控制连接:控制连接用于在客户和服务器之间发送控制信息.如用户名和口令.改变远程目录的命令或上传和下载文件的命令. 数据连接:数据连接用于传送文件. TCP服务器在21端口上监听控制连接,如果有客户要

python之模块ftplib(FTP协议的客户端)

# -*- coding: utf-8 -*- #python 27 #xiaodeng #python之模块ftplib(FTP协议的客户端) #需求:快速进行ftp上传 ,下载,查询文件 from ftplib import FTP ftp = FTP() #设置变量 timeout = 30 port = 21 ftp.connect('192.168.1.188',port,timeout) # 连接FTP服务器 ftp.login('UserName','888888') # 登录 p