1. 程式人生 > >FTP主動模式及被動模式

FTP主動模式及被動模式

起初, FTP並不是應用於IP網路上的協議,而是ARPANET網路中計算機間的檔案傳輸協議, ARPANET是美國國防部組建的老網路,於1960~1980年使用。在那時, FTP的主要功能是在主機間高速可靠地傳輸檔案。目前FTP仍然保持其可靠性,即使在今天,它還允許檔案遠端存取。這使得使用者可以在某個系統上工作,而將檔案存貯在別的系統。例如,如果某使用者執行Web伺服器,需要從遠端主機上取得HTML檔案和CGI程式在本機上工作,他需要從遠端儲存站點獲取檔案(遠端站點也需安裝Web伺服器)。當用戶完成工作後,可使用FTP將檔案傳回到Web伺服器。採用這種方法,使用者無需使用Telnet登入到遠端主機進行工作,這樣就使Web伺服器的更新工作變得如此的輕鬆。

FTP是TCP/IP的一種具體應用,它工作在OSI模型的第七層, TCP模型的第四層上,即應用層,使用TCP傳輸而不是UDP,這樣FTP客戶在和伺服器建立連線前就要經過一個被廣為熟知的“三次握手”的過程,它帶來的意義在於客戶與伺服器之間的連線是可靠的,而且是面向連線,為資料的傳輸提供了可靠的保證。

下面,讓我們來看看,一個FTP客戶在和伺服器連線是怎麼樣的一個過程(以標準的FTP埠號為例)。
首先,FTP並不像HTTP協議那樣,只需要一個埠作為連線(HTTP的預設埠是80,FTP的預設埠是21),FTP需要2個埠,一個埠是作為控制連線埠,也就是21這個埠,用於傳送指令給伺服器以及等待伺服器響應;另一個埠是資料傳輸埠,埠號為20(僅PORT模式),是用來建立資料傳輸通道的,主要有3個作用
1) 從客戶向伺服器傳送一個檔案。
2) 從伺服器向客戶傳送一個檔案。
3) 從伺服器向客戶傳送檔案或目錄列表。
其次,FTP的連線模式有兩種,PORT和PASV。PORT模式是一個主動模式,PASV是被動模式,這裡都是相對於伺服器而言的。為了讓大家清楚的認識這兩種模式,朗月繁星分別舉例說明。

PORT模式

當FTP客戶以PORT模式連線伺服器時,他動態的選擇一個埠號(本次試驗是6015)連線伺服器的21埠,注意這個埠號一定是1024以上的,因為1024以前的埠都已經預先被定義好,被一些典型的服務使用,當然有的還沒使用,保留給以後會用到這些埠的資源服務。當經過TCP的三次握手後,連線(控制通道)被建立(如圖1和圖2)。

圖1:FTP客戶使用FTP命令建立於伺服器的連線

圖2:用netstat命令檢視,控制通道被建立在客戶機的6015和伺服器的20埠 現在使用者要列出伺服器上的目錄結構(使用ls或dir命令),那麼首先就要建立一個數據通道,因為只有資料通道才能傳輸目錄和檔案列表,此時使用者會發出PORT指令告訴伺服器連線自己的什麼埠來建立一條資料通道(這個命令由控制通道傳送給伺服器),當伺服器接到這一指令時,伺服器會使用20埠連線使用者在PORT指令中指定的埠號,用以傳送目錄的列表(如圖3)。
圖3:ls命令是一個互動命令,它會首先與伺服器建立一個數據傳輸通道。經驗證本次試驗客戶機使用6044埠 當完成這一操作時,FTP客戶也許要下載一個檔案,那麼就會發出get指令,請注意,這時客戶會再次傳送PORT指令,告訴伺服器連線他的哪個“新”埠,你可以先用netstat -na這個命令驗證,上一次使用的6044已經處於TIME_WAIT狀態(如圖4)。
圖4:使用netstat命令驗證上一次使用ls命令建立的資料傳輸通道已經關閉 當這個新的資料傳輸通道建立後(在微軟的系統中,客戶端通常會使用連續的埠,也就是說這一次客戶端會用6045這個埠),就開始了檔案傳輸的工作。 PASV模式 然而,當FTP客戶以PASV模式連線伺服器時,情況就有些不同了。在初始化連線這個過程即連線伺服器這個過程和PORT模式是一樣的,不同的是,當FTP客戶傳送ls、dir、get等這些要求資料返回的命令時,他不向伺服器傳送PORT指令而是傳送PASV指令,在這個指令中,使用者告訴伺服器自己要連線伺服器的某一個埠,如果這個伺服器上的這個埠是空閒的可用的,那麼伺服器會返回ACK的確認資訊,之後資料傳輸通道被建立並返回使用者所要的資訊(根據使用者傳送的指令,如ls、dir、get等);如果伺服器的這個埠被另一個資源所使用,那麼伺服器返回UNACK的資訊,那麼這時,FTP客戶會再次傳送PASV命令,這也就是所謂的連線建立的協商過程。為了驗證這個過程我們不得不借助CUTEFTP Pro這個大家經常使用的FTP客戶端軟體,因為微軟自帶的FTP命令客戶端,不支援PASV模式。雖然你可以使用QUOTE PASV這個命令強制使用PASV模式,但是當你用ls命令列出伺服器目錄列表,你會發現它還是使用PORT方式來連線伺服器的。現在我們使用CUTEFTP Pro以PASV模式連線伺服器(如圖5),
圖5:使用CUTEFTP Pro以PASV模式連線伺服器 請注意連線LOG裡有這樣幾句話: 其中,
227 Entering Passive Mode (127,0,0,1,26,80).代表客戶機使用PASV模式連線伺服器的26x256+108=6764埠。(當然伺服器要支援這種模式)
125 Data connection already open; Transfer starting.說明伺服器的這個埠可用,返回ACK資訊。 再讓我們看看用CUTEFTP Pro以PORT模式連線伺服器的情況。其中在LOG裡有這樣的記錄: 其中,
PORT 127,0,0,1,28,37告訴伺服器當收到這個PORT指令後,連線FTP客戶的28x256+37=7205這個埠
Accepting connection: 127.0.0.1:20 表示伺服器接到指令後用20埠連線7205埠,而且被FTP客戶接受。 在這兩個例子中,請注意: PORT模式建立資料傳輸通道是由伺服器端發起的,伺服器使用20埠連線客戶端的某一個大於1024的埠;在PASV模式中,資料傳輸的通道的建立是由FTP客戶端發起的,他使用一個大於1024的埠連線伺服器的1024以上的某一個埠。如果從C/S模型這個角度來說,PORT對於伺服器來說是OUTBOUND,而PASV模式對於伺服器是INBOUND,這一點請特別注意,尤其是在使用防火牆的企業裡,比如使用微軟的ISA Server 2000釋出一個FTP伺服器,這一點非常關鍵,如果設定錯了,那麼客戶將無法連線。 最後,請注意在FTP客戶連線伺服器的整個過程中,控制通道是一直保持連線的,而資料傳輸通道是臨時建立的。
在本文中,朗月繁星把重點放到了FTP的連線模式,沒有涉及FTP的其他內容,比如FTP的檔案型別(Type),格式控制(Format control)以及傳輸方式(Transmission mode)等。不過這些規範大家可能不需要花費過多的時間去了解,因為現在流行的FTP客戶端都可以自動的選擇正確的模式來處理,對於FTP伺服器端通常也都做了一些限制,如下
• 型別:ASCII或影象。
• 格式控制:只允許非列印。
• 結構:只允許檔案結構。
• 傳輸方式:只允許流方式
至於這些內容,限於篇幅朗月繁星在這裡就不想再介紹了。希望這篇文章能對大家有些幫助,特別是正在學習ISA Server的朋友和一些對FTP不很瞭解的朋友。