前戲
在上篇文章中,我們基本了解了下MQTT協(xié)議,本文呢?咱們來深入探討下FTP協(xié)議。
文件傳輸協(xié)議FTP(File Transfer Protocol)是因特網(wǎng)中使用最廣泛的文件傳輸協(xié)議。FTP使用交互式的訪問,允許客戶指定文件的類型和格式(如指明是否使用ASCII碼),并允許文件具有存取權(quán)限(如訪問文件的用戶必須經(jīng)過授權(quán),并輸入有效的口令)。
文件傳輸協(xié)議有基于TCP的FTP和基于UDP的簡(jiǎn)單文件傳輸協(xié)議TFTP,它們都是文件共享協(xié)議中的一大類,即復(fù)制整個(gè)文件,其特點(diǎn)是:若要存取一個(gè)文件,就必須先獲得一個(gè)本地的文件副本。如果要修改文件,只能對(duì)文件的副本進(jìn)行修改,然后再將修改后的文件傳回到原節(jié)點(diǎn)。
FTP基本工作原理
FTP屏蔽了各計(jì)算機(jī)系統(tǒng)的細(xì)節(jié),因而適合在異構(gòu)網(wǎng)絡(luò)中任意計(jì)算機(jī)之間傳送文件。FTP只提供文件傳送的一些基本服務(wù),它使用TCP可靠地運(yùn)輸服務(wù),FTP主要功能是減小或消除在不同系統(tǒng)下處理文件的不兼容性。
FTP使用客戶端-服務(wù)器模型,一個(gè)FTP服務(wù)器進(jìn)程可以為多個(gè)客戶進(jìn)程提供服務(wù)。FTP服務(wù)器有兩大部分組成:一個(gè)主進(jìn)程,負(fù)責(zé)接受新的請(qǐng)求;還有若干從屬進(jìn)程,負(fù)責(zé)處理單個(gè)請(qǐng)求。主進(jìn)程工作步驟
-
打開熟知端口(21),使客戶進(jìn)程能夠連接上
-
等待客戶進(jìn)程發(fā)送連接請(qǐng)求
-
啟動(dòng)從屬進(jìn)程處理客戶進(jìn)程發(fā)送的連接請(qǐng)求,從屬進(jìn)程處理完請(qǐng)求后結(jié)束,從屬進(jìn)程在運(yùn)行期間可能根據(jù)需要可創(chuàng)建其他一些子進(jìn)程
-
回到等待狀態(tài),繼續(xù)接受其他客戶進(jìn)程發(fā)起的請(qǐng)求,主進(jìn)程與從屬進(jìn)程的處理是并發(fā)進(jìn)行的
FTP工作時(shí)情況
FTP控制連接在整個(gè)會(huì)話期間都保持打開,只用來發(fā)送連接/傳送請(qǐng)求。當(dāng)客戶進(jìn)程向服務(wù)器發(fā)送連接請(qǐng)求時(shí),尋找連接服務(wù)器進(jìn)程的熟知端口21,同時(shí)還要告訴服務(wù)器進(jìn)程自己的另一個(gè)端口號(hào)碼,用于建立數(shù)據(jù)傳送連接。接著,服務(wù)器進(jìn)程用自己傳送數(shù)據(jù)的熟知端口20與客戶進(jìn)程所提供的端口號(hào)碼建立數(shù)據(jù)傳送連接,FTP使用了2個(gè)不同的端口號(hào),所以數(shù)據(jù)連接和控制連接不會(huì)混亂。
1.1 FTP數(shù)據(jù)表示
FTP協(xié)議規(guī)定了控制協(xié)議傳送與存儲(chǔ)的多種選擇,在以下4個(gè)方面必須做出一個(gè)選擇。
-
文件類型:ASCII碼文件(默認(rèn)的)/ 圖像文件類型(二進(jìn)制的)/ 本地文件類型(用于在具有不同字節(jié)大小主機(jī)間傳送二進(jìn)制數(shù)據(jù))
-
格式控制:該選項(xiàng)針對(duì)ASCII類型文件適用,非打印(默認(rèn)選擇,文件中不包含垂直格式信息)/ 遠(yuǎn)程登錄格式控制
-
結(jié)構(gòu):文件結(jié)構(gòu)(默認(rèn)選擇,文件被認(rèn)為是一個(gè)連續(xù)的字節(jié)流,不存在內(nèi)部的文件結(jié)構(gòu))/ 記錄結(jié)構(gòu)(用于文本文件)
-
傳輸方式:流方式(模式選擇,文件以字節(jié)流方式傳輸,對(duì)于文件結(jié)構(gòu),發(fā)方在文件尾提示關(guān)閉數(shù)據(jù)連接,對(duì)于記錄結(jié)構(gòu),有專用的兩字節(jié)序列碼記錄結(jié)束和文件結(jié)束)/ 塊方式(文件以一系列塊來傳送,每塊前面有一個(gè)或多個(gè)首部字節(jié))/ 壓縮方式
1.2 FTP命令和應(yīng)答
命令和應(yīng)答在客戶和服務(wù)器的控制連接上以 NVT ASCII碼形式傳送。這就要求在每行結(jié)尾都要返回C R、 L F對(duì)(也就是每個(gè)命令或每個(gè)應(yīng)答)。這些命令都是3或4個(gè)字節(jié)的大寫ASCII字符,其中一些帶選項(xiàng)參數(shù)。從客戶向服務(wù)器發(fā)送的FTP命令超過30種。下圖是比較常用的幾種命令:
應(yīng)答都是A S C I I碼形式的3位數(shù)字,并跟有報(bào)文選項(xiàng)。其原因是軟件系統(tǒng)需要根據(jù)數(shù)字代碼來決定如何應(yīng)答,而選項(xiàng)串是面向人工處理的。由于客戶通常都要輸出數(shù)字應(yīng)答和報(bào)文串,一個(gè)可交互的用戶可以通過閱讀報(bào)文串(而不必記憶所有數(shù)字回答代碼的含義)來確定應(yīng)答的含義。
2 FTP工作模式
FTP有兩種工作模式,分別是主動(dòng)模式(PORT)和被動(dòng)模式(PASV)兩種模式,這兩種模式是按照FTP服務(wù)器的“角度”來說的,更通俗一點(diǎn)說就是:在傳輸數(shù)據(jù)時(shí),如果是服務(wù)器主動(dòng)連接客戶端,那就是主動(dòng)模式;如果是客戶端主動(dòng)連接服務(wù)器,那就是被動(dòng)模式。關(guān)于主動(dòng)模式和被動(dòng)模式更具體的講解請(qǐng)點(diǎn)擊:圖解FTP的主動(dòng)模式與被動(dòng)模式以及客戶端設(shè)置。
3 關(guān)于FTP經(jīng)典的問題
3.1 如何知道FTP傳送一個(gè)文件結(jié)束?
這個(gè)問題比較經(jīng)典,也是一次面試被問到的問題。前面說過,通用傳輸方式是流方式,并且文件的結(jié)尾是以關(guān)閉數(shù)據(jù)連接為標(biāo)志,這意味著對(duì)每一個(gè)文件傳輸或目錄列表來說都要建立一個(gè)全新的數(shù)據(jù)連接。其一般過程如下:
1. 正由于是客戶發(fā)出命令要求建立數(shù)據(jù)連接,所以數(shù)據(jù)連接是在客戶的控制下建立的。
2. 客戶通常在客戶端主機(jī)上為所在數(shù)據(jù)連接端選擇一個(gè)臨時(shí)端口號(hào)。客戶從該端口發(fā)布一個(gè)被動(dòng)的打開。
3. 客戶使用P O RT命令從控制連接上把端口號(hào)發(fā)向服務(wù)器。
4. 服務(wù)器在控制連接上接收端口號(hào),并向客戶端主機(jī)上的端口發(fā)布一個(gè)主動(dòng)的打開。服務(wù)器的數(shù)據(jù)連接端一直使用端口 2 0。
圖27- 4給出了第 3步執(zhí)行時(shí)的連接狀態(tài)。假設(shè)客戶用于控制連接的臨時(shí)端口是 11 7 3,客戶用于數(shù)據(jù)連接的臨時(shí)端口是 11 7 4。客戶發(fā)出的命令是PORT命令,其參數(shù)是6個(gè)ASCII中的十進(jìn)制數(shù)字,它們之間由逗點(diǎn)隔開。前面 4個(gè)數(shù)字指明客戶上的 I P地址,服務(wù)器將向它發(fā)出主動(dòng)打開(本例中是 140.252.13.34),而后兩位指明16 bit端口地址。由于16 bit端口地址是從這兩個(gè)數(shù)字中得來,所以其值在本例中就是 4×256+150=1174。
圖27-5給出了服務(wù)器向客戶所在數(shù)據(jù)連接端發(fā)布主動(dòng)打開時(shí)的連接狀態(tài)。服務(wù)器的端點(diǎn)是端口2 0。
服務(wù)器總是執(zhí)行數(shù)據(jù)連接的主動(dòng)打開。通常服務(wù)器也執(zhí)行數(shù)據(jù)連接的主動(dòng)關(guān)閉,除非當(dāng)客戶向服務(wù)器發(fā)送流形式的文件時(shí),需要客戶來關(guān)閉連接(它給服務(wù)器一個(gè)文件結(jié)束的通知)。