FTP協(xié)議概述
起初, FTP并不是應用于IP網(wǎng)絡上的協(xié)議,而是ARPANEt網(wǎng)絡中計算機間的文件傳輸協(xié)議, ARPANET是美國國防部組建的老網(wǎng)絡,于1960-1980年使用。在那時, FTP的主要功能是在主機間高速可靠地傳輸文件。目前FTP仍然保持其可靠性,即使在今天,它還允許文件遠程存取。這使得用戶可以在某個系統(tǒng)上工作,而將文件存貯在別的系統(tǒng)。例如,如果某用戶運行Web服務器,需要從遠程主機上取得HTML文件和CGI程序在本機上工作,他需要從遠程存儲站點獲取文件(遠程站點也需安裝Web服務器)。當用戶完成工作后,可使用FTP將文件傳回到Web服務器。采用這種方法,用戶無需使用Telnet登錄到遠程主機進行工作,這樣就使Web服務器的更新工作變得如此的輕松。
FTP是TCP/IP的一種具體應用,它工作在OSI模型的第七層,TCP模型的第四層上,即應用層,使用TCP傳輸而不是UDP,這樣FTP客戶在和服務器建立連接前就要經過一個被廣為熟知的"三次握手"的過程,它帶來的意義在于客戶與服務器之間的連接是可靠的,而且是面向連接,為數(shù)據(jù)的傳輸提供了可靠的保證。
下面,讓我們來看看,一個FTP客戶在和服務器連接是怎么樣的一個過程(以標準的FTP端口號為例)。
首先,F(xiàn)TP并不像HTTP協(xié)議那樣,只需要一個端口作為連接(HTTP的默認端口是80,F(xiàn)TP的默認端口是21),F(xiàn)TP需要2個端口,一個端口是作為控制連接端口,也就是21這個端口,用于發(fā)送指令給服務器以及等待服務器響應;另一個端口是數(shù)據(jù)傳輸端口,端口號為20(僅PORT模式),是用來建立數(shù)據(jù)傳輸通道的,主要有3個作用
從客戶向服務器發(fā)送一個文件。
從服務器向客戶發(fā)送一個文件。
從服務器向客戶發(fā)送文件或目錄列表。
其次,F(xiàn)TP的連接模式有兩種,PORT和PASV。PORT模式是一個主動模式,PASV是被動模式,這里都是相對于服務器而言的。為了讓大家清楚的認識這兩種模式,朗月繁星分別舉例說明。
PORT模式
當FTP客戶以PORT模式連接服務器時,他動態(tài)的選擇一個端口號(本次試驗是6015)連接服務器的21端口,注意這個端口號一定是1024以上的,因為1024以前的端口都已經預先被定義好,被一些典型的服務使用,當然有的還沒使用,保留給以后會用到這些端口的資源服務。當經過TCP的三次握手后,連接(控制信道)被建立(如圖1和圖2)?,F(xiàn)在用戶要列出服務器上的目錄結構(使用ls或dir命令),那么首先就要建立一個數(shù)據(jù)通道,因為只有數(shù)據(jù)通道才能傳輸目錄和文件列表,此時用戶會發(fā)出PORT指令告訴服務器連接自己的什么端口來建立一條數(shù)據(jù)通道(這個命令由控制信道發(fā)送給服務器),當服務器接到這一指令時,服務器會使用20端口連接用戶在PORT指令中指定的端口號,用以發(fā)送目錄的列表(如圖3)。當完成這一操作時,F(xiàn)TP客戶也許要下載一個文件,那么就會發(fā)出get指令,請注意,這時客戶會再次發(fā)送PORT指令,告訴服務器連接他的哪個"新"端口,你可以先用netstat -na這個命令驗證,上一次使用的6044已經處于TIME_WAIT狀態(tài)(如圖4)。當這個新的數(shù)據(jù)傳輸通道建立后(在微軟的系統(tǒng)中,客戶端通常會使用連續(xù)的端口,也就是說這一次客戶端會用6045這個端口),就開始了文件傳輸?shù)墓ぷ鳌?BR> PASV模式
然而,當FTP客戶以PASV模式連接服務器時,情況就有些不同了。在初始化連接這個過程即連接服務器這個過程和PORT模式是一樣的,不同的是,當FTP客戶發(fā)送ls、dir、get等這些要求數(shù)據(jù)返回的命令時,他不向服務器發(fā)送PORT指令而是發(fā)送PASV指令,在這個指令中,用戶告訴服務器自己要連接服務器的某一個端口,如果這個服務器上的這個端口是空閑的可用的,那么服務器會返回ACK的確認信息,之后數(shù)據(jù)傳輸通道被建立并返回用戶所要的信息(根據(jù)用戶發(fā)送的指令,如ls、dir、get等);如果服務器的這個端口被另一個資源所使用,那么服務器返回UNACK的信息,那么這時,F(xiàn)TP客戶會再次發(fā)送PASV命令,這也就是所謂的連接建立的協(xié)商過程。為了驗證這個過程我們不得不借助CUTEFTP Pro這個大家經常使用的FTP客戶端軟件,因為微軟自帶的FTP命令客戶端,不支持PASV模式。雖然你可以使用QUOTE PASV這個命令強制使用PASV模式,但是當你用ls命令列出服務器目錄列表,你會發(fā)現(xiàn)它還是使用PORT方式來連接服務器的?,F(xiàn)在我們使用CUTEFTP Pro以PASV模式連接服務器(如圖5),請注意連接LOG里有這樣幾句話:
COMMAND:> PASV
227 Entering Passive Mode (127,0,0,1,26,108)
COMMAND:> LIST
STATUS:> Connecting ftp data socket 127.0.0.1: 6764...
125 Data connection already open; Transfer starting.
226 Transfer complete.
其中,
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里有這樣的記錄:
COMMAND:> PORT 127,0,0,1,28,37
200 PORT command successful.
COMMAND:> LIST
150 Opening ASCII mode data connection for /bin/ls.
STATUS:> Accepting connection: 127.0.0.1:20.
226 Transfer complete.
STATUS:> Transfer complete.
其中,
PORT 127,0,0,1,28,37告訴服務器當收到這個PORT指令后,連接FTP客戶的28x256+37=7205這個端口。
Accepting connection: 127.0.0.1:20表示服務器接到指令后用20端口連接7205端口,而且被FTP客戶接受。
比較分析
在這兩個例子中,請注意: PORT模式建立數(shù)據(jù)傳輸通道是由服務器端發(fā)起的,服務器使用20端口連接客戶端的某一個大于1024的端口;在PASV模式中,數(shù)據(jù)傳輸?shù)耐ǖ赖慕⑹怯蒄TP客戶端發(fā)起的,他使用一個大于1024的端口連接服務器的1024以上的某一個端口。如果從C/S模型這個角度來說,PORT對于服務器來說是OUTBOUND,而PASV模式對于服務器是INBOUND,這一點請?zhí)貏e注意,尤其是在使用防火墻的企業(yè)里,比如使用微軟的ISA Server 2000發(fā)布一個FTP服務器,這一點非常關鍵,如果設置錯了,那么客戶將無法連接。
最后,請注意在FTP客戶連接服務器的整個過程中,控制信道是一直保持連接的,而數(shù)據(jù)傳輸通道是臨時建立的。
在本文中,朗月繁星把重點放到了FTP的連接模式,沒有涉及FTP的其他內容,比如FTP的文件類型(Type),格式控制(Format control)以及傳輸方式(Transmission mode)等。不過這些規(guī)范大家可能不需要花費過多的時間去了解,因為現(xiàn)在流行的FTP客戶端都可以自動的選擇正確的模式來處理,對于FTP服務器端通常也都做了一些限制,如下
類型:A S C I I或圖像。
格式控制:只允許非打印。
結構:只允許文件結構。
傳輸方式:只允許流方式
至于這些內容,限于篇幅朗月繁星在這里就不想再介紹了。希望這篇文章能對大家有些幫助,特別是正在學習ISA Server2000的朋友和一些對FTP不很了解的朋友。
OK,就此駐筆了,希望大家與我交流。
起初, FTP并不是應用于IP網(wǎng)絡上的協(xié)議,而是ARPANEt網(wǎng)絡中計算機間的文件傳輸協(xié)議, ARPANET是美國國防部組建的老網(wǎng)絡,于1960-1980年使用。在那時, FTP的主要功能是在主機間高速可靠地傳輸文件。目前FTP仍然保持其可靠性,即使在今天,它還允許文件遠程存取。這使得用戶可以在某個系統(tǒng)上工作,而將文件存貯在別的系統(tǒng)。例如,如果某用戶運行Web服務器,需要從遠程主機上取得HTML文件和CGI程序在本機上工作,他需要從遠程存儲站點獲取文件(遠程站點也需安裝Web服務器)。當用戶完成工作后,可使用FTP將文件傳回到Web服務器。采用這種方法,用戶無需使用Telnet登錄到遠程主機進行工作,這樣就使Web服務器的更新工作變得如此的輕松。
FTP是TCP/IP的一種具體應用,它工作在OSI模型的第七層,TCP模型的第四層上,即應用層,使用TCP傳輸而不是UDP,這樣FTP客戶在和服務器建立連接前就要經過一個被廣為熟知的"三次握手"的過程,它帶來的意義在于客戶與服務器之間的連接是可靠的,而且是面向連接,為數(shù)據(jù)的傳輸提供了可靠的保證。
下面,讓我們來看看,一個FTP客戶在和服務器連接是怎么樣的一個過程(以標準的FTP端口號為例)。
首先,F(xiàn)TP并不像HTTP協(xié)議那樣,只需要一個端口作為連接(HTTP的默認端口是80,F(xiàn)TP的默認端口是21),F(xiàn)TP需要2個端口,一個端口是作為控制連接端口,也就是21這個端口,用于發(fā)送指令給服務器以及等待服務器響應;另一個端口是數(shù)據(jù)傳輸端口,端口號為20(僅PORT模式),是用來建立數(shù)據(jù)傳輸通道的,主要有3個作用
從客戶向服務器發(fā)送一個文件。
從服務器向客戶發(fā)送一個文件。
從服務器向客戶發(fā)送文件或目錄列表。
其次,F(xiàn)TP的連接模式有兩種,PORT和PASV。PORT模式是一個主動模式,PASV是被動模式,這里都是相對于服務器而言的。為了讓大家清楚的認識這兩種模式,朗月繁星分別舉例說明。
PORT模式
當FTP客戶以PORT模式連接服務器時,他動態(tài)的選擇一個端口號(本次試驗是6015)連接服務器的21端口,注意這個端口號一定是1024以上的,因為1024以前的端口都已經預先被定義好,被一些典型的服務使用,當然有的還沒使用,保留給以后會用到這些端口的資源服務。當經過TCP的三次握手后,連接(控制信道)被建立(如圖1和圖2)?,F(xiàn)在用戶要列出服務器上的目錄結構(使用ls或dir命令),那么首先就要建立一個數(shù)據(jù)通道,因為只有數(shù)據(jù)通道才能傳輸目錄和文件列表,此時用戶會發(fā)出PORT指令告訴服務器連接自己的什么端口來建立一條數(shù)據(jù)通道(這個命令由控制信道發(fā)送給服務器),當服務器接到這一指令時,服務器會使用20端口連接用戶在PORT指令中指定的端口號,用以發(fā)送目錄的列表(如圖3)。當完成這一操作時,F(xiàn)TP客戶也許要下載一個文件,那么就會發(fā)出get指令,請注意,這時客戶會再次發(fā)送PORT指令,告訴服務器連接他的哪個"新"端口,你可以先用netstat -na這個命令驗證,上一次使用的6044已經處于TIME_WAIT狀態(tài)(如圖4)。當這個新的數(shù)據(jù)傳輸通道建立后(在微軟的系統(tǒng)中,客戶端通常會使用連續(xù)的端口,也就是說這一次客戶端會用6045這個端口),就開始了文件傳輸?shù)墓ぷ鳌?BR> PASV模式
然而,當FTP客戶以PASV模式連接服務器時,情況就有些不同了。在初始化連接這個過程即連接服務器這個過程和PORT模式是一樣的,不同的是,當FTP客戶發(fā)送ls、dir、get等這些要求數(shù)據(jù)返回的命令時,他不向服務器發(fā)送PORT指令而是發(fā)送PASV指令,在這個指令中,用戶告訴服務器自己要連接服務器的某一個端口,如果這個服務器上的這個端口是空閑的可用的,那么服務器會返回ACK的確認信息,之后數(shù)據(jù)傳輸通道被建立并返回用戶所要的信息(根據(jù)用戶發(fā)送的指令,如ls、dir、get等);如果服務器的這個端口被另一個資源所使用,那么服務器返回UNACK的信息,那么這時,F(xiàn)TP客戶會再次發(fā)送PASV命令,這也就是所謂的連接建立的協(xié)商過程。為了驗證這個過程我們不得不借助CUTEFTP Pro這個大家經常使用的FTP客戶端軟件,因為微軟自帶的FTP命令客戶端,不支持PASV模式。雖然你可以使用QUOTE PASV這個命令強制使用PASV模式,但是當你用ls命令列出服務器目錄列表,你會發(fā)現(xiàn)它還是使用PORT方式來連接服務器的?,F(xiàn)在我們使用CUTEFTP Pro以PASV模式連接服務器(如圖5),請注意連接LOG里有這樣幾句話:
COMMAND:> PASV
227 Entering Passive Mode (127,0,0,1,26,108)
COMMAND:> LIST
STATUS:> Connecting ftp data socket 127.0.0.1: 6764...
125 Data connection already open; Transfer starting.
226 Transfer complete.
其中,
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里有這樣的記錄:
COMMAND:> PORT 127,0,0,1,28,37
200 PORT command successful.
COMMAND:> LIST
150 Opening ASCII mode data connection for /bin/ls.
STATUS:> Accepting connection: 127.0.0.1:20.
226 Transfer complete.
STATUS:> Transfer complete.
其中,
PORT 127,0,0,1,28,37告訴服務器當收到這個PORT指令后,連接FTP客戶的28x256+37=7205這個端口。
Accepting connection: 127.0.0.1:20表示服務器接到指令后用20端口連接7205端口,而且被FTP客戶接受。
比較分析
在這兩個例子中,請注意: PORT模式建立數(shù)據(jù)傳輸通道是由服務器端發(fā)起的,服務器使用20端口連接客戶端的某一個大于1024的端口;在PASV模式中,數(shù)據(jù)傳輸?shù)耐ǖ赖慕⑹怯蒄TP客戶端發(fā)起的,他使用一個大于1024的端口連接服務器的1024以上的某一個端口。如果從C/S模型這個角度來說,PORT對于服務器來說是OUTBOUND,而PASV模式對于服務器是INBOUND,這一點請?zhí)貏e注意,尤其是在使用防火墻的企業(yè)里,比如使用微軟的ISA Server 2000發(fā)布一個FTP服務器,這一點非常關鍵,如果設置錯了,那么客戶將無法連接。
最后,請注意在FTP客戶連接服務器的整個過程中,控制信道是一直保持連接的,而數(shù)據(jù)傳輸通道是臨時建立的。
在本文中,朗月繁星把重點放到了FTP的連接模式,沒有涉及FTP的其他內容,比如FTP的文件類型(Type),格式控制(Format control)以及傳輸方式(Transmission mode)等。不過這些規(guī)范大家可能不需要花費過多的時間去了解,因為現(xiàn)在流行的FTP客戶端都可以自動的選擇正確的模式來處理,對于FTP服務器端通常也都做了一些限制,如下
類型:A S C I I或圖像。
格式控制:只允許非打印。
結構:只允許文件結構。
傳輸方式:只允許流方式
至于這些內容,限于篇幅朗月繁星在這里就不想再介紹了。希望這篇文章能對大家有些幫助,特別是正在學習ISA Server2000的朋友和一些對FTP不很了解的朋友。
OK,就此駐筆了,希望大家與我交流。