FTP協議

基於RFC959的FTP協議梳理

介紹:FTP是FileTransferProtocol(文件傳輸協議)的英文簡稱。用於Internet上的控制文件的雙向傳輸。同時,它也是一個應用程式(Application)。基於不同的作業系統有不同的FTP應用程式,而所有這些應用程式都遵守同一種協議以傳輸文件。在FTP的使用當中,用戶經常遇到兩個概念:"下載"(Download)和"上傳"(Upload)。"下載"文件就是從遠程主機拷貝文件至自己的電腦上;"上傳"文件就是將文件從自己的電腦中拷貝至遠程主機上。用Internet語言來說,用戶可通過客戶機程式向(從)遠程主機上傳(下載)文件。

默認情況下FTP協議使用TCP埠中的20和21兩個埠,其中,20口用於傳輸數據(數據埠),21口用於傳輸控制資訊(命令埠)。具體是否使用20口作為傳輸數據的埠域FTP使用的傳輸模式有關:

如果採用主動模式,那麼數據傳輸埠就是20;

如果採用被動模式,則具體最終使用那個埠需要伺服器和客戶端協商決定。

工作模式:

FTP支援兩種模式:主動模式(PORT)和被動模式(PASV)。

被動模式(PASV):

1、FTP客戶端使用一個隨機埠N(一般大於1024)向FTP伺服器的21埠發送連接請求;

2、ftp服務端主進程收到請求後,派生出來一個服務端控制進程,和客戶端控制進程之間建立控制連接,開始會話;

3、ftp客戶端和ftp服務端之間通過各自的控制進程進行用戶名和密碼校驗等操作;

4、當ftp客戶端要發起數據文件傳輸時,ftp客戶端控制進程向服務端控制進程發起pasv命令;

5、ftp服務端控制進程收到pasv請求後,派生出來一個數據傳輸進程,<並將埠號告知客戶端>控制進程,返回227 entering passive mode (h1,h2,h3,h4,p1,p2),其中埠號是 p1*256+p2,ip 地址為h1.h2.h3.h4;《服務端告知客戶端》

6、 ftp客戶端控制進程收到響應後,派生出來一個客戶端數據傳輸進程,隨 客戶端數據傳輸埠,連接服務端的數據傳輸埠號(即上條中的ip+埠號),然後進行數據文件傳輸;

7、當數據傳輸完畢,服務端數據傳輸進程返回傳輸完畢,數據連接通道會關閉,保留控制連接通道;

8、如果此時沒有其他文件傳輸,控制通道也會相繼關閉。
FTP主动和被动模式(详解+图示)

主動模式(PORT):

1、FTP客戶端使用一個隨機埠N(一般大於1024)向FTP伺服器的21埠發送連接請求;

2、ftp服務端主進程收到請求後,派生出來一個服務端控制進程,和客戶端控制進程之間建立控制連接,開始會話;

3、ftp客戶端和ftp服務端之間通過各自的控制進程進行用戶名和密碼校驗等操作;

4、當ftp客戶端要發起數據文件傳輸時,客戶端派生出一個數據傳輸進程,並通過客戶端控制進程將數據連接的port告知服務端控制進程。<客戶端告知服務端>

5、當ftp服務端收到請求後,派生出一個服務端數據傳輸進程,產生一個服務端埠號,然後根據請求中ftp客戶端數據傳輸進程式埠號建立數據傳輸連接。

6、ftp客戶端收到服務端的響應後,進行數據文件的傳輸。

7、當數據傳輸完畢,服務端數據傳輸進程返回傳輸完畢,數據連接通道會關閉,保留控制連接通道;

8、如果此時沒有其他文件傳輸,控制通道也會相繼關閉。
FTP主动和被动模式(详解+图示)

主動模式和被動模式的異同:二者在控制連接過程中是一樣的,在數據連接時不一樣:主動模式時伺服器主動連接客戶端已建立數據連接;被動模式下伺服器端是被動的,由客戶端連接伺服器以建立數據連接。

數據傳輸:(概念放在其前面)

文件通過數據連接進行傳輸。控制連接用來發送操作命令以及相應的響應命令。

數據傳輸命令包括:指定數據位怎樣被傳輸的模式(MODE)命令,以及用來定義數據表示方式的結構(STRU)、類型(TYPE)命令。「流式」傳輸模式依賴於文件結構參數,而當使用「壓縮」傳送模式時,填充位元組的表示依賴於表示類型。

數據結構:

由於表示類型的不同,FTP允許文件具有指定的結構。包括以下三種:

**
$$
文件結構:**如果沒有使用結構命令(STRU),默認使用文件結構。在文件結構中沒有內部結構,文件被當作連續的位元組流。

記錄結構:在所有的FTP實現中,必須支援「文本」文件,即使用TYPE ASCII或EBCDIC的記錄結構,在記錄結構文件中,文件由連續的記錄組成。

頁結構:為了傳輸不連續的文件,FTP定義了頁結構。一般提到的「隨機存取文件」或「多穴」文件屬於頁結構類型。對於這些文件,一般有另外的對應整個文件資訊(如文件描述符),或者對應文件部分資訊(如頁存取控制),或者兩者都有。在FTP中,文件的部分稱為頁。
$$

為了提供個不同頁大小以及相關資訊,每頁傳輸時將額外包括一個頁頭。頁頭有以下定義的域:

頭長度:包括這個位元組在內的頭邏輯長度。最小頭長度是4.

頁索引:文件區域的邏輯頁號。不是傳輸的序列號,而是標識本頁的索引號。

數據長度:頁中數據的邏輯位元組數。最小數據長度為0.

頁類型:標識了頁的類型。具體如下:

 0 = 最末頁

 用來標識頁結構傳輸結束。頁頭長度必須為4,數據長度必須為0.

 1 = 單獨頁

 對於沒有頁相關控制資訊的單獨頁來說這是普通的類型。頁頭長度必須為4.

 2 = 描述頁

 這個類型用來傳輸整個文件的描述資訊

 3 = 存取控制頁

 此類型包括一個額外的指定頁存取資訊的頭域。頭長度必須為5.

 可選域:

 其他的頭域可能用來提供每頁的控制資訊,如每頁的存取控制。

 所有的域都是一個邏輯位元組。邏輯位元組長度由TYPE命令指定。

建立數據連接

傳輸數據的過程包括在指定埠建立數據連接選擇傳輸參數。用戶和伺服器DTP都有默認的埠號。用戶過程默認的數據埠與控制連接埠相同,伺服器過程的默認埠與控制連接的埠相鄰。

傳輸位元組長度是8位位元組長。該位元組長度與實際傳輸數據有關,而與主機文件系統的數據表示無關。

被動數據傳輸過程(PASV?)應該在發送FTP請求之前監聽該數據埠。FTP請求命令決定了數據傳輸方向。伺服器在接收到傳輸請求後將建立到指定埠的連接。當連接建立後,數據將在兩端DTP間傳輸,同時伺服器PI向用戶PI發送確認回復。

每個FTP實現必須支援是哦那個默認的數據埠,只有用戶PI可以使用變化的非默認埠。

用戶可能會用PORT命令指定一個其他的數據埠。若用戶希望從第三方主機下載,用戶PI會同時建立到兩伺服器的PI控制連接。一個伺服器(用FTP命令)等待連接,另一個伺服器建立連接。用戶PI給一個伺服器PI發送PORT命令只是另一台伺服器的數據埠。最後,向兩端發送合適的傳輸命令。

伺服器會在以下條件下關閉數據連接:

1.伺服器在傳輸模式下完成數據傳輸,需要關閉連接,表示文件結束。

2.伺服器收到用戶發來的ABORT命令。

	3.用戶命令改變了埠設定。

4.控制連接合法地或由於其他原因關閉。

5.發生了不可挽回的錯誤。

數據連接管理

默認數據連接埠:所有FTP實現必須支援使用默認數據連接埠,只有用戶PI可能使用非默認埠。

協商非默認埠:用戶PI可能使用PORT命令指定非默認用戶埠。用戶PI可能要求伺服器用PASV命令指定非默認埠。連接用一堆地址指定,上面兩種動作之一都會得到一個不同的連接,仍然允許同時使用兩個命令在兩端指定新的埠。

數據連接復用:當使用流模式傳輸數據時,在文件傳輸結束後必須關閉連接。這時,如果有多個文件傳輸時,可能帶來的問題是TCP為了保證傳輸可靠性,要保持連接記錄一段時間。因此不能馬上重新連接。這種情況下,有兩種解決方案,一種是協商一個非默認埠,另一種是使用其他的傳輸模式。

對於傳輸模式來說,流失傳輸模式有天生的不可靠性,不能確定連接是否過早的關閉。其他的傳輸模式(塊、壓縮)不用關閉連接來指示文件結束。他們使用FTP編碼來確定文件結束。因此使用這些模式可以在多文件傳輸時保持使用同一個數據連接。

傳輸模式

FTP定義了三種傳輸模式:

流模式:

數據以位元組流傳輸。對表示類型沒有限制,可以使用記錄結構。

塊模式:

文件以連續的帶有數據頭的數據塊來傳輸。數據頭包括一個計數域和描述碼。

壓縮模式:

此模式下,有三種資訊要發送:常規數據,以位元組串發送;壓縮數據;控制資訊,以兩位元組的轉義字元傳送。如果發送N>0(最多127)個位元組的常規數據,這N個位元組前要有一個頭位元組,這位元組的最高位為0,其餘7位代表數N。

FTP命令

1.訪問控制命令

用戶名(USER)——用來標識用戶的Telnet字元串。

密碼(PASS)

賬戶(ACCT)

某些站點可能需要一個賬戶用來登陸,另一些站點僅用於特殊訪問許可權,比如存儲文件等。

當登陸過程必須要求填寫賬戶資訊的時候,PASS命令成功的響應程式碼是332;如果登陸過程不要求賬戶資訊時,PASS命令成功的響應程式碼時230;如果賬戶資訊需要在隨後的對話命令中給出,伺服器應該根據時保留(等待ACCT命令)還是放棄命令來相應地返回332或者532.、

改變工作目錄(CWD)——使用戶在不改變登陸用戶和賬戶資訊的情況下改變工作目錄或數據集。傳輸參數保持不變,CWD的參數是一個路徑名,用來指定相應的目錄或者其他系統上的組名。

返回上層目錄(CDUP)

結構裝備(SMNT)——該命令允許用戶在不改變用戶和賬戶資訊的情況下裝備一個不同的文件系統數據結構。參數是一個用來標識目錄或者其他系統中依賴文件組的路徑名。

重新初始化(REIN)——該命令除允許當前正在傳輸過程完成外,終止一個用戶,刷新所有的I/O和賬戶資訊。所有的參數重設為默認值,並保持控制連接。此時等同於控制連接剛剛建立的狀態。這條命令之後可能需要USER命令。

註銷(QUIT)——註銷一個用戶,且當沒有文件正在傳輸的話,伺服器將關閉控制連接。如果當前有文件正在傳輸,連接會保持並等待回應,之後伺服器將關閉連接。如果用戶進程想以不同的用戶民傳輸文件,而不像關閉然後再重建連接的情況下,應該使用REIN而不是QUIT。

控制連接的意外關閉將會導致伺服器產生等同於放棄(ABOR)和註銷(QUIT)動作。

2.傳輸參數命令

所有的數據傳輸參數都有默認值,只有在默認值需要改變的時候才需要用命令去指定傳送數據傳輸參數。默認值是最後一次指定的值,或者如果未被指定,則是標準默認值。

以下命令用來指定數據傳輸參數:

數據埠(PORT)——用來指定數據連接時的主機數據埠。對於用戶和伺服器都有默認的數據埠值,並且一般情況下這條命令以及它的響應都不需要。如果使用了這條命令,那它的參數是一個32位的網際網路主機地址和一個16位TCP埠號。地址資訊被分解成每8位一個段,每個段都作為十進位數(用字元串標識)傳送。段間用都好隔開,一個PORT命令的示例如下:

PORT h1,h2,h3,h4,p1,p2

h1是網際網路主機的高8位

被動(PASV)——此命令請求伺服器DTP在一個數據埠(不是它的默認埠)上監聽並等待連接,而不是在收到傳輸命令後主動發起連接。這個命令的響應包括伺服器監聽的地址和埠號。

表示類型(TYPE)

文件結構(STRU)

傳輸模式(MODE)

3.FTP服務命令

獲得(RETR)——該命令引起伺服器DTP傳送一個由路徑指定的文件拷貝到數據連接另一端的伺服器
或用戶DTP。伺服器文件的狀態和內容應該不受影響。

保存(STOP)——該命令引起伺服器DTP接受經過數據連接傳送的數據並將這些數據存儲為伺服器端
的一個文件。如果在路徑參數里指定的文件在伺服器端已經存在,那麼這個文件會被傳送過
來的數據覆蓋。如果指定的文件不存在則會在伺服器端新建一個文件 。

唯一保存(STOU)

追加(包括創建)(APPE)

分配(ALLO)

重新開始(REST)——指定了需要重新開始傳輸的文件的位置標記。該命令不會引起文件的傳輸,只是忽略文件中指定標記點前的數據。

重命名開始(RNFR)——指定了需要重新命名的文件的原始路徑名。後面須跟」重命名為「命令,來指定新的文件路徑。

重命名為(RNTO)

放棄(ABOR)——該命令告訴伺服器放棄先前的FTP服務命令和相關的傳輸的數據。

$$
當前一個命令(包括數據傳輸)完成時,將不會產生動作。伺服器不會關閉控制連接,但是數據連接必須關閉。

伺服器接受打這個命令時坑能處在兩種狀態:(1)FTP服務命令已經完成;
(2)FTP服務命令還在執行中。

對於第一種情況,伺服器關閉數據連接(如果此時數據連接是打開的),回應226程式碼,表示放棄命令已經成功處理;

第二種情況,伺服器放棄正在進行的FTP服務,關閉數據連接,返回426程式碼,表示請求服務請求異常終止。然後伺服器發送226響應程式碼,表示放棄命令成功處理。
$$

刪除(DELE)——在伺服器端刪除指定的文件。

刪除目錄(RMD)

新建目錄(MKD)

列印工作目錄(PWD)

列表(LIST)

名字列表(NLST)

站點參數(SITE)——伺服器使用這個命令提供本系統可能對傳輸有幫助的特殊服務。

系統(SYST)——該命令用來得到伺服器端作業系統的類型。

狀態(STAT)——該命令通過控制連接以響應碼的形式返回狀態資訊。

幫助(HELP)

空操作(NOOP)——不指定任何動作,只是要求伺服器返回OK響應。

$$
FTP在控制連接上的所有通訊都遵守Telnet協議。
$$

4.FTP響應

響應碼中第一位數字的意義:
1xx:預備狀態——請求的動作已經啟動,在下一個新命令之前,期望一個回應。這種類型的響應用來表明命令已被接受。

2xx:完成狀態——請求動作被成功的完成。一個新的請求可以開始。

3xx:中間狀態——命令被接受,但是請求動作暫時沒有被執行,等待收到進一步的資訊。用戶應發送另一個命令來指定這個資訊。這個回應用在命令組合中。

4xx:暫時拒絕狀態——命令沒有被接受,請求動作沒有發生。但是這個錯誤狀態是暫時的,動作可以被再次請求。用戶應該重新回到命令隊列的開始。

5xx:永久拒絕狀態——命令不被接受,請求動作不會發生。用戶進程不能重複同樣的請求。

區分一個響應應該屬於4xx還是5xx的一個規則是:看這個命令是否可以不加修改,並在相同的用戶、伺服器狀態下再次重複。

響應碼中第二位數字的意義:
x0x:語法錯誤——給出的命令不存在、沒有實現或者多餘。

x1x:資訊——對於請求資訊的響應,比如對狀態或幫助的請求。

x2x:連接——關於控制連接和數據連接的響應。

x3x:身份驗證和賬戶——對登陸過程和賬戶處理的響應。

x4x:目前未被使用。

x5x:文件系統——請求傳輸時伺服器文件系統的狀態或其他文件系統動作狀態。

5.抓包分析:

被動模式下的抓包分析

伺服器IP:192.168.106.9

客戶端IP:192.168.106.7

在这里插入图片描述

在这里插入图片描述

1.在TCP的三次握手之後,成功建立了控制連接,ftp伺服器響應220表明伺服器已經準備就緒。可以看到,此時的ftp伺服器控制連接的埠號是21,客戶端控制連接的埠號是53004;

2.客戶端同通過控制連接(192.168.106.7:53004→192.168.106.9:21)發送auth tls 和auth ssl鑒權命令,因為此時不是sftp所以沒有執行該鑒權命令;

3.客服端發送USER anonymous,使用匿名登陸,伺服器返回230,登陸成功;

4.客戶端發送TYPE A命令,伺服器返回200,設置ASCII傳輸格式成功;

4.客戶端通過控制連接發送PASV命令,伺服器響應227,表示伺服器成功進入被動模式,IP為192.168.106.9,埠號為1039.(結合上面提到的埠計算公式:port = p1x256+p2,即4x256+15=1039)。

5.客戶端發送RETR請求下載名為123test.txt的文件;

6.客戶端和伺服器再次經過TCP3次握手,建立數據連接(1039<===>53009),開始傳輸數據;

7.傳輸完成後,伺服器21向客戶端53008發送226響應,關閉數據連接。

主動模式下的抓包分析

如下圖:

在这里插入图片描述