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