記一次FTP上傳文件總是超時的解決過程


好久沒寫博,還是重拾記錄一下吧。

背景:買了一個阿里雲的雲虛擬機用來搭建網站(起初不了解雲虛擬主機和雲服務器的區別,以為都是有SSH功能的,后來發現不是這樣樣子啊,雲虛擬機就是FTP上傳網頁+MySQL存儲數據,對於只做網站來說還行,但是想做一些擴展或高級功能就不行了,強烈建議還是買雲服務器ECS)。

使用的時候遇到一個非常奇怪的現象。在家里的網絡環境下(使用DLink做路由器),連接FTP服務器和下載文件都沒有問題,但是上傳文件總是到100%然后卡住很久,然后出現Timeout,服務器上的文件被覆蓋,但字節為0。一開始以為是FileZilla設置的問題,於是在主動被動模式,字符集這些調了半天,還是不行;后面更換了Transmit,Mac終端的ftp,Windows虛擬機里面的Explorer,CuteFtp,FlashFXP這些進行測試,發現還是一樣的結果。但是后面我在公司網絡環境下使用任何一個客戶端進行上傳都沒有出現問題。

我懷疑是阿里雲的雲虛擬機FTP有限制,我在阿里雲工單系統提交了一個工單要求解決兩個問題:

發送超時問題:
ftp
> put ~/common.css /htdocs/common.css 229 Entering Extended Passive Mode (|||40019|). 150 Ok to send data. 100% |***********************************| 16335 21.08 MiB/s 00:00 ETA 426 Failure reading network stream. 16335 bytes sent in 00:56 (0.28 KiB/s)
登錄失敗問題:
421
There are too many connections from your internet address.

但通過討論發現第二個問題應該是我在上傳超時時多次斷開和連接造成的,容易解決。問題在於上傳超時問題,售后認為可能是IP遭到屏蔽,但查詢后並沒有。沒有更好的思路解決問題,只好在家里各種測試,多次測試后發現只要是一個比較"小"的文件(小於1KB),上傳成功;但是“大”一點的文件(比如2KB以上),就總是上傳失敗。跟文件的類型無關。反饋給售后后認為是我本地的網絡環境不穩定導致的,但是我用的是以太網,使用的過程中HTTP下載、QQ微信登錄都沒有問題,玩DOTA2也沒有出現掉線情況,應該不會“不穩定”到2KB的文件都上傳不上去。最終我測試得出文件<=1432B都能上傳,>1432B就上傳不了了,更排出了“不穩定”的問題,因為不穩定的話上傳失敗不可能一直處於1433B這個臨界值。

在Google上搜索相關中文網頁,但很少有相關的信息,不過有一些引導我向防火牆、路由器這些方面思考,反饋給售后那邊卻表示沒有更多辦法幫忙了。Mac的防火牆我都是關閉的;路由器防火牆管理方面只能自己動手把功能都試一下。但是DMZ,防火牆規則,端口轉發這些設置弄了遍也沒有解決問題。

還是回到Google,在更換了多次英文關鍵詞后,終於找到了一些跟我同病相憐的人。其中最為有用的是https://trac.filezilla-project.org/ticket/5533#no1,通讀了一遍終於找到了問題所在。大意就是FTP使用兩個TCP連接來通信,一條控制連接(control connection)用來提交命令和接受回復;一條數據連接(data connection)來處理實際的文件傳輸。在文件傳輸過程中,控制連接是很容易進入空閑狀態的,TCP標准也沒有規定一個連接的最大空閑時間。但是路由器和防火牆經常會把空閑的連接給關閉掉,並且不通知雙方,就造成了傳輸100%但最后還是超時的現象。后面的評論就是解決問題的關鍵了:TCP傳輸過程中有最大的包上限MTU(Maximum Transmission Unit,不超過1500),超過這個大小的傳輸就要拆成多個包(packet)。所以比較“小”的文件不用拆包,一次就傳輸完了;“大”的文件需要拆包,分多次發送,就出現超時的問題。對於不同的ISP提供商來說,不同的MTU存在最優值。於是在路由器管理頁面找到MTU設置,發現原來是1492,隨手用網上找的值1472填進去,重啟路由器,It works!!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM