当我尝试通过 HTTP 下载文件时,下载有时会在 30 MB 左右后停止。下载速率降至 0 B/s,并且没有数据继续传输。当我停止下载并再次恢复时,下载仍然挂起。但是当我再次从字节 0 重新下载时,在 30 MB 之前一切都正常,然后再次停止。有时,几个小时后,它又可以正常工作,没有任何问题。下载停止时文件中的位置是可变的,但大多数情况下它在 30-35 MB 左右。
我使用 wget 作为下载管理器。使用 curl 和其他下载管理器时也会出现同样的情况。错误与我从哪个服务器下载无关。我也在我的网络中的其他 Linux 计算机上观察到了此错误。我网络上的所有计算机都运行 x86 上的 Gentoo Linux。
我网络上的所有互联网连接都通过网络上的一台服务器,该服务器在端口 80 上运行透明的 Squid 代理。该服务器连接到一台路由器,该路由器是德国电信公司的 Speedport W 700V。该路由器使用 ADSL 连接到互联网,下行速度为 448 kbit/s,上行速度为 96 kbit/s。
我几乎可以肯定问题不在我的透明代理上。我关闭了它,但问题没有解决。我还通过 WLAN 直接连接到路由器,但问题没有解决。我还尝试通过 HTTP 在另一个端口上下载。此外,我尝试使用带有 Gateway6 隧道的 IPv6 从我的计算机下载文件,结果出现了完全相同的问题。
现在奇怪的是,使用 FTP 和 HTTPS(在同一台计算机上使用 wget 也一样)一切都运行正常。更奇怪的是:当我使用 FTP 或 HTTPS 恢复通过 HTTP 挂起的下载时,以这种方式下载几个字节,停止 wget,然后再次使用 HTTP 恢复,它会再次加载数据!但几 MB 之后,它可能会再次停止。不幸的是,以这种方式下载的文件总是损坏的(MD5 总和不正确),因此在某个时候,一定有伪造的数据。我尝试在下载的文件中搜索 HTML 错误消息,但 grep -i html 没有找到任何东西。(我想不出在文件中搜索 GZIP 压缩的 HTML 错误消息的方法,所以我没有尝试。)
当 wget 无法恢复下载时,我尝试使用 strace 进行恢复,您可以找到整个输出在 pastebin 上每秒都会重复这句重要的台词:
clock_gettime(CLOCK_MONOTONIC, {326102, 62176435}) = 0
) = 1
write(2, "78% [++++++++++++++++++++++++++++"..., 19578% [+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ] 110,683,685 --.-K/s ) = 195
select(4, [3], NULL, NULL, {0, 949999}) = 0 (Timeout)
我完全不知道这个问题的原因是什么。似乎导致问题的原因与 HTTP 有关。它似乎非常智能地使用 HTTP,甚至在 IPv6-over-IPv4 隧道中也能识别它。但那可能是什么?为什么它只是偶尔发生?另一种可能性是,我的电脑上存在一个问题,其他 Gentoo Linux 电脑上也存在同样的问题。
有人遇到过这样的问题吗?原因可能是什么?我需要在哪里继续调查才能了解有关该问题的更多信息?
更新:
我刚刚又遇到了这个问题,并尝试通过路由器的 WLAN 恢复下载,这次成功了。也许我在上次使用 WLAN 测试时做错了什么。现在也许我的透明代理服务器实际上是问题所在。它是一个非常基本的 Squid 代理服务器,不缓存任何内容。也许有趣的是,第二个 Squid 代理在另一个端口上运行在同一台计算机上。
更新:
下载再次挂起,这次我关闭了所有防火墙设置并停止了所有代理服务器。我无法从直接连接到路由器的网络服务器恢复下载。所以我的代理服务器肯定不是问题的原因。我现在将尝试升级路由器的固件,尽管我没有管理员权限。我会看看我能做些什么。
更新:
升级路由器的最新固件也没有用。我看不出除了我的 ISP 的错误之外还有什么其他可能性。我的“解决方案”现在是将所有流量通过其他地方的 SSH 服务器进行隧道传输。
答案1
更奇怪的是:当我使用 FTP 或 HTTPS 恢复通过 HTTP 挂起的下载时,以这种方式下载几个字节,停止 wget,然后再次使用 HTTP 恢复,它会再次加载数据!但几 MB 之后,它可能会再次停止。不幸的是,以这种方式下载的文件总是损坏(MD5 总和不正确)
这表明“代理损坏”了。恢复 HTTP 下载的协议并不复杂(它只是一个额外的标头),但这正是代理损坏会造成混乱的那种情况。
我敢打赌,如果您尝试使用 wget 下载一个大文件,等待它失败,然后运行 wget -c 将 http 更改为 https,它将正常恢复。
答案2
这篇文章真的很老了,所有的网络基础设施早已被替换了,但我仍然想发布解决方案,而我以前没有发布过。
问题是由连接我的网络服务器和路由器的网卡引起的。更换网卡解决了这个问题。我不知道问题到底是什么,一定是由某些特定字节序列或某些其他条件引起的固件错误。