FTP協議

FTP 概述

FTP工作在TCP/IP模型的應用層,基於的傳輸協議是TCP,FTP客戶端和服務器之間的連接是可靠的,面向連接的,爲數據的傳輸提供了可靠的保證。

文件傳輸協議(FTP)作爲網絡共享文件的傳輸協議,在網絡應用軟件中具有廣泛的應用。FTP的目標是提高文件的共享性和可靠高效地傳送數據。

在傳輸文件時,FTP 客戶端程序先與服務器建立連接,然後向服務器發送命令。服務器收到命令後給予響應,並執行命令。FTP 協議與操作系統無關,任何操作系統上的程序只要符合 FTP 協議,就可以相互傳輸數據。本文主要基於 LINUX 平臺,對 FTP 客戶端的實現原理進行詳盡的解釋並闡述如何使用 C 語言編寫一個簡單的 FTP 客戶端。

FTP的主要特徵:

1.控制連接是建立在客戶協議解釋器和服務器協議解釋器之間用於交換命令與應答的通信鏈路。

2.數據連接是傳輸數據的全雙工連接。傳輸數據可以發生在服務器數據傳輸過程DTP和客戶DTP之間,也可以發生在兩個服務器的DTP之間。

FTP 協議

相比其他協議,如 HTTP 協議,FTP 協議要複雜一些。與一般的 C/S 應用不同點在於一般的C/S 應用程序一般只會建立一個 Socket 連接,這個連接同時處理服務器端和客戶端的連接命令和數據傳輸。而FTP協議中將命令與數據分開傳送的方法提高了效率。

FTP 使用 2 個端口,一個數據端口和一個命令端口(也叫做控制端口)。這兩個端口一般是21 (命令端口)和 20 (數據端口)。控制 Socket 用來傳送命令,數據 Socket 是用於傳送數據。每一個 FTP 命令發送之後,FTP 服務器都會返回一個字符串,其中包括一個響應代碼和一些說明信息。其中的返回碼主要是用於判斷命令是否被成功執行了。

FTP客戶端與服務器之間要建立雙重連接,一個是控制連接,一個是數據連接

  建立雙重連接的原因是:FTP是一個交互式會話系統,某客戶每次調用FTP,便與服務器建立一次會話,會話以控制連接來維持。

    客戶端每提出一個請求,服務器與客戶端建立一個數據連接,進行實際的數據(比如文件)傳輸,一旦數據傳輸結束,數據連接相繼撤銷,但控制連接依然存在,客戶端可以繼續發出命令。

    客戶可以撤銷控制連接(close命令),也可以退出FTP會話(quit命令)。

命令端口

一般來說,客戶端有一個 Socket 用來連接 FTP 服務器的相關端口,它負責 FTP 命令的發送和接收返回的響應信息。一些操作如“登錄”、“改變目錄”、“刪除文件”,依靠這個連接發送命令就可完成。

數據端口

對於有數據傳輸的操作,主要是顯示目錄列表,上傳、下載文件,我們需要依靠另一個 Socket來完成。

如果使用被動模式,通常服務器端會返回一個端口號。客戶端需要用另開一個 Socket 來連接這個端口,然後我們可根據操作來發送命令,數據會通過新開的一個端口傳輸。

如果使用主動模式,通常客戶端會發送一個端口號給服務器端,並在這個端口監聽。服務器需要連接到客戶端開啓的這個數據端口,並進行數據的傳輸。

下面對 FTP 的主動模式和被動模式做一個簡單的介紹。

主動模式 (PORT)

主動模式下,客戶端隨機打開一個大於 1024 的端口向服務器的命令端口 P,即 21 端口,發起連接,同時開放N +1 端口監聽,並向服務器發出 “port N+1” 命令,由服務器從它自己的數據端口 (20) 主動連接到客戶端指定的數據端口 (N+1)。

FTP 的客戶端只是告訴服務器自己的端口號,讓服務器來連接客戶端指定的端口。對於客戶端的防火牆來說,這是從外部到內部的連接,可能會被阻塞。

被動模式 (PASV)

爲了解決服務器發起到客戶的連接問題,有了另一種 FTP 連接方式,即被動方式。命令連接和數據連接都由客戶端發起,這樣就解決了從服務器到客戶端的數據端口的連接被防火牆過濾的問題。

被動模式下,當開啓一個 FTP 連接時,客戶端打開兩個任意的本地端口 (N > 1024 和 N+1) 。

第一個端口連接服務器的 21 端口,提交 PASV 命令。然後,服務器會開啓一個任意的端口 (P > 1024 ),返回如“227 entering passive mode (127,0,0,1,4,18)”。 它返回了 227 開頭的信息,在括號中有以逗號隔開的六個數字,前四個指服務器的地址,最後兩個,將倒數第二個乘 256 再加上最後一個數字,這就是 FTP 服務器開放的用來進行數據傳輸的端口。如得到 227 entering passive mode (h1,h2,h3,h4,p1,p2),那麼端口號是 p1*256+p2,ip 地址爲h1.h2.h3.h4。這意味着在服務器上有一個端口被開放。客戶端收到命令取得端口號之後, 會通過 N+1 號端口連接服務器的端口 P,然後在兩個端口之間進行數據傳輸。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章