FTP主动连接和被动连接
FTP是一种特殊的协议,它使用两个独立的连接来进行文件传输:
- 控制连接:用于发送命令和接收响应(例如:登录、切换目录、列出文件列表)。客户端使用一个随机端口连接到服务器的21端口。
- 数据连接:专门用于实际传输文件内容或目录列表。
主动模式和被动模式的核心区别在于:由谁(服务器还是客户端)来建立数据连接。
1. 主动模式
在主动模式下,服务器主动发起数据连接到客户端。
工作流程:
- 客户端从一个随机端口(例如,端口 A)连接到服务器的21端口,建立控制连接。
- 客户端需要传输数据时,会通过控制连接发送一个
PORT
命令给服务器。这个命令告诉服务器:“请连接到我的 IP 地址和另一个随机端口(例如,端口 B)来建立数据连接。” - 服务器从自己的20端口主动连接到客户端在
PORT
命令中指定的端口(端口 B)。 - 数据连接建立成功,开始传输数据。
特点与问题:
- 对客户端友好:客户端的防火墙规则简单,因为它只需要开放一个用于控制连接的端口。
- 对服务器不友好:服务器需要能够访问到客户端的高位随机端口。
- 对客户端网络环境不友好:如果客户端位于防火墙或NAT(如家庭或公司网络)之后,服务器的连接请求(从20端口到客户端的端口B)很可能被客户端的防火墙拦截,导致连接失败。
简单比喻:
主动模式就像打电话订餐(控制连接),然后告诉餐厅你的地址(PORT命令),餐厅派外卖员(服务器)主动把餐送到你家(数据连接)。
2. 被动模式
在被动模式下,服务器被动等待客户端发起数据连接。这是现代网络环境下更常用、更推荐的方式。
工作流程:
- 客户端从一个随机端口(端口 A)连接到服务器的21端口,建立控制连接。(这一步与主动模式相同)
- 客户端需要传输数据时,会通过控制连接发送一个
PASV
命令给服务器。 - 服务器收到命令后,会在自己的主机上开启一个随机的高位端口(例如,端口 P),然后通过控制连接告诉客户端:“我已经在端口 P 上准备好了,请你来连接我。”
- 客户端使用另一个随机端口(例如,端口 B)主动连接到服务器告知的端口 P。
- 数据连接建立成功,开始传输数据。
特点与问题:
- 对服务器友好:服务器的防火墙只需要开放21端口和一系列用于数据连接的高位端口。
- 对客户端友好:由于是客户端主动发起所有连接(控制连接和数据连接),因此可以轻松穿透客户端的防火墙和NAT设备。
- 对服务器安全要求高:服务器需要开放一个较大范围的高位端口,这增加了被攻击的面,需要合理配置防火墙。
简单比喻:
被动模式就像打电话订餐(控制连接),餐厅告诉你一个取餐码和柜台号(PASV响应),然后你需要自己主动去柜台取餐(数据连接)。
总结对比
特性 | 主动模式 | 被动模式 |
---|---|---|
数据连接发起方 | 服务器 | 客户端 |
服务器端口 | 控制:21, 数据:20 | 控制:21, 数据:一个随机高位端口 |
客户端端口 | 两个随机端口 | 两个随机端口 |
防火墙/NAT友好性 | 对客户端网络不友好 | 对双方都更友好(现代网络首选) |
FTP命令 | PORT | PASV |
适用场景 | 服务器能够直接访问客户端IP的场景(如局域网内) | 客户端在防火墙/NAT后的场景(如互联网) |
在现代互联网环境中,由于绝大多数客户端都位于防火墙或NAT设备之后,被动模式是默认且更可行的选择。