一、FTP管理:
基於tcp,首先有客戶端相服務端的知名端口21發起tcp連接建立ftp控制連接,控制連接在整個會話期間都保持打開,只用來發送連接/傳送請求。
這里分為兩種模式:
主動模式(PORT)和被動模式(PASV),這兩種模式是站在FTP服務器的“角度”來說的,如果設置為主動模式,則需要傳輸數據時,服務器主動連接客戶端,那么客戶端就需要有數據監聽端口(從port h1,h2,h3,h4,p1,p2命令中獲知);如果設置為被動模式,則需要服務器告訴客戶端(通過對pasv命令響應告知))自己用於數據傳輸的監聽端口,同時在該端口上監聽被動的等待客戶端來連接,被動方式通常用於客戶端位於nat內網,服務器位於nat外網的場景中以避免被防火牆阻止數據連接的建立。
這里說一下注意點:port命令的參數h1,h2,h3,h4,p1,p2 前面4個h分別對應客戶端ip地址的4個十進制數字,p1和p2分別表示端口的高8位和低8位,因次端口計算為p1*256+p2。
二、FTP數據傳輸:
在數據連接建立好后則開始傳輸數據,數據傳輸按方向分為上傳下載:
下載時客戶端命令行使用get或mget等命令(對應內部協議命令為RETR filename),向服務器請求下載filename,服務器打開該文件讀出數據以某種傳輸方式向服務器傳送數據,客戶端收數據直到數據傳輸完。一旦數據傳輸完成則數據連接關閉。
上載文件時客戶端命令行使用put或mput等命令(對應內部協議命令為STOR filename),向服務器請求上傳filename,客戶端打開文件讀取數據發送給服務端,服務端創建文件並寫入數據。完成后數據連接關閉。
FTP協議規定了控制協議傳送與存儲的多種選擇,在以下4個方面必須做出一個選擇。
- 文件類型:ASCII碼文件(默認的)/ 圖像文件類型(二進制的)/ 本地文件類型(用於在具有不同字節大小主機間傳送二進制數據)
- 格式控制:該選項針對ASCII類型文件適用,非打印(默認選擇,文件中不包含垂直格式信息)/ 遠程登錄格式控制
- 結構:文件結構(默認選擇,文件被認為是一個連續的字節流,不存在內部的文件結構)/ 記錄結構(用於文本文件)
- 傳輸方式:流方式(模式選擇,文件以字節流方式傳輸,對於文件結構,發方在文件尾提示關閉數據連接,對於記錄結構,有專用的兩字節序列碼記錄結束和文件結束)/ 塊方式(文件以一系列塊來傳送,每塊前面有一個或多個首部字節)/ 壓縮方式
三、FTP用戶命令
ftp客戶端(命令行)用戶命令:
1、客戶端用戶命令分為兩類,一類是設置操作客戶端自身的,如lcd、hash等,另一類是發送內部協議命令給服務器執行的,如get、put、passive等
2、命令數量因客戶端差異而不同,如windows系統的ftp客戶端就沒有size等命令,而一些嵌入式設備只是實現了幾個上傳下載的簡單命令。
下表是linux系統上ftp客戶端具有的ftp命令:
客戶端用戶命令在執行后轉換為內部協議命令給服務器執行,然后以應答碼加消息的格式回應給客戶端。
命令和應答在客戶和服務器的控制連接上以 NVT ASCII碼形式傳送。這就要求在每行結尾都要返回C R、 L F對(也就是每個命令或每個應答)。這些命令都是3或4個字節的大寫ASCII字符,其中一些帶選項參數。從客戶向服務器發送的FTP命令超過30種。下圖是比較常用的幾種命令:
應答都是A S C I I碼形式的3位數字,並跟有報文選項。其原因是軟件系統需要根據數字代碼來決定如何應答,而選項串是面向人工處理的。由於客戶通常都要輸出數字應答和報文串,一個可交互的用戶可以通過閱讀報文串(而不必記憶所有數字回答代碼的含義)來確定應答的含義。
下面是控制通道交互示例:
黃色底紋為控制命令,這些內部命令在使用python的ftplib庫編寫腳本時,可以使用sendcmd函數直接發送給服務器。
220 (vsFTPd 3.0.2) USER root 331 Please specify the password. PASS test 230 Login successful. SYST 215 UNIX Type: L8 PWD 257 "/mnt" PORT 192,168,1,23,171,91 200 PORT command successful. Consider using PASV. LIST 150 Here comes the directory listing. 226 Directory send OK. PORT 192,168,1,23,142,173 200 PORT command successful. Consider using PASV. LIST 150 Here comes the directory listing. 226 Directory send OK. CDUP 250 Directory successfully changed. PWD 257 "/" CWD mnt 250 Directory successfully changed. TYPE I 200 Switching to Binary mode. TYPE A 200 Switching to ASCII mode. PASV 227 Entering Passive Mode (192,168,1,1,155,71). LIST 150 Here comes the directory listing. 226 Directory send OK. PORT 192,168,1,23,133,62 200 PORT command successful. Consider using PASV. LIST 150 Here comes the directory listing. 226 Directory send OK.