首页/网络/协议速查/FTP 协议总览(双连接模型)

FTP 协议总览(双连接模型)

FTP 用两条 TCP 连接:21 控制连接跑命令,20 或临时端口跑数据;「控制与数据分离」是大量防火墙问题的根源。

协议速查网络更新于 2026-10-13

FTP 的双连接模型

FTP 用两条 TCP 连接工作:一条是控制连接,长期保持,用来传命令与应答;另一条是数据连接,由控制连接协商后临时建立,用来传文件内容与目录列表。这种「命令与数据分离」的设计是大量防火墙与 NAT 问题的根源,也是排查 FTP 时必须同时看两条连接的原因。现在敏感场景基本改用 SFTP 或 FTPS,但存量系统里 FTP 仍然常见。

基本信息

控制连接21 端口,全程保持,传输命令与应答
数据连接每次传输时新建,传文件内容与目录列表
应答格式三位状态码加说明文字,如 220、230、150、226
传输模式主动(PORT)由服务端发起数据连接,被动(PASV)由客户端发起
安全现状明文传输,敏感场景应改用 SFTP 或 FTPS
相关规范RFC 959 定义基本协议,RFC 2428 增加 IPv6 与扩展被动模式

手看一次完整会话

手看一次完整会话
nc ftp.example.com 21                 # 用文本方式连控制连接,逐条输入命令
220 (vsFTPd 3.0.5)                    # 服务端就绪
USER alice
331 Please specify the password.      # 需要密码
PASS 密码
230 Login successful.                 # 登录成功
PASV
227 Entering Passive Mode (10,0,0,5,195,80)   # 服务端给出数据连接地址与端口
LIST
150 Here comes the directory listing. # 数据连接已建立
226 Directory send OK.                # 传输完成
QUIT
221 Goodbye.

应答码读法

应答码含义说明
220服务就绪连接控制连接后的第一条应答
331需要密码输入 USER 之后的常见应答
230登录成功认证通过
227进入被动模式携带数据连接的地址与端口
150即将开始传输数据连接已打开
226传输完成本次数据连接正常关闭
530未登录权限不足或凭据错误

主动与被动模式

模式连接方向适用场景
主动 PORT服务端从 20 端口主动连接客户端指定端口客户端无 NAT 且允许入站连接时
被动 PASV客户端连接服务端给出的临时端口客户端在内网或防火墙后,更常用
扩展被动 EPSVIPv6 场景下的被动模式双栈与 IPv6 环境
被动模式的应答把数据地址与端口按六段十进制编码给出:端口等于第五段乘 256 再加第六段,例如 195 与 80 对应 195 乘 256 加 80 的结果。看懂这一段才能判断客户端连不上到底是因为端口没放行还是地址本身不对。

易错点

  • NAT 网关会重写被动模式应答里的内网地址,客户端拿到私有地址必然连不通,需要在服务端显式声明对外地址
  • 只放行 21 端口却没放行数据连接端口范围,表现为能登录、列目录时卡死或超时
  • 把 FTP 当成安全协议使用,账号密码与文件内容全程明文,应改用 SFTP 或 FTPS
  • 排查时只看控制连接日志,忽略数据连接的实际失败位置,问题定位会停在「登录成功但传不了文件」这一步

数据来源与参考

  • RFC 959(FTP)
  • RFC 2428(EPSV)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌