HTTP 下載在一段時間後停止,無法恢復
當我嘗試通過 HTTP 下載文件時,下載有時會在大約 30 MB 後停止。下載速率降至 0 B/s,並且沒有數據源源不斷。當我停止下載並再次恢復時,下載仍然掛起。但是當我再次從字節 0 重新下載它時,當它再次停止時,一切正常,最高可達 30 MB。有時,幾個小時後,它又可以正常工作了。下載停止時文件中的位置是可變的,但大多數情況下約為 30–35 MB。
作為下載管理器,我使用 wget。儘管使用 curl 和其他下載管理器也會發生相同的行為。該錯誤與我下載的伺服器無關。我還在網路中的其他 Linux 電腦上觀察到此錯誤。我網路上的所有電腦都在 x86 上執行 Gentoo Linux。
我網路上的所有 Internet 連接都通過我網路上的伺服器,該伺服器在埠 80 上執行透明的 Squid 代理。該伺服器連接到路由器,該路由器是德國電信公司的 Speedport W 700V。該路由器使用 ADSL 連接到網際網路,下行速度為 448 kbit/s,上行速度為 96 kbit/s。
我幾乎可以肯定我的透明代理不是問題。我在沒有解決問題的情況下關閉了它。我也直接通過 WLAN 連接到路由器而沒有解決問題。我還嘗試通過 HTTP 通過另一個埠下載。此外,我嘗試使用 IPv6 和 gateway6 隧道從我的電腦下載文件,這導致了完全相同的問題。
現在奇怪的是,使用 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 伺服器隧道傳輸所有流量。
這個文章真的很老了,所有的網路基礎設施都換了很久了,但是我還是想發一下解決方案,那天我沒有發回。
問題是由連接我的網路伺服器和路由器的網卡引起的。換卡解決了這個問題。我不知道究竟是什麼問題,它一定是由某些特定字節序列或某些其他條件引起的韌體錯誤。
更奇怪的是:當我使用 FTP 或 HTTPS 恢復掛在 HTTP 上的下載時,以這種方式下載幾個字節,停止 wget 然後再次使用 HTTP 恢復,它再次載入數據!但在幾 MB 之後,它可能會再次停止。不幸的是,以這種方式下載的文件總是被破壞(MD5 和不正確)
這尖叫著“損壞的代理” 恢復 HTTP 下載的協議一點也不復雜(它只是一個額外的標頭),但這正是損壞的代理會搞砸的事情。
我敢打賭,如果您嘗試使用 wget 下載一個大文件,等待它失敗,然後執行 wget -c 將 http 更改為 https,它將恢復正常。