其中一个答案说:
如果每次都连接到同一个端口 (20),服务器将无法分辨您连接的是什么文件。端口号充当控制连接上的传输请求和数据连接之间的链接。请注意,数据连接上没有“协议”,客户端可以使用它来告知它请求的内容。端口号是服务器拥有的唯一唯一信息。
如果两个客户端同时请求传输,而服务器在单个端口上接受数据连接,则服务器将无法判断要传输什么文件。当然,服务器可以使用客户端 IP 来做出决定(实际上,出于安全考虑,许多 FTP 服务器都会验证客户端 IP 是否与控制连接上使用的 IP 相匹配)。
但这不适用于:
来自同一台机器的多个连接(大多数 FTP 客户端都支持并行传输/队列)。来自同一(企业)网络内的不同机器的连接,因为它们具有相同的外部 IP。
这对我来说非常有意义。
但在FTP主动模式下我了解到数据是在端口20上服务的,那么上述问题在主动模式下怎么会不存在呢?
答案1
我担心互联网上充斥着有关端口 20 的虚假信息。即使是像维基百科这样据称可靠的来源,在我看来对此也不清楚。
端口 20 用作主动模式下从服务器到客户端的数据连接的源端口(在服务器端)。我甚至不确定服务器是否遵循这一点,因为据我所知,这几乎没有任何意义。无论如何,源端口信息在客户端和服务器之间的第一个防火墙/NAT 上丢失。例如新版本的 FileZilla 服务器不再使用端口 20。
只有目标端口(被动模式下为服务器端,主动模式下为客户端)才有意义。在主动模式下,客户端开始监听随机端口并使用PORT
命令将其发送到服务器。服务器发起连接,因此服务器知道连接的用途(与被动模式下客户端知道的方式相同)。当服务器连接到客户端的随机端口时,客户端可以(根据端口)知道将通过该连接传输什么文件(与被动模式下服务器知道的方式相同)。同样,端口 20 在这里没有意义。
答案2
但是,在FTP主动模式下,我了解到数据在端口20上提供服务,那么上述问题在主动模式下怎么不存在呢?
在 FTP 主动模式下,服务器连接到客户端先前使用命令提供的(临时)端口port
(请参阅 Martin 的回答)。在双方,连接都由客户端IP:客户端端口元组。
从历史上看,客户端也可能使用其“默认”端口来接收/发送数据,即它用于连接到服务器的服务端口 21 的端口。为了区分数据连接和服务连接,服务器需要使用不同的源端口。如果没有仲裁,服务器将使用其服务端口号减一。
当然,这在今天可能被认为是异想天开的,尤其是从安全角度来看。由于繁琐的反向服务器→客户端连接,FTP 主动模式已基本不再使用。