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