![主动 FTP 和被动 FTP 有什么区别?](https://linux22.com/image/581193/%E4%B8%BB%E5%8A%A8%20FTP%20%E5%92%8C%E8%A2%AB%E5%8A%A8%20FTP%20%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
主动 FTP 和被动 FTP 有什么区别?
注意:我认为这是一个社区 wiki 问题,很有用。此外,我希望有人能给出一个清晰简洁的答案,例如这个问题:IPv4 子网划分如何工作?
答案1
主动和被动是 FTP 可以运行的两种模式。FTP 在客户端和服务器之间使用两个通道,即命令通道和数据通道,它们实际上是单独的 TCP 连接。命令通道用于命令和响应,数据通道用于实际传输文件。这是一种向服务器发送命令的巧妙方法,无需等待当前数据传输完成。
在主动模式下,客户端建立命令通道(从客户端端口X
到服务器端口21
(b)),但服务器建立数据通道(从服务器端口20
(b)到客户端端口Y
,Y
由客户端提供)。
在被动模式下,客户端会建立两个通道。在这种情况下,服务器会告诉客户端应该使用哪个端口作为数据通道。
被动模式通常用于 FTP 服务器无法建立数据通道的情况。其中一个主要原因是网络防火墙。虽然您可能有一条防火墙规则允许您打开 FTP 通道ftp.microsoft.com
,但 Microsoft 的服务器可能无法通过防火墙打开数据通道。
被动模式通过从客户端打开两种类型的通道解决了这个问题。为了使这一点更清楚:
主动模式:
- 客户端打开从客户端端口 2000 (a)到服务器端口 21 (b)的命令通道。
- 客户端向服务器发送
PORT 2001
(a),并且服务器在命令通道上确认。 - 服务器打开从服务器端口 20 (b)到客户端端口 2001 (a)的数据通道。
- 客户端在数据通道上确认。
被动模式:
- 客户端打开从客户端端口 2000 (a)到服务器端口 21 (b)的命令通道。
PASV
客户端通过命令通道发送给服务器。- 服务器开始监听该端口后,发回(在命令通道上)
PORT 1234
(a) 。 - 客户端打开从客户端2001 (a)到服务器端口1234 (a)的数据通道。
- 服务器在数据通道上确认。
此时,命令和数据通道均已打开。
(a)注意客户端的端口选择是由客户端决定的,就像被动模式下服务器数据通道端口的选择是由服务器决定的一样。
(b)进一步注意,使用端口 20 和 21 只是一种惯例(尽管是一种强惯例)。虽然客户端和服务器都必须就使用哪个端口达成一致,但并没有绝对要求使用这些端口。我见过一些实现试图通过使用不同的端口来隐藏客户端(在我看来,这是徒劳的)。
原始答案来自堆栈溢出