FTP協議詳解
簡介
FTP(File Transfer Protocol)是應用層的一個檔案傳輸協議。其主要作用是在伺服器和客戶端之間實現檔案的傳輸和共享。FTP協議執行在TCP連線上,保證了檔案傳輸的可靠性(執行在UDP協議上的是TFTP協議)
與Http協議區別
Http和FTP都是檔案傳輸協議,都是執行在tcp上面,但是他們也有一些重要的區別,FTP使用了兩個並行的tcp來傳輸檔案:一個是控制連線(port:21),一個是資料連線(port:20),控制連線用於在兩個主機之間傳輸控制資訊,如口令,使用者標識,存放、獲取檔案等命令。資料連線用於實際傳送一個檔案,傳送完檔案之後資料連線後會關閉。因為ftp協議使用一個獨立的控制連線,所以,也稱ftp的控制資訊是帶外(out-of-band)傳送的。而Http協議是在傳輸檔案的同一個tcp連線中傳送請求和相應首部行的。因此,Http也可以說是帶內(in-band)傳送控制資訊。
FTP的兩種傳輸方式
FTP支援兩種方式的傳輸:文字(ASCII)方式和二進位制(Binary)方式。通常文字檔案的傳輸採用ASCII方式,而圖象、聲音檔案、加密和壓縮檔案等非文字檔案採用二進位制方式傳輸,如果為了從一個系統上傳輸檔案而使用了與本地系統不同的計算機位元組位數,那麼就必須使用Tenex模式。FTP以ASCII方式作為預設的檔案傳輸方式。
FTP的兩種傳輸模式
FTP有兩種傳輸模式:主動(FTP Port)模式和被動(FTP Passive)模式。由於主動模式存在著安全問題,最近幾年,大部分的TFP客戶端開始預設使用被動模式。
主動模式(Port)
主動模式的核心是TFP客戶端告訴服務端自己開發那個埠作為資料埠,然後讓服務端來連線自己。
主動模式的連線建立一般是通過一些幾個步驟:
- 客戶端隨機開啟一個本地大於1024的埠P1
- 客戶端通過埠P1向伺服器控制埠(埠21)發起連線請求
- 伺服器進行認證成功,請求建立
- 客戶端對本地埠P2進行監聽並向伺服器傳送“Port P1+1”告訴伺服器,客戶端的資料監聽埠。
- 伺服器收到埠後,從自己的資料埠(埠20)發起連線,連線到客戶端指定的資料埠P1+1.
被動方式(Passive)
由於主動方式中,服務端需要主動連客戶端,對於客戶端的防火牆來說,屬於外部連線內部,會出現被阻塞的情況。被動方式解決了這個問題。被動連線的核心是控制連線請求和資料連線請求都是由客戶端發起。被動方式的步驟如下:
- 客戶端任意開啟大約1024的兩個本地埠(P1和P1+1)
- P1埠傳送請求連線伺服器的21埠(控制連線埠)同時提交PASV命令。
- 伺服器收到請求後,會開啟任意一個大約1024的埠P2,然後返回如下格式內容:
227 entering passive mode(h1,h2,h3,h4,p1,p2) - 客戶端收到服務端返回的內容後,計算出服務端開放的資料連線埠
- 客戶端通過P1+1埠向服務端的傳送連線請求。進行資料傳輸。
關於服務端返回的報文格式(h1,h2,h3,h4,p1,p2)具體含義如下:
- h1,h2,h3,h4代表伺服器的ip地址;
- p1,p2代表伺服器監聽的資料連線埠地址。計算方法為P1*256+P2
FTP的限制
對於FTP伺服器來講,他必須在整個會話期間保持使用者的狀態(state),特別是,伺服器必須把特定的使用者賬戶與控制聯絡起來,使用者在遠端目錄樹上不斷跳轉時,伺服器必須追蹤到使用者在遠端樹上的當前位置,換句話說,當客戶端使用者數量不斷增多,FTP伺服器所要維持的會話總數,也會迅速增長。著會大大限制FTP伺服器的效能。
FTP中的命令與應答
命令
FTP協議的命令是認可讀的,每個命令由4個大寫的ASCII字元組成,有些還可帶一些可選引數,命令後面跟回車符換行。
一下問幾個常用的命令:
命令 | 解釋 |
---|---|
USER username | 用於向伺服器傳輸使用者標識 |
PASS password | 用於向伺服器傳送使用者口令 |
LIST | 請求伺服器所有檔案列表,檔案列表是在(新建且非持續連線)資料連線上傳遞 |
RETR filename | 用於從遠端主機當前目錄檢索(get)檔案。該命令引起遠端主機發起一個資料連線,並經資料連線傳送所請求的檔案。 |
STOR filename | 用於在遠端主機的當前目錄上存放(put)檔案 |
應答
FTP客戶端每個發出的命令都會對應一個FTP伺服器發出的應答。應帶是一個3為的數字,後跟一個可選資訊。他與http響應報文的狀態碼和狀態資訊的結構相同,比較常見的幾個應帶可以參考如下:
應答 | 解釋 |
---|---|
331 Username OK, Password required | 使用者名稱OK,請輸入密碼 |
125 Data connection already open;transfer starting | 資料連線已經開啟,開始傳送 |
425 Can`t open data connection | 無法開啟資料連線 |
452 Error writing file | 檔案寫入出錯 |
以上的FTP命令和應答比較簡單,如果想詳細瞭解相關的命令和應答,可以查閱RFC959 相關文件
參考資料:
《計算機網路自頂向下方法》
《TCP/IP協議詳解》