FTP協議主動(Port)模式和被動(Passive)兩種模式詳解

原文地址:https://baijiahao.baidu.com/s?id=1604307221471041402&wfr=spider&for=pc

 

FTP(File Transfer Protocol)是文件傳輸協議的簡稱。正如其名所示:FTP的主要作用,就是讓用戶連接上一個遠程計算機(這些計算機上運行着FTP服務器程序)察看遠程計算機有哪些文件,然後把文件從遠程計算機上拷到本地計算機,或把本地計算機的文件送到遠程計算機去。

FTP支持兩種方式的傳輸:文本(ASCII)方式和二進制(Binary)方式。通常文本文件的傳輸採用ASCII方式,而圖象、聲音文件、加密和壓縮文件等非文本文件採用二進制方式傳輸,如果爲了從一個系統上傳輸文件而使用了與本地系統不同的計算機字節位數,那麼就必須使用Tenex模式。FTP以ASCII方式作爲缺省的文件傳輸方式。

 

二、ftp的兩種傳輸模式:主動(FTP Port)模式和被動(FTP Passive)模式。

當我們對FTP協議進行學習的時候,你首先要考慮到的一個問題是使用的是port模式(主動)的還是passive模式(被動)。在過去,客戶端缺省爲主動模式;近來,由於Port模式的存在安全問題(port模式下,數據信道中,FTP服務端爲固定端口號20;passive模式下,數據信道中,客戶端和服務端都是動態端口號。後者更安全。),許多客戶端的FTP應用缺省變爲了被動模式。FTP是僅基於TCP的服務,不支持UDP。 與衆不同的是FTP使用2個端口,一個數據端口和一個命令端口(也可叫做控制端口)。通常來說這兩個端口是21-命令端口和20-數據端口。

具體用哪種模式,在於客戶端的選擇。在被動模式中,客戶端在第一信道(控制信道)三次握手結束後,再次發了一條詢問服務端是否支持passive模式的命令,服務端如果支持,則回覆一個隨機端口號和ip地址。在第二信道(數據信道)中,客戶端就以上一步收到的隨機端口爲目的端口,與服務器建立連接(三次握手),同時也告訴服務端自己的隨機端口號(客戶端)。

而在主動模式中,客戶端在第一信道(控制信道)三次握手結束後,再次發送的不是詢問服務端是否支持passive模式的命令,而是通知服務端,接下來的第二信道,客戶端將使用的端口號。

詳細分解一:FTP Port(主動)模式

客戶端從一個任意的大於1023(N)的端口連接到FTP服務器的命令端口,也就是21端口。然後客戶端開始監聽端口N+1,併發送FTP命令“port N+1”到FTP服務器。接着服務器會從它自己的數據端口(20)連接到客戶端指定的數據端口(N+1)。針對FTP服務器前面的防火牆來說,必須允許以下通訊才能支持主動方式FTP:任何端口到FTP服務器的21端口 (客戶端初始化的連接到FTP服務器);FTP服務器的21端口到大於1023的端口(服務器響應客戶端的控制端口);FTP服務器的20端口到大於1023的端口(服務器端初始化數據連接到客戶端的數據端口);大於1023端口到FTP服務器的20端口(客戶端發送ACK響應到服務器的數據端口)。

 

 

Port模式的FTP詳細步驟如下:

1、 客戶端發送一個TCP SYN(TCP同步)包給服務器端衆所周知的FTP控制端口21,客戶端使用暫時的端口作爲它的源端口;

2、 服務器端發送SYN ACK(同步確認)包給客戶端,源端口爲21,目的端口爲客戶端上使用的暫時端口;

3、 客戶端發送一個ACK(確認)包;客戶端使用這個連接來發送FTP命令,服務器端使用這個連接來發送FTP應答;

4、 當用戶請求一個列表(List)請求或者發起一個要求發送或者接受文件的請求,客戶端軟件使用PORT命令,這個命令包含了一個暫時的端口,客戶端希望服務器在打開一個數據連接時候使用這個暫時端口;PORT命令也包含了一個IP地址,這個IP地址通常是客戶自己的IP地址,而且FTP也支持第三方 (third-party)模式,第三方模式是客戶端告訴服務器端打開與另一臺主機的連接;

5、 服務器端發送一個SYN包給客戶端的暫時端口,源端口爲20,暫時端口爲客戶端在PORT命令中發送給服務器端的暫時端口號;

6、 客戶端以源端口爲暫時端口,目的端口爲20發送一個SYN ACK包;

7、 服務器端發送一個ACK包;

8、 發送數據的主機以這個連接來發送數據,數據以TCP段(注:segment,第4層的PDU)形式發送(一些命令,如STOR表示客戶端要發送數據,RETR表示服務器段發送數據),這些TCP段都需要對方進行ACK確認(注:因爲TCP協議是一個面向連接的協議)

9、 當數據傳輸完成以後,發送數據的主機以一個FIN命令來結束數據連接,這個FIN命令需要另一臺主機以ACK確認,另一臺主機也發送一個FIN命令,這個FIN命令同樣需要發送數據的主機以ACK確認;

10、 客戶端能在控制連接上發送更多的命令,這可以打開和關閉另外的數據連接;有時候客戶端結束後,客戶端以FIN命令來關閉一個控制連接,服務器端以ACK包來確認客戶端的FIN,服務器同樣也發送它的FIN,客戶端用ACK來確認。

詳細分解二:FTP PAVS(被動)模式

爲了解決服務器發起到客戶的連接的問題,人們開發了一種不同的FTP連接方式。這就是所謂的被動方式,或者叫做PASV,當客戶端通知服務器它處於被動模式時才啓用。

在被動方式FTP中,命令連接和數據連接都由客戶端,這樣就可以解決從服務器到客戶端的數據端口的入方向連接被防火牆過濾掉的問題。當開啓一個FTP連接時,客戶端打開兩個任意的本地端口(N >; 1024和N+1)。第一個端口連接服務器的21端口,但與主動方式的FTP不同,客戶端不會提交PORT命令並允許服務器來回連它的數據端口,而是提交PASV命令。這樣做的結果是服務器會開啓一個任意的非特權端口(端口號大於1024),併發送PORT P命令給客戶端。然後客戶端發起從本地端口N+1到服務器的端口P的連接用來傳送數據。對於服務器端的防火牆來說,必須允許下面的通訊才能支持被動方式的FTP。從任何端口到服務器的21端口 (客戶端初始化的連接);服務器的21端口到任何大於1023的端口 (服務器響應到客戶端的控制端口的連接 );從任何端口到服務器的大於1023端口 (客戶端初始化數據連接到服務器指定的任意端口);服務器的大於1023端口到遠程的大於1023的端口(出;服務器發送ACK響應和數據到客戶端的數據端口)。

 

對比主動模式,被動模式在第1步中,客戶端的命令端口與服務器的命令端口建立連接,併發送命令“PASV”。然後在第2步中,服務器返回命令"PORT N(N爲端口號)",告訴客戶端(服務器)用哪個端口偵聽數據連接。在第3步中,客戶端初始化一個從自己的數據端口到服務器端指定的數據端口的數據連接。最後服務器在第4 步中給客戶端的數據端口返回一個"ACK"響應。

被動方式的FTP解決了客戶端的許多問題,但同時給服務器端帶來了更多的問題。最大的問題是需要允許從任意遠程終端到服務器高位端口的連接。幸運的是,許多FTP程序允許管理員指定FTP服務器使用的端口範圍。

另外客戶端有的支持被動模式,有的不支持被動模式,必須考慮如何能支持這些客戶端,以及爲他們提供解決辦法。例如,Solaris提供的FTP命令行工具就不支持被動模式,需要第三方的FTP客戶端,比如ncftp。

爲了更好的理解被動模式,我們使用實驗去驗證學習。

試驗環境:PC的IP地址爲192.168.98.88,服務器的地址爲:192.168.98.12,客戶端軟件選擇cuteftp,首先採用被動模式向服務器發起數據連接。

 

 

根據源IP爲192.168.98.88可知模式的選擇是客戶端發起的,PASV是選擇被動模式的報文。服務器進行迴應:

 

 

FTP報文段裏顯示了被動模式(Passive Mode)以及發送給客戶端自己的IP地址以及提供給對方一個隨機端口號,計算方式是4*256+222=1246。並打開自己的1246號端口,使其處於監聽狀態,等待客戶端發起數據連接請求。

 

 

由上圖可以看出客戶端向服務器發起的LIST命令,列出文件目錄是在控制連接裏發起的請求,由目的端口號可以看出來。

 

 

客戶端接收到這個服務器關於PASV模式的迴應,根據服務器提供的IP和端口號重新建立一個新的數據連接,源端口爲3399,目的端口爲1246(服務器提供的端口),並且從SYN被置爲1的情況下可以看出這個一個新的連接。隨後的數據是通過這個連接提供的新端口號進行傳輸的。

 

 

FTP報文段顯示的是Ftp Data,說明傳輸的是數據。當某幾段數據傳輸完成之後,客戶端或服務器會向對方發送一個FIN來關閉這條連接。如下圖:

 

 

而控制連接,如果客戶端不主動發送FIN,它將一直在整個過程中存在,在服務器上,以21號端口來確認是控制連接。

 

 

從時間上來看,第7秒到21秒,TCP的報頭信息中,源端口號和目的端口號都未改變,這個連接一直存在。

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