FTP 的工作原理是什么?主动模式和被动模式有什么区别?
简化版
FTP(File Transfer Protocol)最大的特点是用两条连接:一条控制连接(端口 21)传命令和响应,一条数据连接(端口 20 或临时端口)真正传文件。主动模式(Active/PORT)是服务器主动去连客户端的某个端口来传数据;被动模式(Passive/PASV)是服务器开一个端口让客户端来连。区别的核心是**「数据连接由谁发起」**——主动模式服务器发起,会被客户端防火墙/NAT 挡住;被动模式客户端发起,能穿过 NAT,所以现在默认都用被动模式。
详细版
FTP 的双通道设计:
控制连接(端口 21,全程保持):客户端发命令(USER/PASS/LIST/RETR…),服务器回响应码
数据连接(每次传输临时建立):真正传文件内容和目录列表,传完就关
命令和数据分开走,是 FTP 的招牌设计。真正传文件时才建数据连接,怎么建就分两种模式:
主动模式(Active / PORT 命令):
- 客户端用随机端口 N(>1023)连服务器 21 端口,建立控制连接。
- 客户端通过
PORT命令告诉服务器:「你来连我的 IP + 端口 N+1」。 - 服务器用自己的 20 端口,主动去连客户端的 N+1 端口,建立数据连接。
问题:数据连接是服务器主动连客户端,而客户端的防火墙/NAT 通常不允许外部主动连入,于是数据连接失败。
被动模式(Passive / PASV 命令):
- 客户端连服务器 21 端口,建立控制连接。
- 客户端发
PASV命令,服务器开一个临时端口 P,回复「你来连我的 IP + 端口 P」。 - 客户端主动去连服务器的端口 P,建立数据连接。
好处:数据连接也是客户端主动发起,方向和控制连接一致,能顺利穿过客户端的 NAT/防火墙。代价转移到服务器——服务器要开放一段被动端口范围给外部连入。
| 维度 | 主动模式 PORT | 被动模式 PASV |
|---|---|---|
| 数据连接由谁发起 | 服务器连客户端 | 客户端连服务器 |
| 服务器数据端口 | 固定 20 | 临时端口(一段范围) |
| 谁的防火墙难受 | 客户端(要允许入站) | 服务器(要开端口范围) |
| NAT 后的客户端 | ❌ 常失败 | ✅ 可用 |
| 现状 | 基本淘汰 | 默认方式 |
完整版教学
一、FTP 最反直觉的点:两条连接
理解 FTP 的一切,都要从「它用两条 TCP 连接」开始——这和 HTTP「一条连接搞定」完全不同:
- 控制连接(Control):客户端连服务器 21 端口建立,整个会话期间一直保持。所有命令(登录
USER/PASS、切目录CWD、列目录LIST、下载RETR、上传STOR)和服务器的三位数响应码(如226 Transfer complete)都走这条。 - 数据连接(Data):只在真正传数据时临时建立(传文件内容、传目录列表),传完就关,下次再传再建。
为什么这么设计?历史上是为了命令和数据互不干扰——传大文件的同时,控制连接还能发命令(比如中止 ABOR)。但这个双通道设计也带来了 FTP 最大的麻烦:数据连接怎么建、由谁发起,直接和防火墙/NAT 冲突。
二、主动模式:服务器「回连」客户端,NAT 时代的死穴
主动模式(Active)里,“主动” 指的是服务器主动发起数据连接:
① 客户端(1026) ──连──→ 服务器(21) 建立控制连接
② 客户端 → PORT 命令:「我在 IP=x.x.x.x, 端口=1027 等你」
③ 服务器(20) ──连──→ 客户端(1027) 服务器主动回连,建数据连接
在早期互联网(没有 NAT、没有严格防火墙)时代这没问题。但今天的客户端几乎都在NAT 路由器后面 + 有防火墙:
- 客户端在
PORT命令里报的是自己的内网 IP,服务器根本连不到。 - 就算报对了公网 IP,客户端防火墙也会拦截这个「凭空冒出来的入站连接」(它不知道这是 FTP 数据连接)。
结果:控制连接能登录,一执行 LIST 或下载就卡住、超时。这就是主动模式被淘汰的根本原因。
三、被动模式:让客户端来连,NAT 友好
被动模式(Passive)反过来——服务器「被动」等客户端来连数据端口:
① 客户端(1026) ──连──→ 服务器(21) 建立控制连接
② 客户端 → PASV 命令
③ 服务器 → 「我开了端口 50123,你来连我」
④ 客户端(1027) ──连──→ 服务器(50123) 客户端主动连,建数据连接
关键变化:数据连接和控制连接方向一致,都是客户端主动往外连。而 NAT/防火墙的默认策略正是「允许内部主动出去、禁止外部主动进来」,所以被动模式天然畅通。
代价是难受的换成了服务器:服务器得开放一段被动端口范围(如 50000-50100)供外部连入,并在防火墙上放行。所以你配置 FTP 服务器时,除了 21 端口,还要配一个「被动端口范围」,就是为这个。
结论:互联网上对外提供的 FTP 服务,几乎都用被动模式;主动模式只在服务器/客户端同在一个可信内网、无 NAT 阻隔时才偶尔用。
四、别把 FTP、FTPS、SFTP 搞混(高频陷阱)
名字很像,本质完全不同:
- FTP:本文说的老协议,明文传输(用户名、密码、文件都不加密),双通道。不安全,正在被淘汰。
- FTPS:FTP over TLS,就是给 FTP 套一层 TLS 加密(类似 HTTP→HTTPS)。还是 FTP 那套双通道模型,只是加密了。
- SFTP:SSH File Transfer Protocol,是基于 SSH(22 端口)的文件传输,和 FTP 没有任何继承关系,只是名字撞脸。它是单连接、全程加密,不需要操心主动/被动模式,配置简单又安全——现在的首选。
面试易错点:SFTP ≠ FTPS。SFTP 是 SSH 的子系统(单连接、22 端口);FTPS 是加了 TLS 的传统 FTP(双连接)。
五、传输类型:ASCII 模式 vs 二进制模式
FTP 还有个历史遗留的小坑:它区分两种传输类型:
- ASCII 模式:会自动转换不同系统的换行符(Windows 的
\r\n↔ Unix 的\n)。只适合纯文本文件。 - 二进制(Binary/Image)模式:原样传输每一个字节,不做任何转换。
如果用 ASCII 模式传了图片、压缩包、可执行文件,字节被「换行符转换」改动,文件就损坏了。所以传非文本文件必须用二进制模式。现在大多数客户端默认二进制,但这是个经典面试/踩坑点。
六、为什么 FTP 在走下坡路
综合看,FTP 的问题很集中:明文不安全、双通道对 NAT/防火墙不友好、ASCII/二进制模式易踩坑。现代替代方案更好:
- 要安全文件传输 → SFTP(基于 SSH,单连接、加密、无 NAT 烦恼)。
- Web 场景传文件 → 直接 HTTPS(表单上传 / 断点续传 / 对象存储)。
- FTP 如今主要活在一些遗留系统和内部批处理里。
七、常见误区与追问
| 考点 | 正确口径 |
|---|---|
| 主动模式 | 客户端连服务端 21,服务端从 20 主动连客户端数据端口 |
| 被动模式 | 客户端同时主动连服务端控制端口和服务端开放的数据端口 |
| NAT 友好性 | 被动模式更适合客户端在 NAT/防火墙后 |
active:
client -> server:21 control
server:20 -> client:random data
passive:
client -> server:21 control
client -> server:passive-port data
FTP 特殊在控制连接和数据连接分离,主动/被动的区别就在数据连接由谁主动发起。
- 误区:FTP 只有一个 TCP 连接。 FTP 有控制连接和数据连接,目录列表和文件传输走数据连接。
- 误区:主动模式对客户端最友好。 主动模式要求服务端连回客户端,客户端在 NAT 后常失败。
- 误区:被动模式不需要开放数据端口。 服务端必须开放一段被动端口范围给客户端连接。
- 追问:为什么 FTP 穿防火墙麻烦? 数据连接端口动态变化,且主动模式存在反向连接。
- 追问:FTPS 和 SFTP 是一回事吗? FTPS 是 FTP over TLS,SFTP 是 SSH 文件传输协议,协议完全不同。
- 追问:生产中怎么配置被动模式? 限定被动端口范围,在防火墙和 NAT 上放通并配置正确公网地址。
八、加强记忆
FTP 用双连接:控制连接(21,传命令)+ 数据连接(传文件)。数据连接怎么建分两种:主动模式(PORT)服务器回连客户端——被客户端 NAT/防火墙挡,已淘汰;被动模式(PASV)客户端连服务器——方向和控制连接一致,穿 NAT,是默认(代价是服务器要开被动端口范围)。传非文本文件要用二进制模式(ASCII 模式会改换行符损坏文件)。FTP 明文不安全,现代首选 SFTP(基于 SSH,单连接加密,≠ FTPS)。