一次 FTP 会话的完整剧本
FTP 是双连接协议:控制连接上全是文本命令与三位应答码,一条命令一次应答;数据连接在真正传文件时才建立。读得懂这条命令应答流水,就能在没有任何图形客户端的情况下判断问题出在认证、模式协商还是数据通道。
基本信息
| 控制端口 | TCP 21(FTPS 显式升级仍从 21 开始) |
|---|---|
| 应答码 | 1xx 中间态、2xx 成功、3xx 需更多信息、4xx 暂时失败、5xx 永久失败 |
| 关键命令 | USER/PASS、TYPE、PASV/PORT、RETR/STOR、QUIT |
| 能力发现 | FEAT 列出服务端支持的扩展,如 AUTH TLS、UTF8、MLSD |
| 传输模式 | TYPE I 二进制、TYPE A 文本(换行转换) |
典型使用场景
- 服务器无图形客户端时手工登录排查传输异常
- 对接老式设备或脚本前先确认服务端支持哪些扩展能力
- 抓包后按应答码顺序还原会话,定位是认证还是数据连接失败
- 迁移前评估服务端是否支持 UTF-8 文件名与 FTPS
完整会话
完整会话
S: 220 FTP server ready
C: USER alice
S: 331 Password required
C: PASS ****
S: 230 Login successful.
C: FEAT
S: 211-Features:
S: AUTH TLS
S: UTF8
S: 211 End
C: TYPE I
S: 200 Switching to Binary mode.
C: PASV
S: 227 Entering Passive Mode (10,0,0,5,195,80)
C: RETR report.xlsx
S: 150 Opening BINARY mode data connection
S: 226 Transfer complete.
C: QUIT
S: 221 Goodbye.常用应答码逐列读法
| 应答码 | 含义 | 排障含义 |
|---|---|---|
| 220 / 221 | 服务就绪 / 正常退出 | 欢迎与收尾,正常 |
| 331 / 230 | 需要口令 / 登录成功 | 331 停在认证,多为口令或账号问题 |
| 227 / 229 | 被动模式地址与端口 | 227 是 IPv4,229 是扩展被动 EPSV |
| 150 / 226 | 数据连接已开 / 传输完成 | 只出 150 无 226 说明数据连接断了 |
| 530 / 550 | 未登录 / 请求被拒 | 550 常为路径不存在或权限不足 |
FEAT 的输出就是服务端能力清单:要用 UTF-8 文件名先看 UTF8 行,要显式加密看 AUTH TLS 行,要看文件修改时间看 MLST 行;能力缺失时应改用兼容命令。
手工复现要点
- 用 nc host 21 连接后逐条敲命令,服务端每步应答都会原样打印,不需要抓包也能看流程
- 涉及 TLS 的服务端要先 AUTH TLS 再登录,否则多数实现直接拒绝 USER
- 传文件前先 TYPE I,尤其是压缩包、镜像与可执行文件
- 结束务必发 QUIT(期望 221),直接断开会让服务端等待超时并留下半开会话
PASV 应答里的数字是 IP 与端口的十进制编码,例如 10,0,0,5,195,80 表示 10.0.0.5 的 195*256+80=50000 端口;服务端若返回内网地址,客户端在公网就会连不上。