大道五十,天衍四十九,人遁其一!
# FTP 概述
FTP (File Transfer Protocol) 文件传输协议,在 TCP/IP 协议族中属于应用层协议运行于 TCP 协议之上是一种可靠的传输协议.
这个是一个网络协议与具体的操作系统无关,只要你所使用的操作系统支持此协议就可以进行文件传输.
主要功能: 用于实现用户间文件分发共享,以及网络管理者在进行设备版本升级、日志下载和配置保存等业务操作时,均会使用到 FTP 功能.
# FTP 协议
# FTP 的两个 TCP 连接
HTTP 通过一次会话来传输,将数据和控制分开,提高了效率。但是需要建立两个 TCP 链接,一个连接用于传输控制命令,另外一个连接用于传输数据
# 控制链接
TCP 21 端口,一般用于实现 FTP 协议控制信令传送.
服务器端打开 TCP 21 端口被动等待客户端发起连接命令;客户端则以主动方式打开随机端口,发起连接的建立请求
# 数据链接
TCP 20 端口,主要用于实现应用数据传送,服务器的数据连接端使用端口 20.
服务器执行主动打开数据连接,通常也执行主动关闭数据连接.
FTP 使用 2 个端口,一个数据端口和一个命令端口 (也叫做控制端口) 这两个端口一般是 21 (命令端口) 和 20 (数据端口).
控制 Socket 用来传送命令,数据 Socket 是用于传送数据.
命令端口中客户端每一个 FTP 命令发送之后,FTP 服务器都会返回一个字符串,其中包括一个响应代码和一些说明信息.
其中的返回码主要是用于判断命令是否被成功执行了
# 端口
# 命令端口
客户端创建一个 Socket 连接 FTP 服务器的 21 端口,此控制连接实现 FTP 命令的发送和接收返回的响应信息.
比如: “登录”、“改变目录”、“删除文件”, “上传文件”, “下载文件” 等操作
# 数据端口
对于有数据的操作,客户端创建一个 socket 链接,主要用于传输 目录列表,上传,下载文件
# 数据传输的方式
有两种模式:被动模式、主动模式
使用被动模式,通常 FTP 服务器端会返回给客户端一个端口号 (由 FTP 服务器自动随机分配), 客户端需要另开一个 Socket 来连接 FTP 服务器这个端口.
# 主动方式
主动方式也称为 PORT
方式,是 FTP 协议最初定义的数据传输连接方式,主要流程如下:
FTP 客户端随机打开一个大于 1024 的端口向服务器的命令端口 21 发送命令,创建控制链接.
通过向 FTP 服务器 发送 PORT
命令,告诉服务器该客户端用于传输数据的临时端口号当需要传送数据.
服务器通过 TCP 端口号 20 与 客户端的临时端口建立数据传输通道,完成数据传输.
传输过程中,由服务器主动发起连接,故此称 主动方式
主动模式下 FTP 客户端随机打开一个大于 1024 的端口向服务器的命令端口 21,创建控制连接。同时客户端开放 N +1 端口监听,并向服务器发出 “port N+1” 命令,由服务器从它自己的数据端口 (20) 主动连接到客户端指定的数据端口 (N+1)
# 被动方式
被动方式也称为 PASV
方式,被动方式的主要流程如下:
FTP 客户端通过向 FTP 服务器 发送 PASV
命令,告诉服务器该客户端进入被动模式.
服务器选择临时端口号,并告知客户端当需要传送数据时,客户端主动与服务器的临时端口号建立数据传输通道,完成数据传输.
传输过程中,服务器总是被动接收客户端的数据连接,故称为被动方式.
被动模式下,FTP 客户端连接服务器的命令端口 21,创建控制连接,然后服务器会分配一个端口(端口号大于 1024),并且返回给客户端已经分配的端口号和连接的 IP 地址。等待客户端来连接这个端口,创建数据连接,文件传输和显示目录列表这些信号都在这个数据连接中传输
# 小结
在 PORT
模式下:
- 服务器端口固定,客户端端口随机
- 服务器主动访问客户端
在 PASV
模式下:
- 服务器和客户端端口都随机
- 服务器被动接收客户端请求
PS: 主动被动看的是服务器工作状态,与客户端无关。虽然工作模式取决与客户端请求
# FTP 命令
FTP 每个命令都有 3 到 4 个字母组成,命令后面跟随参数,以空格分隔,每个命令以 "\r\n"(0x0D 0x0A) 结尾,FTP 的命令在控制链接中传输.
进行文件交互的时候,需要先进行登录,切换到指定的目录,然后进行文件上传或下载.
下载文件的时候可以不切换到指定目录,直接使用 绝对路径进行访问.
例如:访问 pub 目录下的 upload 文件夹中的 cfg.ini 文件。命令如下:
CWD /pub/upload\r\n
RETR cfg.ini\r\n
#或
RETR /pub/upload/cfg.ini\r\n
# 相关命令
FTP 命令 | 说明 | |
---|---|---|
ABOR | 使服务器终止前一个 FTP 服务命令,以及任何相关数据传输 | |
ACCT<account> | 使用一个 Telnet 字符串来指明用户的账户 | |
ALLO<bytes> | 为服务器上的文件存储器分配空间 | |
APPE<filename> | 添加文件到服务器同名文件 | |
CDUP <dir path> | 改变服务器上的父目录 | |
CWD <dir path> | 改变服务器上的工作目录 | |
DELE<filename> | 删除服务器上的指定文件 | |
PSV 进入扩展被动模式 | ||
HELP<command> | 返回指定命令信息 | |
LIST<name> | 如果是文件名,列出文件信息;如果是目录,则列出文件列表 | |
MKD<directory> | 在服务器上建立指定目录 | |
MODE<mode> | 传输模式(S = 流模式、B = 快模式、C = 压缩模式) | |
NLST<directory> | 列出指定目录内容 | |
NOOP 无动作,仅让服务器返回确认信息 | ||
PASS<password> | 系统登录密码 | |
PASV | 请求服务器,等待数据连接 | |
PORT <address> | IP 地址和两字节的端口 ID | |
PWD 显示当前工作目录 | ||
QUIT 从 FTP 服务器上退出登录 | ||
REIN 重新初始化登录状态连接 | ||
REST<offset> | 由特定偏移量重启文件传递 | |
RETR<filename> | 从服务器上找回(复制)文件 | |
RMD<directory> | 在服务器上删除指定目录 | |
RNFR<old path> | 对旧路径重命名 | |
RNTO<new path> | 对新路径重命名 | |
SITE<params> | 由服务器提供的站点特殊参数 | |
SMNT<pathname> | 挂载指定文件结构 | |
STAT<directory> | 在当前程序或目录上返回信息 | |
STOR<filename> | 储存(复制)文件到服务器上 | |
STOU<filename> | 储存文件到服务器名称上 | |
STRU<type> | 数据结构(F = 文件、R = 记录、P = 页面) | |
SYST 返回服务器使用的操作系统 | ||
TYPE<data type> | 数据类型(A=ASCII、E=EBCDIC、I=binary) | |
USER<username> | > |
# FTP 响应码
客户端发送 FTP 命令后,服务器返回响应码。例如,切换目录没有权限或者找不到目录都会返回 550
一般来说返回的信息除状态码之外,还会一句解释说明,很简短,例如上面说的 550 响应码,完整的返回信息因该是 550 Cannot change path to a port.
# 具体含义
一般来说响应码分为 3 位,前两位的含义如下
第一个数字给出了命令状态的一般性指示,比如响应成功、失败或不完整。含义如下
- 1: 表示服务器正确接收信息,还未处理.
- 2: 表示服务器已经正确处理信息.
- 3: 表示服务器正确接收信息,正在处理.
- 4: 表示信息暂时错误.
- 5: 表示信息永久错误.
第二个数字是响应类型的分类,如 2 代表跟连接有关的响应,3 代表用户认证.
- 0: 表示语法
- 1: 表示系统状态和信息
- 2: 表示链接状态
- 3: 表示用户认证有关的信息
- 4: 表示未定义
- 5: 表示与文件系统相关的信息
# 响应码表
应答码 | 说明 |
---|---|
110 | 新文件指示器上的重启标记 |
120 | 服务器准备就绪的时间(分钟数) |
125 | 打开数据连接,开始传输 |
150 | 打开数据连接 |
200 | 就绪命令(命令成功) |
202 | 命令没有执行 |
211 | 系统状态回复 |
212 | 目录状态回复 |
213 | 文件状态回复 |
214 | 帮助信息回复 |
215 | 系统类型回复 |
220 | 服务就绪 |
221 | 退出 FTP |
225 | 打开数据连接 |
226 | 结束数据连接(下载完成、目录列表完成等) |
227 | 进入被动模式(IP 地址、ID 端口) |
230 | 成功登录 FTP 服务 |
250 | 完成目录切换 |
257 | 路径名建立 |
331 | 要求密码 |
332 | 要求账号 |
350 | 文件行为暂停 |
421 | 服务关闭 |
425 | 无法打开数据连接 |
426 | 结束连接 |
450 | 文件不可用 |
451 | 遇到本地错误 |
452 | 磁盘空间不足 |
500 | 无效命令 |
501 | 错误参数 |
502 | 命令没有执行 |
503 | 错误指令序列 |
504 | 无效命令参数 |
530 | 登录 FTP 服务失败 |
532 | 存储文件需要账号 |
550 | 文件不存在 |
551 | 不知道的页类型 |
552 | 超过存储分配 |
553 | 文件名不允许 |
大道五十,天衍四十九,人遁其一!