FTP主动模式与被动模式
FTP服务器提供了两种传输数据的模式,主动模式和被动模式,这二者的区别在哪里?为什么会有这两种工作模式?本文将详细介绍。
FTP 工作原理
启动 FTP
在客户端,通过交互的用户界面,客户从终端输入启动FTP的用户交互式命令。
建立控制连接
客户端 TCP 协议层根据用户命令给出的服务器 IP 地址,向服务器提供 FTP 服务的 21 端口(该端口是 TCP 协议层用来传输 FTP 命令的端口)发出主动连接的请求,服务器收到请求后,通过 3 次握手,就在进行FTP命令处理的用户协议解释器进程和服务器协议解释器进程之间建立一条TCP连接。
建立数据连接
当客户通过交互式的用户界面,向 FTP 客户端发出要下载服务器上某一文件的命令时,该命令被送到用户协议解释器,客户端建立数据连接进程,并通过控制连接告知服务器要建立数据连接,服务器根据收到的命令建立数据连接进程,并根据实现约定好的主动/被动模式进行数据连接的建立。
FTP 两种工作模式
主动模式
- 客户端向服务器端发送 PORT 命令
客户端创建数据套接字
客户端绑定一个临时端口
客户端在套接字上监听
将IP与端口格式化为 h1,h2,h3,h4,p1,p2 - 服务器端以 200 响应
服务器端解析客户端发过来的 IP 与端口暂存起来,以便后续建立数据连接 - 客户端向服务器端发送 LIST
服务器端检测在收到 LIST 命令之前是否接收过PORT或PASV命令
如果没有接受过,则响应 425 Use PORT or PASV first
如果有接收过,并且是 PORT,则服务器端创建数据套接字( bind 20 端口),调用 connect 主动连接客户端IP与端口,从而建立数据连接 - 服务器发送 150 应答给客户端,表示准备就绪,可以开始传输了
- 开始传输列表
- 服务器发送 226 应答给客户端,表示数据传输结束
传输结束,服务器端主动关闭数据套接字被动模式
- 客户端向服务器端发送 PASV 命令
- 服务器端以 227 响应
服务器端创建监听套接字
服务器端绑定一个临时端口
服务器在套接字上监听
将IP与端口格式化为 h1,h2,h3,h4,p1,p2 响应给客户端,以便客户端发起数据连接 - 客户端向服务器端发送 LIST
服务器端检测在收到 LIST 命令之前是否接受过PORT或PASV命令
如果没有接收过,则响应 424 Use PORT or PASV first
如果有接收过,并且是 PASV,则调用 accept 被动接受客户端的连接,返回已连接套接字,从而建立数据连接 - 服务器发送 150 应答给客户端,表示准备就绪,可以开始传输
- 开始传输列表
- 服务器发送 226 应答给客户端,表示数据传输结束
传输结束,客户端主动关闭数据套接字
NAT或防火墙对主被动模式的影响
什么是 NAT
NAT(Network Address Transiation),网络地址转换,通过 NAT 可以将内网私有 IP 地址转换为公网 IP 地址,一定程度上解决了公网地址不足的问题。
FTP客户端处于NAT或防火墙之后的主动模式
- 建立控制连接通道:
因为 NAT 会主动记录由内部发送外部的连接信息,而控制连接通道的建立是由客户端向服务器端连接的,因此这一条连接可以顺利建立起来。 - 客户端与服务器端数据连接建立时的通知
客户端先启用 PORT BB 端口,并通过命令通道告知 FTP 服务器,且等待服务器的主动连接 - 服务器主动连接客户端
由于通过 NAT 转换之后,服务器只能得知 NAT 的地址并不知道客户端的 IP 地址,因此 FTP 服务器会以 20 端口主动向 NAT 的 PORT BB 端口发送主动连接请求,但 NAT 并没有启用 PORT BB 端口,因而连接被拒绝。
FTP客户端处于NAT或防火墙之后的被动模式
FTP服务器处于NAT或防火墙之后的被动模式
FTP服务器处于NAT或防火墙之后的主动模式
总结
模式 | 客户端在 NAT 后 | 服务器在 NAT 后 |
---|---|---|
主动模式 | × | √ |
被动模式 | √ | × |