上文說過,一旦FTP數據發送雙方建立控制命令通道和數據傳輸通道後,雙方就可以發送數據。在數據傳輸中,FTP協議又規定了三種模式,分別是流模式,塊模式和壓縮模式。
流模式其實就是簡單的將要傳輸的數據比特以一種連續的非結構化的方式在TCP協議的幫助下發送給對方,這裏它就是一段數據,不存在包頭或字段這類有關數據組織結構的信息。由於被傳輸的信息是裸數據,沒有任何結構化組織,因此發送的準確性完全依賴於傳輸方和下層協議的穩定性,特別是數據傳輸完成就得依靠關閉數據通道來表示。
相比於其他兩種模式,流模式的特點是效率高,因此在協議的實現中使用廣泛。同時它實現簡單,並且它將所有要傳輸的數據進行無差別對待,別管要傳輸的數據結構如何,它通通將其看做爲字節流,因此就能隔離數據結構的複雜性對傳輸協議實現的影響。由此效率高,實現簡單,傳輸數據複雜性隔離這三個特點使得這種傳輸模式成爲FTP的實現主流。
第二種塊模式是指,將要傳輸的數據切割成長度固定的若干各部分,每個部分在發送時使用包頭等字段進行封裝,使得發送的數據塊相互間形成獨立的數據包。包頭含有三字節字段,分別表示塊的長度以及其他相關數據。同時還有一種特別的算法用於對數據塊進行追蹤,如果數據塊傳輸出現問題算法還能中斷或者重啓傳輸流程。
第三種是壓縮模式。它使用遊程編碼對發送數據進行壓縮,同時將壓縮相關信息以包頭字段的方式進行組織,這樣對方收到後知道如何對數據進行解壓縮,因此壓縮模式使用包頭+數據體的方式進行數據的組織發送。壓縮模式由於實現的複雜性,在FTP協議中很少使用,除非在特定網絡條件下需要儘可能減少數據傳輸量以保證效率和準確性時,該模式纔會被採用。
文件傳輸類似ctrl+c和ctrl+v,區別在於複製操作是在同一臺電腦內將數據從一個目錄轉移到另一個目錄,文件傳輸是將數據從一臺電腦轉移到另一臺電腦。但這是這一區別產生了一些問題,例如在windows上文本文件的結尾使用CR+LF表示,但在Mac系統上文本文件結尾使用CR表示,於是把一個文本文件從Mac拷貝到windows,在文件末尾處就容易出問題,爲此FTP協議在傳輸數據時對數據類型增加了若干考慮。
首先FTP協議把數據分成4種形式加以考慮,一是ASCII,也就是文本爲字符形式;二是EBCDIC,這類文件也是字符形式只不過字符來自IBM的EBCDIC字符集;三是圖像,這類文件可以不用考慮不同系統之間的區別;四是局部形式,這類文件的特點是,一個字節長度不是由8個比特組成,某些特殊操作系統就有這種特性。我們在實踐中只考慮情況一和三,對於情況一,協議要負責把文件結尾的符號根據系統進行修改,情況二中的圖像文件不僅僅包括圖像,像zip文件這類有同一格式的文件都屬於圖像。
在傳輸ASCII文件時,發送方每讀取一行內容後就在後面添加字符CR+LF,接收方讀取到這兩個字符組合後知道這是一行結束,然後根據當前所在系統修改,如果接收方是Mac系統,那麼就將這兩個字符改爲CR。由於FTP會對傳輸數據進行修改,因此在傳輸一定不能把”圖像“類型的文件設置成ASCII類型,要不然”圖像“類型文件中的二進制字符被修改後在接收方就無法打開文件。
接下來我們看看協議的數據包格式,特別是控制命令的數據包格式。FTP的控制命令有3種,第一種是接入控制命令,他對應用戶登錄和認證。第二種是傳輸控制命令,它用於雙方協定數據如何傳輸,例如設置傳輸文件的類型,設定主動或被動傳輸模式;第三是FTP服務命令,這些命令用於發起數據傳輸,修改或刪除文件等等。FTP在傳輸控制命令時使用Telnet協議,因此命令會以純字符的形式進行發送,下面我們以列表方式對命令內容進行描述:
命令碼 | 命令 | 描述 |
---|---|---|
USER | 用戶名 | 在建立連接時發生用戶名 |
PASS | 密碼 | 在用戶登錄時提供密碼 |
ACCT | 賬戶類型 | 用於設定用戶權限,通常FTP服務器會根據用戶名來直接指定其權限 |
CWD | 更改當前目錄 | 設定用戶登錄後對應的服務器目錄 |
CDUP | 回到上一層目錄 | 將當前目錄的上一層目錄作爲數據傳輸目錄 |
SMNT | 結構掛載 | 讓服務器掛載上新的文件系統以便讀取特定文件 |
REIN | 重新初始化 | 將連接重啓,他會將當前控制參數全部清除,類似於系統重啓 |
QUIT | 退出登錄 | 當數據發送完畢後用戶退出登錄 |
接下來我們看看控制命令相關說明:
命令碼 | 命令 | 描述 |
---|---|---|
PORT | 建立數據傳輸端口 | 這個端口將被客戶端用於和服務器建立數據傳輸連接 |
PASV | 消極模式 | 該命令讓客戶端向服務器主動發起連接 |
TYPE | 文件類型 | 用於設定要傳輸的文件類型 |
STRU | 文件結構 | 通常情況下該命令不會被使用 |
MODE | 傳輸模式 | 設定數據如何傳輸,是以流模式,塊模式,還是壓縮模式 |
接下來我們看看服務命令的說明:
命令碼 | 命令 | 描述 |
---|---|---|
RETR | 獲取數據 | 通知服務器向客戶端發送文件數據 |
STOR | 存儲 | 客戶端要發送文件給服務器 |
STOU | 唯一存儲 | 要求服務器在確保當前目錄下所傳輸的文件只能有一份 |
APPEN | 內容添加 | 如果當前傳輸的文件在目錄下有同名文件,那麼將傳輸的內容添加到同名文件末尾而不是覆蓋同名文件 |
ALLO | 分配內存 | 要求服務器爲將要發送的文件提前分配存儲空間 |
REST | 重啓 | 重啓文件傳輸流程,該命令只用在塊傳輸或壓縮傳輸方式 |
RNFR | 重命名文件 | 指定將要被重命名的文件名 |
RNTO | 文件重命名 | 將指定文件改名爲指定名稱 |
ABOR | 取消命令 | 通知服務器取消執行上一次發送的命令 |
DELE | 刪除 | 通知服務器刪除某個文件 |
RMD | 刪除目錄 | 通知服務器刪除整個目錄 |
MKD | 創建目錄 | 通知服務器創建一個新目錄 |
PWD | 顯示當前目錄 | 通知服務器告知用戶當前所在目錄 |
LIST | 列表 | 獲得當前目錄的所有文件名以及文件相關信息例如修改時間等 |
NLST | 命名列表 | 僅僅獲得當前目錄下的文件名 |
SYST | 系統 | 要求服務器返回它所在的操作系統信息 |
STAT | 狀態 | 要求服務器返回指定文件的當前狀態或是當前數據傳輸的狀態 |
HELP | 幫助 | 要求服務器返回幫助信息以便客戶端決定如何使用服務器 |
NOOP | 無操作 | 該命令表示什麼操作都不做,服務器會返回”OK"命令從而確保連通正常 |
後面我們還會再列出一些命令,然後查看數據包結構
更多技術信息,包括操作系統,編譯器,面試算法,機器學習,人工智能,請關照我的公衆號: