在FTP被动模式下,我读到服务器向客户端发送一个随机端口号,在那里它可以建立数据通道。
然后客户端建立从它的随机端口号到服务器发送的这个端口号的数据通道。
我的问题是为什么服务器会向客户端发送一个随机端口号?为什么客户端不能直接建立到服务器端20号端口的数据通道?
在FTP被动模式下,我读到服务器向客户端发送一个随机端口号,在那里它可以建立数据通道。
然后客户端建立从它的随机端口号到服务器发送的这个端口号的数据通道。
我的问题是为什么服务器会向客户端发送一个随机端口号?为什么客户端不能直接建立到服务器端20号端口的数据通道?
这就是 FTP 协议被设计为在被动模式下工作的方式。这可能不是一个好主意,因为我认为这个模型不会在任何其他协议中再次重复(对于 FTP 活动模式更是如此)。维基百科 FTP 文章提到FTP 是这样设计的,因为最初它不是为了在 TCP/IP 上运行。
在数据连接端口上,没有协议。服务器所知道的——唯一在该连接中携带任何信息的东西——是您连接到的端口号。
如果您每次都连接到同一个端口,服务器将无法判断您连接的是哪个文件。端口号用作控制连接上的传输请求和数据连接之间的链接——端口号包含在对PASV
命令的响应中。
如果两个客户端同时请求传输,当服务器接受单个端口上的连接时,服务器将无法确定要传输的文件。当然,服务器可以使用客户端 IP 来做决定(实际上,许多 FTP 服务器确实会验证客户端 IP 是否与控制连接上使用的 IP 匹配,以确保安全)。
但这不适用于:
部分复制自我对为什么 FTP 被动模式需要端口范围而不是仅一个端口的回答?关于服务器故障。
通常,服务器不会发送随机端口,而是从定义的(通过安装)范围/池发送一个免费端口 - 对于客户端来说,这看起来是随机的。该端口需要在需要定义范围的防火墙处转发。
不幸的是,FTP 是古老的。我猜,除了端口之外,古代服务器无法区分多个客户端的数据会话。通常,最好转向更新的协议,在这些协议中,所有内容都在单个套接字会话中整齐地打包。