馮媛媛++劉建科
摘要:FTP(File Transfer Protocol,文件傳輸協(xié)議) 是用于在網(wǎng)絡(luò)上進(jìn)行文件傳輸?shù)囊惶讟?biāo)準(zhǔn)協(xié)議。它屬于網(wǎng)絡(luò)協(xié)議組的應(yīng)用層。本文介紹在Linux平臺下建立的ftp客戶端的控制連接。
關(guān)鍵詞: 客戶端;服務(wù)器;控制連接;數(shù)據(jù)連接
中圖分類號:TP393 文獻(xiàn)標(biāo)識碼:A 文章編號:1009-3044(2016)20-0044-02
當(dāng)FTP運(yùn)行程序開始后,首先根據(jù)傳遞參數(shù)創(chuàng)建控制連接,用來和服務(wù)器進(jìn)行通信??刂七B接創(chuàng)建成功后,客戶依次向服務(wù)器發(fā)USER和PASS命令。
1 命令處理函數(shù)
支持的用戶命令主要分三種。
1)只在控制連接進(jìn)行通信。如delete,quit,mkdir,rmdir,pwd,rename等。
2)在控制連接進(jìn)行通信,在數(shù)據(jù)連接進(jìn)行數(shù)據(jù)傳輸。如put,get等。
3)不進(jìn)行網(wǎng)絡(luò)通信的。如help等。
2 單連接命令
這類命令比較容易,向服務(wù)器發(fā)送一個(gè)命令,然后接收響應(yīng)碼。實(shí)現(xiàn)方式基本上一樣,不同的是傳送給服務(wù)器的FTP命令不一樣。
函數(shù)模型:
1)對用戶命令進(jìn)行處理。
2)發(fā)送命令到服務(wù)器,并接收服務(wù)器響應(yīng)碼,根據(jù)響應(yīng)碼判斷命令是否成功。
其中cd發(fā)送給服務(wù)器的命令為CWD(將工作的路徑進(jìn)行改變),該命令可以在用戶登錄與賬戶狀態(tài)都保持不變的情況下運(yùn)行,在進(jìn)行數(shù)據(jù)或者是工作目錄下載或者是存儲的時(shí)候改變其原來的路徑。但是在這個(gè)過程中傳輸?shù)膮?shù)是不會變化的。傳輸參數(shù)就是指的特定目錄的路徑名稱或者是標(biāo)志其他文件的符號。
其中delete發(fā)送給服務(wù)器的命令為刪除指令,該指令的發(fā)出刪除的目標(biāo)路徑文件是從服務(wù)器的站點(diǎn)上進(jìn)行的。假設(shè)需要進(jìn)行特殊的保護(hù)(像是,在刪除時(shí)再次詢問),這個(gè)功能是user-FTP進(jìn)行提供的。
其中quit發(fā)送給服務(wù)器的命令為QUIT(退出現(xiàn)在的登錄模式)此指令是對一個(gè)用戶進(jìn)行終止活動,假設(shè)還用戶內(nèi)沒有正在運(yùn)行的文件時(shí),系統(tǒng)會直接將連接關(guān)閉控制,但是假設(shè)此時(shí)正在有數(shù)據(jù)傳輸,在傳輸?shù)玫交貞?yīng)以后系統(tǒng)連接關(guān)閉程序。
其中mkdir發(fā)送給服務(wù)器的命令為MKD(創(chuàng)建新的目錄):該指令是對目標(biāo)路徑創(chuàng)建新的目錄(這是在絕對路徑中)也或者是在相對路徑中對現(xiàn)在工作的路徑進(jìn)行新目錄的創(chuàng)建。
其中rmdir發(fā)送給服務(wù)器的命令為RMD(目錄刪除):在絕對的路徑下對目標(biāo)路徑進(jìn)行刪除或者是在相對的路徑中對現(xiàn)在正在運(yùn)行的工作子目錄進(jìn)行刪除。
其中pwd發(fā)送給服務(wù)器的命令為PWD(打印工作目錄):此指令在回應(yīng)中返回當(dāng)前工作目錄名。
其中rename發(fā)送給服務(wù)器的命令為RNFR和RNTO。
RNFR(重新命名):該指令是對原來的路徑名稱進(jìn)行重新命名。該指令在執(zhí)行時(shí)一定跟著一個(gè)重新命名的指令來說明新的名稱下的路徑名稱。
RNTO(重新命名以后):該指令是緊跟上面的指令說明新更改的路徑名稱的。在對文件進(jìn)行更名時(shí)需要上述兩個(gè)指令同時(shí)完成。
3 雙連接命令
這類命令除了要在控制連接進(jìn)行通信,還要在數(shù)據(jù)連接上傳輸數(shù)據(jù)。
根據(jù)FTP數(shù)據(jù)連接建立的不同形式,將工作形式分為兩種,一是Standard又叫做PORT方式該方式是主動形式,一種是Passive又叫做PASV是一種被動形式。FTP的服務(wù)器內(nèi)Standard模式下發(fā)送一個(gè)PORT指令到相應(yīng)的服務(wù)器上。FTP服務(wù)器內(nèi)Passive模式下發(fā)出一個(gè)PASV指令到相應(yīng)的服務(wù)器上。上兩種形式的工作原理如下所述:
在Port模式下客戶端會先于相關(guān)服務(wù)器上的TCP 21端口進(jìn)行連接,指令是借助該通道發(fā)出的,當(dāng)客戶端口接收到需要的數(shù)據(jù)時(shí)就需要通過這個(gè)端口發(fā)出一個(gè)POR的指令??蛻羰褂迷鯓拥亩丝诮邮障嚓P(guān)數(shù)據(jù)這是包含在PORT的指令內(nèi)的。數(shù)據(jù)的傳輸是通過服務(wù)器上自己的端口與客戶指定的端口連接實(shí)現(xiàn)數(shù)據(jù)的傳輸。在數(shù)據(jù)的傳輸過程中FTP服務(wù)器需要與客戶端構(gòu)建一個(gè)新連接實(shí)現(xiàn)數(shù)據(jù)的傳輸。連接過程如下:
1)所有跟FTP服務(wù)器的連接都要與21端口相連(客戶端的初始狀態(tài)是S<-C)
2)在FTP服務(wù)器上全部的21端口都比端口1024大(服務(wù)器連接客戶端的控制端口為S->C)
3)在 FTP服務(wù)器上所有的20端口都比端口1024大(服務(wù)器上與客戶端數(shù)據(jù)端口連接的最初端口值為S->C)
4)既比1024端口大又與服務(wù)器上的20端口相連接(服務(wù)器接受客戶端發(fā)送的ACK指令的數(shù)據(jù)端口為S<-C)
Passive模式與Standard模式在構(gòu)建控制通道上是具有相似性的,但是區(qū)別之處在于前者發(fā)出的是Pasv指令后者發(fā)送的是Prot指令。Pasv指令發(fā)送到服務(wù)器以后,任意打開一個(gè)級別比較高端的數(shù)據(jù)端口值大于1024的,同時(shí)要求客戶端發(fā)出請求數(shù)據(jù)的指令,服務(wù)器上的端口與客戶端口連接,服務(wù)器上的數(shù)據(jù)借助該通道進(jìn)行數(shù)據(jù)的傳輸,此時(shí)服務(wù)器上就不需要構(gòu)建一個(gè)與客戶端新的連接方式了。連接過程如下:
1)所有跟FTP服務(wù)器的連接都要與21端口相連(客戶端的初始狀態(tài)是S<-C)
2)在FTP服務(wù)器上全部的21端口都比端口1024大(服務(wù)器連接客戶端的控制端口為S->C)
3)隨便一個(gè)端口連接到任意一個(gè)比端口1024大的端口(服務(wù)器上與客戶端數(shù)據(jù)端口連接的最初端口值為S<-C)
4)服務(wù)器以及所有遠(yuǎn)程過程中大于端口1024的(服務(wù)器接受客戶端發(fā)送的ACK指令的數(shù)據(jù)端口為S->C)
ls命令執(zhí)行時(shí)首先判斷一下當(dāng)前客戶端采用的是主動模式還是被動模式。
主動模式下ls命令向服務(wù)器發(fā)送的命令依次如下:
PORT h1,h2,h3,h4,p1,p2
LIST
其中PORT命令將客戶端用來進(jìn)行數(shù)據(jù)連接的地址和端口傳送給服務(wù)器,然后服務(wù)器主動與客戶端建立數(shù)據(jù)連接。連接建立成功后,發(fā)送LIST命令,通知服務(wù)器發(fā)送文件列表,并在數(shù)據(jù)連接讀取服務(wù)器發(fā)來的文件列表。
被動模式下ls命令向服務(wù)器發(fā)送的命令依次如下:
PASV
LIST
其中PASV命令發(fā)出后,服務(wù)器會返回用來建立數(shù)據(jù)連接的服務(wù)器端的IP地址和端口,讓客戶端進(jìn)行連接,連接建立成功后,發(fā)送LIST命令,通知服務(wù)器發(fā)送文件列表,并在數(shù)據(jù)連接讀取服務(wù)器發(fā)來的文件列表。
對于PORT數(shù)據(jù)端口:連接數(shù)據(jù)的端口是借助該指令的參數(shù)實(shí)現(xiàn)的??蛻襞c服務(wù)器都對數(shù)據(jù)缺口比較缺省,并且通常下該指令不需要必須的相應(yīng)指令進(jìn)行回復(fù)。假設(shè)使用該指令那么相應(yīng)的參數(shù)是由主機(jī)的32位和端口的16位串聯(lián)而成。地址信息以每8位分為一組,每一組的值都是用十進(jìn)制數(shù)表示的,逗號將那個(gè)小組分開。例如端口的數(shù)據(jù)指令是PORT h1,h2,h3,h4,p1,p2。那么被動形式PASV:此指令在不缺省的端口等待連接的命令,并不是接到指令后馬上將數(shù)值初始化。服務(wù)器的主機(jī)以及端口的地址是該指令回應(yīng)所包含的內(nèi)容。LIST(列表):該指令指示服務(wù)器向DTP被動列表發(fā)送指令。假設(shè)對路徑名進(jìn)行明確的確定,那么服務(wù)器會將相關(guān)的路徑名稱發(fā)送到文件列表中。但是假設(shè)路徑確定的是文件,那么服務(wù)器傳輸?shù)男畔⒕褪俏募F(xiàn)在狀態(tài)的一個(gè)信息。不用參數(shù)就用現(xiàn)階段用戶的目錄或缺省的那部分目錄。
put和get命令實(shí)現(xiàn)方式和ls一樣,只是在數(shù)據(jù)連接建立成功后,發(fā)送給服務(wù)器的命令不一樣,分別STOR和RETR。
STOR(保存):是把server-DTP接收到的數(shù)據(jù)存儲成服務(wù)器站點(diǎn)上的文件的指令。倘若接收來的路徑文件在原服務(wù)器站點(diǎn)上已經(jīng)有了,那原有的文件就會被新接收的文件數(shù)據(jù)所替換。相反若是接收來的路徑文件原本沒有,這樣就會在服務(wù)站點(diǎn)重新建立一個(gè)存儲文件。
RETR(獲得文件):一個(gè)文件的副本用過這個(gè)指令用特定的路徑傳送到數(shù)據(jù)連的另一端。而原服務(wù)器站點(diǎn)的原文件狀態(tài)以及內(nèi)容不會發(fā)生變化。
4 無連接命令
這類命令不進(jìn)行任何網(wǎng)絡(luò)通信。其中help命令,僅僅打印出系統(tǒng)支持的命令。passive則是通過修改全局變量passivemode來改變FTP的工作方式。
5 結(jié)束語
上述為在運(yùn)行過程中客戶向服務(wù)器發(fā)出命令后接收支持用戶命令的三種狀態(tài)。
參考文獻(xiàn):
[1] Reynolds J, Request for Comments:959, Network Working Group, October 1985.
[2] Richard Stevens, Stephen A. Rago. Advanced Programming in the UNIX Environment: Second Edition, Addison Wesley Professional,2005.
[3] 謝希仁.計(jì)算機(jī)網(wǎng)絡(luò)[M].5版.電子工業(yè)出版社,2008.