FTP簡介

什麼是FTP?

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

在TCP/IP協議族的應用層,其傳輸層使用的是TCP協議,它是基於客戶服務器模式工作的。

FTP支持哪些文件類型?

(1)ASCII碼文件(也稱爲文本文件)(常用)

(2)EBCDIC碼文件,該文本文件在傳輸時要求兩端都使用EBCDIC碼。

(3)圖像文件,也稱作二進制文件類型。發送的數據爲連續的比特流。(常用)

(4)本地文件,字節的大小由本地主機定義,即每一字節的比特數又發送方規定。

如果以二進制形式傳輸文件,\r\n不做任何解析,而ASCII碼形式傳輸文件,\r\n會做解析。(\n是linux系統上的換行符,\r\n是windows上的換行符)。FTP一般默認二進制傳輸,ASCII碼傳輸不太安全。

FTP工作原理

FTP是一個CS架構的軟件,左邊是客戶端,右邊是服務端。客戶端有一個用戶界面,可以是LeapFTP這樣的圖形界面,也可以是命令行形式的文本文件方式來使用。一旦用戶有一個操作,就會通過用戶協議解釋器轉換成對應的FTP命令,通過控制連接發送給服務器端,控制連接的端口號是21,首先是客戶端去連接服務器端的21端口,建立了控制連接,控制連接主要是用於FTP命令以及FTP命令的響應。一旦服務器端收到一個命令以後就要進行相應的工作,比如收到了用戶名和密碼,就要進行相應的驗證。驗證成功之後就給客戶端響應,驗證失敗的話就給一個失敗的響應。FTP傳送命令的時候,主要是爲了文件傳輸,也就是會涉及到文件傳輸的命令,這些命令也是通過控制連接來發送的,一旦服務器端解析到一個文件傳輸的命令之後,就要和客戶端建立一個新的連接通道,這個通道稱爲數據連接通道,用於傳輸文件。這個連接的建立,可以由客戶端主動發起,也可以由服務器端發起。這就對應到了兩種不同的工作模式。如果是客戶端上傳文件的話,就會讀取本地文件系統中的文件,傳輸給服務器端,服務端就將它寫到服務器端對應的文件系統。如果是下載的話,服務器端讀取文件系統中的數據,寫入到數據連接,通過數據連接發送給客戶端,客戶端就讀取數據連接中的數據,寫入到本地的文件系統。這就是FTP工作的基本原理。

數據連接並不是永久性存在的,一旦傳輸完畢就會將這個連接關閉掉,但是控制連接不會關閉,除非將客戶端關閉了,控制連接纔會隨之關閉。控制連接是隨客戶端一起存在的,而數據連接是短暫存在的,只要文件傳輸或者列表傳輸完成,數據連接就關閉了。

FTP常用命令

FTP兩種工作模式

主要是針對數據連接而言的,控制連接的建立總是由客戶端向服務器端發起。而數據連接通道的建立則不同,既可以是服務器端向客戶端發起連接建立數據連接通道,這種模式稱爲主動模式。也可以是客戶端向服務器端發起連接建立數據連接通道,這種模式稱爲被動模式。

主動模式

首先建立一個控制連接通道,客戶端向服務端的21端口號發起連接,經過三次握手建立了數據連接通道。客戶端本地也會動態選擇一個端口號AA,一旦控制連接通道建立好之後,雙方就可以交換信息了。客戶端可以通過控制連接通道向服務器端發起命令請求,服務器端也可以通過控制連接通道對這些命令請求進行應答。

       在創建數據連接之前,要選擇工作模式,如果是主動模式,客戶端會向服務器端21端口號發送一個PORT命令,這個命令也是通過控制連接通道來完成的,並且告知一個客戶端的端口號,這樣服務器端才知道要連接客戶端的哪一個端口號,服務器端得到這個信息,就向BB端口號發起一個連接請求,建立了一個數據連接通道,數據連接通道一旦建立完畢,就可以進行數據的傳輸了。包括目錄表傳輸以及文件傳輸等等。一旦這些傳輸完畢,數據連接通道就會關閉,它是臨時的。服務器端主動連接客戶端的時候,服務器端要選擇一個20的端口。

(1)客戶端向服務器端發送PORT命令

客戶端創建數據套接字

客戶端綁定一個臨時端口bind(0),由於是臨時的端口號,並不知道是哪個端口號,到時候通過getsockname查看到底綁定的是哪個端口號,以便格式化爲下面的格式

客戶端在套接字上監聽

將IP與端口格式化爲h1,h2,h3,h4,p1,p2

(2)服務器端以200響應

        服務器端解析客戶端發過來的IP和端口號暫存起來,以便後續建立數據連接

(3)客戶端向服務器端發送LIST

        服務器端檢測在收到LIST命令之前是否接受過PORT或PASV命令

        如果沒有接受過,則響應425Use PORT or PASV first

        如果有接收過,並且是PORT則服務器端創建數據套接字(bind20端口),調用connect主動連接客戶端IP和端口,從而建立數據連接。

(4)服務器發送150應答客戶端,表示準備就緒,可以開始傳輸了。

(5)開始傳輸列表

(6)服務器發送226應答給客戶端,表示數據傳輸結束

       數據傳輸結束,服務器端主動關閉數據套接字

被動模式

1)客戶端向服務器端發送PASV命令

(2)服務器端以227響應

     服務器端創建數據套接字

        服務器端綁定一個臨時端口

     服務器在套接字上監聽

        將IP和端口格式化爲h1,h2,h3,h4,p1,p2響應給客戶端,以便客戶端發起數據連接

(3)客戶端向服務器端發送LIST

        服務器端檢測在收到LIST命令之前是否接受過PORT或PASV命令

        如果沒有接受過,則響應425Use PORT or PASV first

        如果有接收過,並且是PASV則調用accept被動接受客戶端的連接返回已連接套接字,從而建立數據連接。

(4)服務器發送150應答客戶端,表示準備就緒,可以開始傳輸了。

(5)開始傳輸列表

(6)服務器發送226應答給客戶端,表示數據傳輸結束。數據傳輸結束,客戶端主動關閉數據套接字。一旦關閉,服務器端也能收到這個信息,因爲客戶端主動關閉套接字,服務器端read返回0,就會將本地的數據套接字關閉掉。

NAT或防火牆對主被動模式的影響

NAT是用於在本地網絡中使用私有地址,在連接互聯網時轉而使用全局IP地址的技術。除轉換IP地址外,還出現了可以轉換TCP、UDP端口號的NAPT技術,由此可以實現用一個全局IP地址與多個主機的通信。具體看TCP/IP詳解P179頁


FTP客戶端處於NAT或防火牆之後的主動模式


由於客戶端處於局域網之中,無法直接訪問公網上的服務器,需要經過NAT服務器(中間那個)進行地址轉換。而NAT有一個特徵,如果是從內向外發起連接,則可以建立成功(NAT會維護一個IP的表目),如果是從外部發起的連接,則無法建立連接。
開始時客戶端想服務器發起連接建立控制連接通道,接着客戶端向服務器發送PORT命令和數據通道的端口BB,欲通過主動模式建立數據連接通道,而因爲實際上連到FTP服務器的IP地址是經過NAT服務器進行轉換的,故服務器實際上是連接到了NAT服務器的BB端口(此時NAT的BB端口沒有啓用,故連接被拒絕),並且並沒有相應的條目可以找到客戶端,所以此時的主動模式時不能成功的。
解決方式可以自己在NAT配置映射信息,允許FTP服務器連接過來。如果手工配置映射條目,那麼就必須知道FTP服務器是哪一個端口發起連接過來,所以FTP的主動模式發起連接的端口規定爲20端口而不是動態選擇,否則NAT映射的信息會很多。

FTP客戶端處於NAT或防火牆之後的被動模式


如果FTP客戶端處於NAT或防火牆之後,並且使用被動連接,此時是可以連接成功的,示意圖如下圖所示,過程和之前的類似,這裏不再重複。

FTP服務器處於NAT或防火牆之後的被動模式


如果FTP服務器處於NAT或防火牆之後,在建立控制連接通道的時候,由於是客戶端向服務器發起連接,因此需要在NAT配置一個映射條目(FTP服務器固定是21端口),經過三次握手建立控制連接通道。若使用被動模式,則在建立數據連接通道的時候,處於外網的客戶端向處於內網的服務器發起的連接可能建立不能成功,這個和之前的也是類似的。所以我們可以知道,當FTP服務器處於NAT或防火牆之後的被動模式可能建立不成功。

FTP服務器處於NAT或防火牆之後的主動模式


 從上面的分析我們應該可以得到,FTP服務器處於NAT或防火牆之後的主動模式是可以建立成功的。如下圖所示

FTP中的21端口和20端口的作用

進行FTP文件傳輸中,客戶端首先連接到FTP服務器的21端口(當然這個端口可以在配置文件中進行修改),進行用戶的認證,接受客戶端的來連接。認證成功後,要傳輸文件時,如果ftp服務是主動模式,服務器端就會開一個端口20來進行傳輸數據文件。被動模式,則是隨機選擇一個端口號。


 

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