如何防止在FTP大文件时TCP连接超时?

我无法从互联网FTP(检索)一个大文件到我的Linux VM。 它过了一段时间。

实际的错误是“ 无法读取来自控制连接的回复 – 超时几分钟后,在文件的一大块已经被传输之后,会发生此错误。

设置是:

 FTP客户端:ncftpget在VMWare Player 3.0的Linux上运行
 FTP服务器:在互联网上的其他人的机器,configuration未知
客户操作系统:Ubuntu 8.10 Linux 32位,安装了vmxnet和vmware工具。
主机操作系统:Vista 64位
networking:Linux VM通过桥接NIC连接到Internet(也尝试NAT)
 FTP模式:PASV

我确实发现了一些论坛post,提到了2分钟的超时时间。 但究竟在哪里以及如何解决这个问题还不清楚。 一些故障排除步骤已经尝试

  • 我已经从VMWare Player 3.0切换到VirtualBox 3.0.x,但没有运气。
  • 我也从NAT更改为桥接虚拟网卡,但没有运气

更新 Linux虚拟机上的Netstat和DIR-655路由器上的等效pipe理页面都显示连接是活着的(tcp'ESTABLISHED'状态)。 Vista根本没有看到连接,如果连接状态只在虚拟机内pipe理,我想这是正常的。

下面是Vista上的netsh interface tcp show global的输出,以防万一:

 C:\ Users \ alex> netsh interface tcp show global
查询活动状态...

 TCP全局参数
 ----------------------------------------------
接收方缩放状态:启用
烟囱卸载状态:禁用
接收窗口自动调节级别:高度限制
附加拥塞控制提供程序:无
 ECNfunction:禁用
 RFC 1323时间戳:已禁用
 **上面的autotuninglevel设置是Windows Scaling启发式的结果
覆盖任何本地/策略configuration。

为了排除故障,请尝试通过wgetcurl下载相同的文件。 我怀疑PEra是正确的,NOOP命令会阻止这个,可能wget或curl会发送它们。

如果你正在经历NAT,NAT定时器很可能会断开你的连接。 我从酒店的房间看到这个东西,在那里我呆了一会儿,却没有做点什么(有时候只有5分钟!)

 # echo 60 > /proc/sys/net/ipv4/tcp_keepalive_time # echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl # echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes 

试试这些。 这将导致每隔一分钟在所有TCPstream上发送一个保持连接,而不pipe套接字上的活动。

请注意,ftp客户端实际上可能不会使用keepalive。 这是应用程序必须要求的东西。 如果失败了,安装另一个FTP客户端可能会更好。 NetBSD的FTP客户端(lukemftp)可能是可用的,并且是我见过的最好的命令行FTP客户端。

远程端也可能由于不活动而closures连接。 如果是这样,它对现实有一个相当破碎的想法。 如果上面这些TCP keepalive攻击没有解决,客户端将不得不定期发送一些命令(NOOP等),否则FTP服务器的pipe理员将不得不改变它们的结束。

它可能是您的虚拟机和FTP服务器之间的任何过滤设备。 大多数防火墙(包括家庭路由器)都有一个状态表,空闲的TCP会话在某个超时后被重置。

您可以将虚拟机网卡更改为桥接模式(而不是NAT)来整理主机操作系统。 然后, 确保您的FTP客户端定期发送NOOP命令以保持命令通道的打开。 如果发现命令会话已closures,则会有closures数据连接的防火墙。 无论数据连接是闲置还是stream量

HTH,
PERA

如果你是从命令行执行此操作,请尝试启用“哈希”(“二进制”是我总是打开的另一个)。 这可能会在控制端口上产生足够的stream量以防止超时。

FTP使用两个套接字 – 一个用于控制,一个用于数据。

这很可能是因为该套接字上处于非活动状态而导致控制连接超时的VM上的NAT状态表。

您可以通过在虚拟机系统上启用“主动FTP”来解决这个问题,希望这将导致VMware主动监视FTP会话,并且只要数据仍在stream动,就保持控制套接字处于活动状态。

如果FTP服务器是Vista,则转到FTP站点属性,并将超时从15分钟(默认)增加。 您尝试传输的文件有多大?