FTP 協議以及斷點續傳
背景:
由於移動端業務的需求,應用到了ftp的檔案上傳功能,並考慮到移動端網路的不穩定性,需要加入斷點續傳功能。
詳細介紹:
FTP,檔案傳輸協議是TCP/IP協議組中的協議之一。包括兩部分,ftp伺服器和ftp客戶端。FTP伺服器用來儲存檔案,使用者則使用ftp客戶端通過ftp協議訪問位於ftp伺服器上的資源。另外,預設ftp協議使用TCP埠中的21埠。我想這個最基本的ftp知識,大家應該是知道的。
相對於其他協議,如http協議,ftp協議要複雜些,一般的通訊協議建立一個socket連線,這條連線同時處理伺服器端和客戶端的連線命令和資料傳輸。而ftp則是將命令和資料分開傳送的方法提高效率。
如下圖所示,對ftp的整個大體的互動做了很好的描述。ftp伺服器和ftp客戶端之間存在著兩條連線,一條控制連線,一條資料連線。
控制連線:
控制連線為ftp互動最主要的連線。從客戶端登入到ftp伺服器開始,到登出伺服器的整個生命週期裡面是始終存在的一條連線。如下圖抓包所示為ftp一個控制連線的生命週期,從開始登入ftp伺服器到ftp連線斷開的整個過程。對於ftp控制連線來說,根據抓包情況可以很清楚的瞭解到當連線到ftp伺服器成功後,ftp伺服器會返回220狀態,及後面的歡迎資訊,這些資訊不同伺服器會有所不同,對於我們來說關係不是很大。之後的流程就是登陸伺服器,登陸伺服器會先輸入使用者名稱,伺服器此時會返回230狀態,意思是需要輸入密碼,當輸入密碼正確後,登陸返回200,狀態,返回成功。從中可以看出一些規律來,伺服器和客戶端都是一應一答的訊息模式。這是單純的控制。直到連線被斷開,ftp客戶端和ftp伺服器的互動結束。
資料連線:
ftp資料連線有多種模式,其中最常見的模式有兩種,一種是主動模式,另外一種是被動模式。
主動模式:
在控制連線需要傳送資料的時候,ftp客戶端會告訴ftp伺服器將資料傳送到地址和埠資訊,之後然後ftp伺服器會用自身的20埠將資料傳送到ftp客戶端,傳送完成後,此條資料連線銷燬,控制連線會響應一條傳送完成的訊息給ftp客戶端。
被動模式:
上圖抓包就是採用了被動模式來發送資料的,從抓包看,ftp客戶端傳送給ftp伺服器一條pasv的信令,ftp伺服器響應了227,後面跟隨著ip和埠資訊,ftp客戶端解析這些資訊,並連線到指定的ip和埠,接收或者傳送資料,進行相應的業務處理。如下截圖和上個截圖對應,上面截圖為上傳檔案的控制操作全部過程,下圖的截圖為資料連線,資料連線過程發生在
150 Opening BINARY mode data connection.
226 Transfer complete.
這兩條信令之間,當資料連線關閉表示傳送完成,控制連線返回226狀態,告訴控制連線,資料傳送完成了。埠控制連線,此時一個ftp的生命週期結束。
斷點續傳功能:
簡單說下斷點續傳功能,斷點續傳功能其實就是在傳送的過程中,記錄下傳送的進度,當出現包括網路中斷等傳送出錯的情況下,斷開連線。等下次網路好的情況下,繼續傳送剩餘檔案的過程。
對於ftp的斷點續傳上傳的功能實現,FTP協議中提供了一條APPE的控制命令用來追加檔案,我們所實現的斷點續傳的命令就是圍繞著這個命令進行的。
1、 在正常上傳的過程中,記錄下已經發送的檔案的長度
2、 當網路傳送異常時,記錄當前傳送檔案長度,並關閉當前ftp連線,結束ftp的傳送過程
3、 當網路正常後,重新開始建立ftp的連線,此時由上傳檔案改為APPE命令,並在資料連線上傳送剩餘的資料到ftp伺服器。
//FTP 斷點續傳下載