FTP主动与被动模式

我有一个FTP服务器,在做testing的时候,我发现了一个奇怪的问题,我不明白。 我发送一个RETR命令文件“/Folder1/file.txt”,它工作正常。 然后我在文件“/Folder1/SubFolder1/file.txt”上发送一个RETR命令,并将数据传输到客户端。 这是在主动模式。 当我切换到被动模式,它工作正常。

我理解这两种模式之间的区别,但是我不明白为什么它在主动模式下工作一个文件,而不是另一个。 我试了十几遍,仍然得到了相同的结果。

有任何想法吗? 谢谢!

如果你检查文件传输协议的官方规范 ,你会发现:

FTP可以在主动模式或被动模式下运行,从而控制第二个连接如何打开。 在主动模式下,客户端向服务器发送客户端用于数据连接的IP地址端口号,服务器将打开连接。 被动模式被devise用于客户端在防火墙之后并且不能接受传入的TCP连接。 服务器向客户端发送IP地址和端口号,客户端打开与服务器的连接。 两种模式都在1998年9月更新,增加了对IPv6的支持,并对被动模式进行了一些其他的改变,从而扩展了被动模式。

所以,我的第一个想法是,您的文件夹权限有问题。 仔细检查他们。

我猜测第一个文件足够小,可以在同一个连接上传输,但第二个文件更大。

虽然在这种情况下不太可能出现另外一个可能的问题,那就是客户的防火墙。 主动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是命令通道。 这是指令发送到的地方。 其他端口用于实际数据传输。