检索多个网络数据包时与 FTP 服务器的连接挂起(永不结束)

检索多个网络数据包时与 FTP 服务器的连接挂起(永不结束)

我的 FTP 服务器 (ftp.cluster003.ovh.net) 出现了问题,具体来说是当我从家里连接它时出现的问题(无论是什么客户端、计算机或操作系统)。

当我连接到另一个 FTP 服务器(ftp.phpnet.org)或从我的办公室连接到 ftp.cluster003.ovh.net 时,该问题并没有出现。

在家里,我通过 Netgear D6000 DSL 调制解调器路由器连接。

症状如下:每当我尝试从服务器检索一些数据时,如果要检索的数据量无法容纳在单个网络数据包中,则事务永远不会结束。当然,这种情况在检索文件时会发生,但在列出目录内容时也会发生,当目录中有大约 20 个以上的文件时(服务器的回复包含文件的权限和所有者,因此列出的每个文件大约对应 70 字节的数据)。

会话示例(Linux 下):

% for i in `seq 1 385`;do printf "$i-";done > file1
% for i in `seq 1 395`;do printf "$i-";done > file2
% ftp ftp.cluster003.ovh.net
Connected to ftp.cluster003.ovh.net.
220-  ~~~ Welcome to OVH ~~~
220 This is a private system - No anonymous login
Name (ftp.cluster003.ovh.net:XXXXXXXX): XXXXXXXX
331 User XXXXXXXX OK. Password required
Password:
230-OK. Current restricted directory is /
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> put file1
local: file1 remote: file1
200 PORT command successful
150 Connecting to port 56721
226-File successfully transferred
226 0.087 seconds (measured here), 16.14 Kbytes per second
1432 bytes sent in 0.00 secs (24.3868 MB/s)
ftp> put file2
local: file2 remote: file2
200 PORT command successful
150 Connecting to port 39725
226-File successfully transferred
226 0.111 seconds (measured here), 12.93 Kbytes per second
1472 bytes sent in 0.00 secs (17.9975 MB/s)
ftp> ls
200 PORT command successful
150 Connecting to port 46431
drwx---r-x    2 644709     users               4 Jan  2 13:02 .
drwx---r-x    4 644709     users               8 Dec 31 12:58 ..
-rw----r--    1 644709     users            1432 Jan  2 13:02 file1
-rw----r--    1 644709     users            1472 Jan  2 13:02 file2
226-Options: -a -l
226 4 matches total
ftp> get file1
local: file1 remote: file1
200 PORT command successful
150 Connecting to port 35507
226-File successfully transferred
226 0.001 seconds (measured here), 2.71 Mbytes per second
1432 bytes received in 0.00 secs (529.3102 kB/s)
ftp> get file2
local: file2 remote: file2
200 PORT command successful
150 Connecting to port 56107
^C
receive aborted
waiting for remote to finish abort
226-File successfully transferred
226 0.000 seconds (measured here), 2.91 Mbytes per second
500 ?

如果我不用Ctrl+中断C,则什么也不会发生,服务器最终会超时。观察 Wireshark 发生的情况时,可以看到 file1 适合单个数据包,而 file2 则不适合。

file1 适合单个框架

file2 没有

接收到了 file2 的最后一个数据包,但没有接收到之前的数据包。这是完全确定的。您知道是什么原因导致了这个问题以及如何解决它吗?

答案1

显然,其他拥有 Netgear D6000 调制解调器路由器的人也报告了这个问题,例如:

解决方案(对我来说也有效)是禁用路由器的“端口扫描和 DoS 保护”功能。

相关内容