FTP 协议原理及应用精解
本文介绍 FTP(File Transfer Protocol,文件传输协议) 的发展简史、双连接模型、Port 与 Passive 模式、匿名 FTP 及安全问题,内容以 IETF RFC 959(STD 9) 为主,并兼顾常见实现与防火墙场景。适合需要理解文件传输协议或做 FTP 客户端/服务端开发的读者。
目录
- [FTP 概述](#FTP 概述)
- 发展简史
- [FTP 模型:双连接](#FTP 模型:双连接)
- 常用命令与响应码
- [Port 模式与 Passive 模式](#Port 模式与 Passive 模式)
- [匿名 FTP](#匿名 FTP)
- 安全问题与替代方案
- [术语与 RFC 速查](#术语与 RFC 速查)
一、FTP 概述
FTP 是用于在网络上传输文件 的应用层协议,基于 TCP ,采用客户端-服务器模型。RFC 959 定义其功能与消息格式,至今仍是互联网上文件传输的经典标准之一。
| 项目 | 说明 |
|---|---|
| 标准 | RFC 959(STD 9),1985 |
| 传输 | TCP,控制连接通常 21,数据连接见下文 |
| 特点 | 双连接(控制 + 数据)、支持多种数据类型与传输模式 |
| 认证 | 用户名/口令(RFC 959 中为明文) |
二、发展简史
(据《网络协议本质论》第 11 章及 RFC 历史整理。)
| 年份 | 事件 |
|---|---|
| 1971 | 首个 FTP 相关 RFC(RFC 114),A.K. Bhushan,MIT 与 Harvard 实验实现 |
| 1972 | RFC 172,主机间文件传输的用户级协议 |
| 1973.2 | 经多份 RFC 讨论后,RFC 454 成为官方文档 |
| 1973.8 | RFC 542 修订版,确立 FTP 功能、目标与基本模型;当时采用 NCP 作为数据传输协议 |
| 1980 | 底层由 NCP 改为 TCP,RFC 765 定义基于 TCP 的 FTP |
| 1985 | RFC 959(STD 9) 发布,沿用至今 |
三、FTP 模型:双连接
FTP 使用两条独立的 TCP 连接(RFC 959):
- 控制连接 :客户端连到服务器 21 端口,用于发送命令(USER、PASS、PORT/PASV、RETR、STOR 等)和接收响应码。在整个会话期间保持。
- 数据连接 :用于实际传输文件或目录列表;建立方式 由 Port 模式 或 Passive 模式 决定,见第五节。
PORT 或 PASV 协商
数据连接
Client 数据端口
Server 数据端口
控制连接
21
Client 随机端口
Server 21
要点:控制连接始终由客户端主动连接服务器 21 端口;数据连接在 Port 模式下由服务器主动连回客户端,在 Passive 模式下由客户端连接服务器给出的端口。
四、常用命令与响应码
4.1 常用命令(RFC 959)
| 命令 | 含义 |
|---|---|
| USER <username> | 用户名 |
| PASS <password> | 口令 |
| QUIT | 退出 |
| PORT <host,port> | 告知服务器「客户端在何地址/端口等待数据连接」(Port 模式) |
| PASV | 请求 Passive 模式,服务器返回自己监听的地址与端口 |
| RETR <path> | 下载文件 |
| STOR <path> | 上传文件 |
| LIST [path] | 列出目录(经数据连接返回) |
| TYPE I / A | 二进制(Image)或 ASCII 传输类型 |
| CWD <path> | 切换目录 |
| PWD | 当前目录 |
4.2 响应码(三位数字,RFC 959)
| 首位 | 含义 | 示例 |
|---|---|---|
| 1xx | 初步肯定,需继续 | 150 Opening data connection |
| 2xx | 成功完成 | 200 OK,220 Service ready,226 Transfer complete |
| 3xx | 需进一步动作 | 331 User name OK, need password |
| 4xx | 暂时性错误 | 425 Can't open data connection |
| 5xx | 永久性错误 | 530 Not logged in,550 Requested action not taken |
五、Port 模式与 Passive 模式
数据连接的建立方式有两种,对应防火墙/ NAT 下的不同表现。
5.1 Port 模式(Active FTP)
- 客户端先连服务器 21 建立控制连接。
- 客户端在本机监听 一个端口(如 1026),通过 PORT 命令把「客户端 IP + 该端口」发给服务器。
- 服务器 从本机 20 (或其它端口)主动发起一条 TCP 连接到客户端的该端口,作为数据连接。
- 问题 :对客户端而言,数据连接是由外向内的,若客户端在 NAT 或防火墙后,往往会被拦截,导致 LIST/RETR/STOR 失败。
Server Client Server Client 连接 21(控制) PORT 192.168.1.1,1026 200 OK RETR file.txt 服务器从 20 连到 192.168.1.1:1026(数据) 150 / 226,数据经数据连接传输
5.2 Passive 模式(PASV)
- 客户端连服务器 21 建立控制连接。
- 客户端发 PASV ,服务器在某一端口监听 ,并在响应(如 227 Entering Passive Mode )中返回 服务器 IP 与端口。
- 客户端 再主动连接该 IP:端口,建立数据连接。
- 优点 :两条连接都是客户端主动发起,对客户端防火墙/NAT 更友好,因此公网环境常推荐使用 PASV。
Server Client Server Client 数据经数据连接传输 连接 21(控制) PASV 227 Entering Passive Mode (h1,h2,h3,h4,p1,p2) 客户端连 h1.h2.h3.h4:(p1*256+p2)(数据) RETR file.txt
5.3 对比小结
| 项目 | Port 模式 | Passive 模式 |
|---|---|---|
| 数据连接由谁发起 | 服务器 → 客户端 | 客户端 → 服务器 |
| 服务器数据端口 | 通常 20 | 由服务器指定(常为高端口) |
| 客户端侧防火墙 | 易阻挡入站,常失败 | 出站为主,通常更易通过 |
| RFC 959 命令 | PORT | PASV |
六、匿名 FTP
匿名 FTP 是一种机制:用户无需在服务器上拥有账号,即可连接并下载(有时也可上传)文件。管理员在服务器上创建一个特殊账号,用户名为 anonymous (或 ftp),密码常要求填邮箱或任意字符串。RFC 959 未直接规定匿名语义,但实践中已成为通用约定。
- 用途:软件镜像、文档、公共数据集等公开分发。
- 安全注意:匿名账户权限应严格限制(只读或限定目录),避免被滥用为跳板或存储非法内容。
七、安全问题与替代方案
7.1 明文传输
FTP 一个广为人知的问题是:用户名与口令在控制连接上以明文传输(RFC 959 时代无内置加密)。若控制连接被窃听,账号即可被获取。数据连接上的文件内容同样不加密。
7.2 安全扩展与替代
| 方案 | 说明 |
|---|---|
| FTPS | FTP over TLS/SSL(RFC 4217),对控制连接及可选对数据连接加密;显式(如 21 先协商 TLS)或隐式(如 990 端口直接 SSL)。 |
| SFTP | 通常指 SSH File Transfer Protocol(与 FTP 不同协议),基于 SSH,加密且常用单端口 22,避免双连接与 PORT/PASV 的防火墙问题。 |
| HTTPS / 网盘 | 对公网文件分发,常用 HTTPS 下载或 Web 上传替代 FTP。 |
术语与 RFC 速查
| 术语 | 英文 | 含义 |
|---|---|---|
| FTP | File Transfer Protocol | 文件传输协议,RFC 959 |
| Port 模式 | Active FTP | 数据连接由服务器连回客户端 |
| Passive 模式 | PASV | 数据连接由客户端连到服务器指定端口 |
| 匿名 FTP | Anonymous FTP | 使用用户名 anonymous 的公开访问 |
RFC 与规范
| 文档 | 内容 |
|---|---|
| RFC 959 | File Transfer Protocol (FTP),STD 9 |
| RFC 4217 | Securing FTP with TLS(FTPS) |
| RFC 2228 | FTP Security Extensions(已部分被 RFC 4217 取代) |
本文内容依据 IETF RFC 959、RFC 4217 及《网络协议本质论》第 11 章整理。