大道五十,天衍四十九,人遁其一!

# 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文件名不允许

大道五十,天衍四十九,人遁其一!