我有一个 FTP 服务器,在测试时我发现了一个我不明白的奇怪问题。我对文件“/Folder1/file.txt”发送 RETR 命令,它工作正常。然后我对文件“/Folder1/SubFolder1/file.txt”发送 RETR 命令,它在将数据传输到客户端时超时。这是在主动模式下。当我切换到被动模式时,它工作正常。
我理解这两种模式的区别,但我不明白为什么在活动模式下它对一个文件有效,而对另一个文件无效。我试了十几次,结果仍然一样。
有什么想法吗?谢谢!
答案1
如果你检查文件传输协议的官方规范,你会发现:
FTP 可以以主动模式或被动模式运行,这控制着如何打开第二个连接。在主动模式下,客户端向服务器发送客户端将用于数据连接的 IP 地址端口号,然后服务器打开连接。被动模式是为客户端位于防火墙后面且无法接受传入 TCP 连接的情况而设计的。服务器向客户端发送 IP 地址和端口号,然后客户端打开与服务器的连接。这两种模式都在 1998 年 9 月进行了更新,以增加对 IPv6 的支持,并对被动模式进行了一些其他更改,使其成为扩展的被动模式。
因此,我首先想到的是您的文件夹权限有问题。请仔细检查。
答案2
我猜测第一个文件足够小,可以通过同一个连接传输,但第二个文件较大。
答案3
尽管在这种情况下不太可能出现另一个可以想象您可能遇到的问题是客户端的防火墙。主动 FTP 要求客户端打开服务器连接的 TCP 端口以进行文件传输。
客户端的防火墙可能有一个可访问的扩展端口,但没有其他端口,因此第一个文件可以通过第一个端口访问,而不允许通过任何其他扩展端口访问(客户端倾向于以增量方式分配 TCP 端口)。
现在被动FTP服务器分配 TCP 端口进行传输,客户端连接到服务器。在这种情况下,客户端防火墙不再会造成太大麻烦,因为客户端正在连接到外部世界(防火墙保护外部世界不连接到防火墙内部)。
我几乎总是发现,从损坏的主动模式切换到正常的被动模式表明防火墙存在问题。
现在来看一个图表:
Active FTP
client:n ---RETR portnum1---> server:21
client:portnum1 <---fetches-- server:m1
client:n ---RETR portnum2---> server:21
client:portnum2 <---fetches-- server:m2
Passive FTP
client:n ---PASV request----> server:21
client:n <--PORT portnum1---- server:21
client:n2 --fetches---------> server:portnum1
client:n ---PASV request----> server:21
client:n <--PORT portnum2---- server:21
client:n3 --fetches---------> server:portnum2
请注意,端口 21 是命令通道。这是指令发送/接收的地方。其他端口用于实际数据传输。