FTP文件傳輸協議:
一、簡述:
1、TCP/IP協議簇,應用層協議,採用服務端與客戶端通信方式共享文件。
2、FTP根目錄:/ (如路徑: /hello/)
3、現在的FTP一般用Serv-U搭建,IIS搭建的FTP服務端與Serv-U搭建的服務端返回的響應信息格式不一樣,可能會導致解析出錯。
4、服務端監聽端口:
1)端口20:傳輸套接字(僅用於傳輸文件,每傳輸完畢一次,就關閉一次連接)
2)端口21:控制套接字(對話,傳輸控制,獲取信息,持久連接)
二、FTP缺點:
1、明文登錄.
2、FTP客戶端程序因使用>1024端口接收大數據,容易被防火牆過濾.
(被動模式解決,被動模式的概念在下面)
3、運行FTP服務端程序的機器可能在連接目標監聽隨機端口被防火牆提示.
4、FTP在傳輸數量多的小文件性能不好.
三、匿名登錄:
1、爲了實現文件在互聯網上傳輸的開放性,服務端管理員可以建立一個特殊的用戶ID,
提供給互聯網上的用戶下載和上傳文件,這就是匿名用戶,它不需要密碼.
2、常用的匿名登錄名稱:anonymous
主動模式與被動模式的概念:(建立文件傳輸連接的兩種不同方式而已)
一、主動模式:
1、客戶端創建一個監聽套接字,監聽端口>1024,控制套接字發送PORT命令附帶IP地址以及端口(特殊格式)到服務端.
2、服務端收到PORT命令,服務端的20端口連接到客戶端,建立文件傳輸通信.
二、被動模式:
1、客戶端發送PASV命令,服務端收到後,會創建一個在>1024端口的監聽套接字,然後回覆一串IP地址以及端口號(特殊格式).
2、通過回覆的信息,連接到服務端的文件傳輸套接字上進行通信.
三、兩種模式下的IP地址以及端口號的特殊表示形式:(須知)
1、PORT與PASV命令表示IP和端口的特殊格式:(PORT與PASV命令使用方式在下面)
舉例: IP地址:192.168.1.120 端口:4500
表示格式:192,168,1,120,17,148
解釋:
1、注意是逗號.
2、前4個字段表示IP地址,即192,168,1,120,沒有變
3、17,148字段:相當於(17 乘 256) + 148 = 4500端口
總結:
1、使用的是逗號
2、前四字段爲IP地址,第五字段 × 256 + 第六字段 = 端口號.
3、由於建立文件傳輸套接字連接時,會發送一個IP地址以及端口號(被動模式),說明控制連接與文件傳輸連接有可能不在同一臺機器上,這是由發送參數推斷出來的,並未測試過.
爲什麼會有兩種文件傳輸連接模式:
1、因爲防火牆的存在,導致使用FTP協議的一方可能被防火牆過濾一些東西.
主動模式:客戶端的>1024端口可能被過濾.
被動模式:服務端的>1024端口可能被過濾.
通常都是使用被動方式進行FTP連接。
編寫FTP客戶端:
一、編寫步驟:
1、控制套接字連接服務端的21端口,使用USER 、PASS 登錄.
2、利用控制套接字獲取感興趣信息,文件套接字在傳輸文件時才連接服務端.
3、QUIT 退出.
二、上傳文件:
1、文件套接字連接,可以設置一些雜項(如傳輸類型),一般默認就行.
2、發送STOR命令,接收一個服務端的響應碼.
3、開始在文件套接字使用send函數將文件數據上傳上去.
4、文件套接字send執行完畢後,不用管,直接closesocket文件套接字.
5、控制套接字用recv函數等待服務端發出接收完成信號即可.
三、下載文件:
1、文件套接字連接,可以設置一些雜項(如傳輸類型),一般默認就行.
2、發送RETR命令,意思讓服務端把指定的文件的數據,send過來文件套接字,之後接收一個服務端的響應碼(一般爲226發送完畢信號,要等待這個信號來到爲止).
3、226發送完畢信號到來,就可以讓文件套接字recv函數來接收到來的數據了.
四、需要注意:
1、文本模式:傳輸文本文件時使用,一般在使用REST命令斷點續傳時,不能指定爲文本模式.
2、二進制模式:通用
常用命令:(每執行一次命令後,服務端會給與回覆)
一、登錄類:
USER 賬號\r\n | 登錄賬號 |
PASS 密碼\r\n | 登錄密碼 |
REIN\r\n | 想重新登錄,連接不會關閉,下一條命令USER可重新連接 |
QUIT\r\n | 退出 |
二、建立文件傳輸套接字通信類:
PASV\r\n | 被動模式,服務端會回覆一個IP地址和端口,然後你再連接.(一般使用被動模式) |
PORT 表示IP端口的特殊格式\r\n | 主動模式,讓服務端主動來連接你的文件監聽套接字 |
三、操作文件類:
STOR 文件名\r\n | 上傳文件 |
APPE 文件名\r\n | 上傳文件,如果文件名已存在,把數據插入尾部 |
DELE 文件名\r\n | 刪除指定文件 |
REST 字節個數\r\n | 跳過字節數,短點續傳,下載文件前使用,使RETR命令僅下載偏移後的部分 |
RETR 文件名\r\n | 下載文件 |
ABOR\r\n | 放棄傳輸一個文件,將關閉文件套接字通信 |
注意:REST命令一般不能在文本模式來使用.一般在二進制模式下使用(I),經測試,不能在上傳時使用(不確定,可以自己去試試).
四、目錄操作類:
CWD 目錄名\r\n | 改變當前目錄到指定目錄 |
CDUP\r\n | 返回上一次目錄,當到根目錄時,不變 |
LIST\r\n | 顯示當前目錄下的文件,包括長度,文件類型(如目錄)與權限(表示類型:drwxr-xr-x) |
LIST 目錄名\r\n | 顯示指定目錄下的文件,包括長度,文件類型(如目錄)與權限(表示類型:drwxr-xr-x) |
MKD 目錄名\r\n | 創建一個目錄 |
PWD\r\n | 顯示當前目錄的路徑 |
RMD 目錄名\r\n | 刪除目錄 |
RNFR 文件或目錄名\r\n | 將某文件或目錄重命名,接下來要使用RNTO指定新名稱 |
RNTO 文件或目錄名\r\n | 重命名爲.... |
NLST\r\n | 僅顯示當前目錄下的文件,以\r\n表示下一個 |
NLST 目錄\r\n | 僅顯示指定目錄下的文件,以\r\n表示下一個 |
五、模式與類型:
TYPE 字符\r\n | 選擇傳輸類型 A爲文本模式 I爲二進制模式 E爲EBCDIC N爲Nonprint非打印模式 T爲Telnet格式控制符 |
SYST\r\n | 獲取服務端系統信息(NT或Unix) |
STAT 文件或文件夾\r\n | 獲取相關信息 |
ACCT 用戶帳號\r\n | 發送PASS命令並接收到332代碼之後才應發送 |
SMNT 另一個文件數據系統的路徑\r\n | 允許用戶裝配另一個文件系統的數據結構而無需改變登錄 |
MODE 字符\r\n | 指定傳輸類型:默認爲流模式(S爲流)(B爲塊)(C爲經過壓縮) |
STRU 字符\r\n | 指定結構類型:F爲文件結構(默認值,就是流式傳輸) |
ALLO 邏輯字節數\r\n | 上傳文件前,使用此命令申請內存(本人還沒見到需要的,都是直接上傳) |
NOOP | 測試通信 |
HELP | 幫助,會列出有效命令 |
FTP服務端的響應碼:
150 | 文件狀態良好,打開數據連接 |
200 | 命令成功 |
212 | 目錄狀態 |
213 | 文件狀態 |
110 | 重新啓動標記應答 |
500 | 格式錯誤,命令不可識別 |
501 | 參數語法錯誤 |
502 | 命令未實現 |
120 | 在X分鐘內準備好 |
125 | 連接打開準備傳送 |
214 | 幫助信息,信息僅對人類用戶有用 |
215 | 名字系統類型 |
220 | 對新用戶服務準備好 |
221 | 服務關閉控制連接,可以退出登錄 |
202 | 命令未實現 |
211 | 系統狀態或系統幫助響應 |
225 | 數據連接打開,無傳輸正在進行 |
226 | 關閉數據連接,請求的文件操作成功 |
227 | 進入被動模式 |
230 | 用戶登錄 |
331 | 用戶名正確,需要口令 |
332 | 登錄時需要帳戶信息 |
350 | 請求的文件操作需要進一步命令 |
421 | 連接用戶過多 |
425 | 不能打開數據連接 |
426 | 關閉連接,中止傳輸 |
450 | 請求的文件操作未執行 |
451 | 中止請求的操作:有本地錯誤 |
452 | 未執行請求的操作:系統存儲空間不足 |
250 | 請求的文件操作完成 |
257 | 創建"PATHNAME" |
503 | 命令順序錯誤 |
504 | 此參數下的命令功能未實現 |
530 | 賬號或密碼錯誤 |
532 | 存儲文件需要帳戶信息 |
550 | 未執行請求的操作 |
551 | 請求操作中止:頁類型未知 |
552 | 請求的文件操作中止,存儲分配溢出 |
553 | 未執行請求的操作:文件名不合法 |
關於與Serv-U搭建FTP服務器通信返回的文件格式:
舉例:發送LIST命令到服務端,返回一個文件列表,每一個文件最前面帶有:drwxr-xr-x
(這應該是Linux下用戶權限與文件類型的表達方式)
(我對Linux不熟,所以一開始我還以爲是什麼加密的數據,其實他代表用戶權限與文件類型)
drwxr-xr-x 10個域 Linux下表示用戶擁有的權限
順序:從左到右
第1位(文件類型):d(目錄文件)、l(鏈接文件),-(普通文件),p(管道)
第2-4位(權限):r(讀)、w(寫)、x(可執行)
第5-7位(此文件屬主的用戶組權限)
第8-10位(其他用戶所具有的權限)