標籤:ftp
FTP 是File Transfer Protocol(檔案傳輸通訊協定)的英文簡稱,而中文簡稱為“文傳協議”。用於Internet上的控制檔案的雙向傳輸。同時,它也是一個應用程式(Application)。基於不同的作業系統有不同的FTP應用程式,而所有這些應用程式都遵守同一種協議以傳輸檔案。在FTP的使用當中,使用者經常遇到兩個概念:"下載"(Download)和"上傳"(Upload)。"下載"檔案就是從遠程主機拷貝檔案至自己的電腦上;"上傳"檔案就是將檔案從自己的電腦中拷貝至遠程主機上。用Internet語言來說,使用者可通過客戶機程式向(從)遠程主機上傳(下載)檔案。
FTP伺服器
與大多數Internet服務一樣,FTP也是一個客戶機/伺服器系統。使用者通過一個支援FTP協議的客戶機程式,串連到在遠程主機上的FTP伺服器程式。使用者通過客戶機程式向伺服器程式發出命令,伺服器程式執行使用者所發出的命令,並將執行的結果返回到客戶機。比如說,使用者發出一條命令,要求伺服器向使用者傳送某一個檔案的一份拷貝,伺服器會響應這條命令,將指定檔案送至使用者的機器上。客戶機程式代表使用者接收到這個檔案,將其存放在使用者目錄中。
1)使用者授權
要連上 FTP 伺服器(即“登陸”),必須要有該 FTP 伺服器授權的帳號,也就是說你只有在有了一個使用者標識和一個口令後才能登陸FTP伺服器,享受FTP伺服器提供的服務。
2)FTP地址格式
FTP地址如下: ftp://使用者名稱:密碼@FTP伺服器IP或網域名稱:FTP命令連接埠/路徑/檔案名稱
上面的參數除FTP伺服器IP或網域名稱為必要項外,其他都不是必須的。如以下地址都是有效FTP地址:
ftp://foolish.6600.org
ftp://list:[email protected]
ftp://list:[email protected]:2003
ftp://list:[email protected]:2003/soft/list.txt
匿名FTP
使用FTP時必須首先登入,在遠程主機上獲得相應的許可權以後,方可下載或上傳檔案。也就是說,要想同哪一台電腦傳送檔案,就必須具有哪一台電腦的適當授權。換言之,除非有使用者ID和口令,否則便無法傳送檔案。這種情況違背了Internet的開放性,Internet上的FTP主機何止千萬,不可能要求每個使用者在每一台主機上都擁有帳號。匿名FTP就是為解決這個問題而產生的。
匿名FTP是這樣一種機制,使用者可通過它串連到遠程主機上,並從其下載檔案,而無需成為其註冊使用者。系統管理員建立了一個特殊的使用者ID,名為anonymous, Internet上的任何人在任何地方都可使用該使用者ID。
通過FTP程式串連匿名FTP主機的方式同串連普通FTP主機的方式差不多,只是在要求提供使用者標識ID時必須輸入anonymous,該使用者ID的口令可以是任意的字串。習慣上,用自己的E-mail地址作為口令,使系統維護程式能夠記錄下來誰在存取這些檔案。
值得注意的是,匿名FTP不適用於所有Internet主機,它只適用於那些提供了這項服務的主機。
當遠程主機提供匿名FTP服務時,會指定某些目錄向公眾開放,允許匿名存取。系統中的其餘目錄則處於隱匿狀態。作為一種安全措施,大多數匿名FTP主機都允許使用者從其下載檔案,而不允許使用者向其上傳檔案,也就是說,使用者可將匿名FTP主機上的所有檔案全部拷貝到自己的機器上,但不能將自己機器上的任何一個檔案拷貝至匿名FTP主機上。即使有些匿名FTP主機確實允許使用者上傳檔案,使用者也只能將檔案上傳至某一指定上傳目錄中。隨後,系統管理員會去檢查這些檔案,他會將這些檔案移至另一個公用下載目錄中,供其他使用者下載,利用這種方式,遠程主機的使用者得到了保護,避免了有人上傳有問題的檔案,如帶病毒的檔案。
預設情況下FTP協議使用TCP連接埠中的 20和21這兩個連接埠,其中20用於傳輸資料,21用於傳輸控制資訊。但是,是否使用20作為傳輸資料的連接埠與FTP使用的傳輸模式有關,如果採用主動模式,那麼資料轉送連接埠就是20;如果採用被動模式,則具體最終使用哪個連接埠要伺服器端和用戶端協商決定。
FTP協議的任務是從一台電腦將檔案傳送到另一台電腦,它與這兩台電腦所處的位置、聯結的方式、甚至是是否使用相同的作業系統無關。假設兩台電腦通過ftp協議對話,並且能訪問Internet,你可以用ftp命令來傳輸檔案。每種作業系統使用上有某一些細微差別,但是每種協議基本的命令結構是相同的。傳輸方式
FTP的傳輸有兩種方式:ASCII、二進位。
ASCII傳輸方式
假定使用者正在拷貝的檔案包含的簡單ASCII碼文本,如果在遠程機器上啟動並執行不是UNIX,當檔案傳輸時ftp通常會自動地調整檔案的內容以便於把檔案解釋成另外那台電腦儲存文字檔的格式。
但是常常有這樣的情況,使用者正在傳輸的檔案包含的不是文字檔,它們可能是程式,資料庫,文書處理檔案或者壓縮檔。在拷貝任何非文字檔之前,用binary 命令告訴ftp逐字拷貝。
二進位傳輸模式
在二進位傳輸中,儲存檔案的位序,以便原始和拷貝的是逐位一一對應的。即使目的地機器上包含位序列的檔案是沒意義的。例如,macintosh以二進位方式傳送可執行檔到Windows系統,在對方系統上,此檔案不能執行。
如在ASCII方式下傳輸二進位檔案,即使不需要也仍會轉譯。這會損壞資料。(ASCII方式一般假設每一字元的第一有效位無意義,因為ASCII字元組合不使用它。如果傳輸二進位檔案,所有的位都是重要的。)
支援模式
FTP支援兩種模式:Standard (PORT方式,主動方式),Passive (PASV,被動方式)。
Port模式
FTP 用戶端首先和伺服器的TCP 21連接埠建立串連,用來發送命令,用戶端需要接收資料的時候在這個通道上發送PORT命令。PORT命令包含了用戶端用什麼連接埠接收資料。在傳送資料的時候,伺服器端通過自己的TCP 20連接埠串連至用戶端的指定連接埠發送資料。FTP server必須和用戶端建立一個新的串連用來傳送資料。
Passive模式
建立控制通道和Standard模式類似,但建立串連後發送Pasv命令。伺服器收到Pasv命令後,開啟一個臨時連接埠(連接埠號碼大於1023小於65535)並且通知用戶端在這個連接埠上傳送資料的請求,用戶端串連FTP伺服器此連接埠,然後FTP伺服器將通過這個連接埠傳送資料。
很多防火牆在設定的時候都是不允許接受外部發起的串連的,所以許多位於防火牆後或內網的FTP伺服器不支援PASV模式,因為用戶端無法穿過防火牆開啟FTP伺服器的高端連接埠;而許多內網的用戶端不能用PORT模式登陸FTP伺服器,因為從伺服器的TCP 20無法和內部網路的用戶端建立一個新的串連,造成無法工作。
主動和被動模式FTP有兩種使用模式:主動和被動。主動模式要求用戶端和伺服器端同時開啟並且監聽一個連接埠以建立串連。在這種情況下,用戶端由於安裝了防火牆會產生一些問題。所以,創立了被動模式。被動模式只要求伺服器端產生一個監聽相應連接埠的進程,這樣就可以繞過用戶端安裝了防火牆的問題。
一個主動模式的FTP串連建立要遵循以下步驟:
1.用戶端開啟一個隨機的連接埠(連接埠號碼大於1024,在這裡,我們稱它為x),同時一個FTP進程串連至伺服器的21號命令連接埠。此時,源連接埠為隨機連接埠x,在用戶端,遠程連接埠為21,在伺服器。
2.用戶端開始監聽連接埠(x+1),同時向伺服器發送一個連接埠命令(通過伺服器的21號命令連接埠),此命令告訴伺服器用戶端正在監聽的連接埠號碼並且已準備好從此連接埠接收資料。這個連接埠就是我們所知的資料連接埠。
3.伺服器開啟20號源連接埠並且建立和用戶端資料連接埠的串連。此時,源連接埠為20,遠端資料連接埠為(x+1)。
5.用戶端通過本地的資料連接埠建立一個和伺服器20號連接埠的串連,然後向伺服器發送一個應答,告訴伺服器它已經建立好了一個串連。
FXP
FXP說簡單點就是一個FTP用戶端控制兩個FTP伺服器,在兩個FTP伺服器之間傳送檔案。FXP的全稱為File Exchange Protocol――檔案交換協議,可以認為FXP本身其實就是FTP的一個子集,因為FXP方式實際上就是利用了FTP伺服器的Proxy命令,不過它的前提條件是FTP伺服器要支援PASV,且支援FXP方式。FXP傳送時,檔案並不下載至本地,本地只是發送控制命令,故FXP傳送時的速度只與兩個FTP伺服器之間的網路速度有關,而與本地速度無關。因FXP方式本地只發送命令,故在開始傳送後,只要本地不發送停止的命令,就算是本地關機了,FXP仍在傳送,直至一個檔案傳送完成或檔案傳送出錯後,FTP伺服器等待本地發送命令時,才會因不能接收到命令而終止FXP傳送。
因為上述的原因,FXP傳送出錯時,本地的使用者進程還留在FTP伺服器中,並沒有退出,如此時再次串連FTP伺服器,可能會因使用者線程超過允許,FTP伺服器提示客戶已登陸並拒絕用戶端的串連,直至伺服器中的傀儡進程因逾時或其他原因被FTP伺服器殺死後,才能再次串連FTP伺服器。
成功FXP有兩個必要條件:①兩個FTP伺服器均支援FXP;②兩個FTP伺服器均支援PASV方式。但並不是說滿足這兩個條件的FTP伺服器均經本地操作成功FXP,這還與本地與FTP伺服器的網路狀況有關。故有時會出現同樣兩個FTP,別人可以FXP,而你不可以的情況。
TFTP
TFTP(Trivial File Transfer Protocol)小檔案傳輸通訊協定
它是一個網路應用程式,它比FTP簡單也比FTP功能少。它在不需要使用者權限或目錄可見的情況下使用,它使用UDP協議而不是TCP協議。
TFTP是一個傳輸檔案的簡單協議,它基於UDP協議而實現,但是我們也不能確定有些TFTP協議是基於其它傳輸協議完成的。此協議設計的時候是進行小檔案傳輸的,因此它不具備通常的FTP的許多功能,它只能從檔案伺服器上獲得或寫入檔案,不能列出目錄,不進行認證,它傳輸8位元據。傳輸中有三種模式:netascii,這是8位的ASCII碼形式,另一種是octet,這是8位來源資料類型;最後一種mail已經不再支援,它將返回的資料直接返回給使用者而不是儲存為檔案。
任何傳輸起自一個讀取或寫入檔案的請求,這個請求也是串連請求。如果伺服器批准此請求,則伺服器開啟串連,資料以定長512位元組傳輸。每個資料包包括一塊資料,伺服器發出下一個資料包以前必須得到客戶對上一個資料包的確認。如果一個資料包的大小小於512位元組,則表示傳輸結構。如果資料包在傳輸過程中丟失,發出方會在逾時後重新傳輸最後一個未被確認的資料包。通訊的雙方都是資料的發出者與接收者,一方傳輸資料接收應答,另一方發出應答接收資料。大部分的錯誤會導致串連中斷,錯誤由一個錯誤的資料包引起。這個包不會被確認,也不會被重新發送,因此另一方無法接收到。如果錯誤包丟失,則使用逾時機制。錯誤主要是由下面三種情況引起的:不能滿足請求,收到的資料包內容錯誤,而這種錯誤不能由延時或重發解釋,對需要資源的訪問丟失(如硬碟滿)。TFTP只在一種情況下不中斷串連,這種情況是源連接埠不正確,在這種情況下,指示錯誤的包會被發送到源機。這個協議限制很多,這是都是為了實現起來比較方便而進行的。
Linux下常用FTP命令:
1. 串連ftp伺服器
格式:ftp [hostname| ip-address]
a)在linux命令列下輸入:
ftp 192.168.1.1
b)伺服器詢問你使用者名稱和密碼,分別輸入使用者名稱和相應密碼,待認證通過即可。
2. 下載檔案
下載檔案通常用get和mget這兩條命令。
a) get
格式:get [remote-file] [local-file]
將檔案從遠端主機中傳送至本地主機中。
如要擷取遠程伺服器上/usr/your/1.htm,則
ftp> get /usr/your/1.htm 1.htm (斷行符號)
b) mget
格式:mget [remote-files]
從遠端主機接收一批檔案至本地主機。
如要擷取伺服器上/usr/your/下的所有檔案,則
ftp> cd /usr/your/
ftp> mget *.* (斷行符號)
此時每下載一個檔案,都會有提示。如果要除掉提示,則在mget *.* 命令前先執行:prompt off
注意:檔案都下載到了linux主機的目前的目錄下。比如,在 /usr/my下啟動並執行ftp命令,則檔案都下載到了/usr/my下。
3.上傳檔案
a) put
格式:put local-file [remote-file]
將本地一個檔案傳送至遠端主機中。
如要把本地的1.htm傳送到遠端主機/usr/your,並改名為2.htm
ftp> put 1.htm /usr/your/2.htm (斷行符號)
b) mput
格式:mput local-files
將本地主機中一批檔案傳送至遠端主機。
如要把本地目前的目錄下所有html檔案上傳到伺服器/usr/your/ 下
ftp> cd /usr/your (斷行符號)
ftp> mput *.htm (斷行符號)
注意:上傳檔案都來自於主機的目前的目錄下。比如,在 /usr/my下啟動並執行ftp命令,則只有在/usr/my下的檔案linux才會上傳到伺服器/usr/your 下。
4. 中斷連線
bye:中斷與伺服器的串連。
ftp> bye (斷行符號)
實現編碼前需知:
相比其他協議,如 HTTP 協議,FTP 協議要複雜一些。與一般的 C/S 應用不同點在於一般的C/S 應用程式一般只會建立一個 Socket 串連,這個串連同時處理伺服器端和用戶端的串連命令和資料轉送。而FTP協議中將命令與資料分開傳送的方法提高了效率。
FTP 使用 2 個連接埠,一個資料連接埠和一個命令連接埠(也叫做控制連接埠)。這兩個連接埠一般是21 (命令連接埠)和 20 (資料連接埠)。控制 Socket 用來傳送命令,資料 Socket 是用於傳送資料。每一個 FTP 命令發送之後,FTP 伺服器都會返回一個字串,其中包括一個響應代碼和一些說明資訊。其中的返回碼主要是用於判斷命令是否被成功執行了。
命令連接埠
一般來說,用戶端有一個 Socket 用來串連 FTP 伺服器的相關連接埠,它負責 FTP 命令的發送和接收返回的響應資訊。一些操作如“登入”、“改變目錄”、“刪除檔案”,依靠這個串連發送命令就可完成。
資料連接埠
對於有資料轉送的操作,主要是顯示目錄列表,上傳、下載檔案,我們需要依靠另一個 Socket來完成。
如果使用被動模式,通常伺服器端會返回一個連接埠號碼。用戶端需要用另開一個 Socket 來串連這個連接埠,然後我們可根據操作來發送命令,資料會通過新開的一個連接埠傳輸。
如果使用主動模式,通常用戶端會發送一個連接埠號碼給伺服器端,並在這個連接埠監聽。伺服器需要串連到用戶端開啟的這個資料連接埠,並進行資料的傳輸。
主要用到的 FTP 命令
FTP 每個命令都有 3 到 4 個字母組成,命令後面跟參數,用空格分開。每個命令都以 "\r\n"結束。
要下載或上傳一個檔案,首先要登入 FTP 伺服器,然後發送命令,最後退出。這個過程中,主要用到的命令有 USER、PASS、SIZE、REST、CWD、RETR、PASV、PORT、QUIT。
USER: 指定使用者名稱。通常是控制串連後第一個發出的命令。“USER gaoleyi\r\n”: 使用者名稱為gaoleyi 登入。
PASS: 指定使用者密碼。該命令緊跟 USER 命令後。“PASS gaoleyi\r\n”:密碼為 gaoleyi。
SIZE: 從伺服器上返回指定檔案的大小。“SIZE file.txt\r\n”:如果 file.txt 檔案存在,則返回該檔案的大小。
CWD: 改變工作目錄。如:“CWD dirname\r\n”。
PASV: 讓伺服器在資料連接埠監聽,進入被動模式。如:“PASV\r\n”。
PORT: 告訴 FTP 伺服器用戶端監聽的連接埠號碼,讓 FTP 伺服器採用主動模式串連用戶端。如:“PORT h1,h2,h3,h4,p1,p2”。
RETR: 下載檔案。“RETR file.txt \r\n”:下載檔案 file.txt。
STOR: 上傳檔案。“STOR file.txt\r\n”:上傳檔案 file.txt。
REST: 該命令並不傳送檔案,而是略過指定點後的資料。此命令後應該跟其它要求檔案傳輸的 FTP 命令。“REST 100\r\n”:重新指定檔案傳送的位移量為 100 位元組。
QUIT: 關閉與伺服器的串連。
FTP 響應碼
用戶端發送 FTP 命令後,伺服器返迴響應碼。
響應碼用三位元字編碼錶示:
第一個數字給出了命令狀態的一般性指示,比如響應成功、失敗或不完整。
第二個數字是響應類型的分類,如 2 代表跟串連有關的響應,3 代表使用者認證。
第三個數字提供了更加詳細的資訊。
第一個數位含義如下:
1 表示伺服器正確接收資訊,還未處理。
2 表示伺服器已經正確處理資訊。
3 表示伺服器正確接收資訊,正在處理。
4 表示資訊暫時錯誤。
5 表示資訊永久錯誤。
第二個數位含義如下:
0 表示文法。
1 表示系統狀態和資訊。
2 表示串連狀態。
3 表示與使用者認證有關的資訊。
4 表示未定義。
5 表示與檔案系統有關的資訊。
Socket 編程的幾個重要步驟
Socket 用戶端編程主要步驟如下:
socket() 建立一個 Socket
connect() 與伺服器串連
write() 和 read() 進行會話
close() 關閉 Socket
Socket 伺服器端編程主要步驟如下:
socket() 建立一個 Socket
bind()
listen() 監聽
accept() 接收串連的請求
write() 和 read() 進行會話
close() 關閉 Socket
實現 FTP 用戶端上傳下載功能
下面讓我們通過一個例子來對 FTP 用戶端有一個深入的瞭解。本文實現的 FTP 用戶端有下列功能:
用戶端和 FTP 伺服器建立 Socket 串連。
向伺服器發送 USER、PASS 命令登入 FTP 伺服器。
使用 PASV 命令得到伺服器監聽的連接埠號碼,建立資料連線。
使用 RETR/STOR 命令下載/上傳檔案。
在下載完畢後斷開資料連線並發送 QUIT 命令退出。
在整個互動的過程中,控制串連始終處於串連的狀態,資料連線在每傳輸一個檔案時先開啟,後關閉。
用戶端和 FTP 伺服器建立 Socket 串連
當用戶端與伺服器建立串連後,伺服器會返回 220 的響應碼和一些歡迎資訊。
用戶端登入 FTP 伺服器
當用戶端發送使用者名稱和密碼,伺服器驗證通過後,會返回 230 的響應碼。然後用戶端就可以向伺服器端發送命令了。
用戶端讓 FTP 伺服器進入被動模式
當用戶端在下載/上傳檔案前,要先發送命令讓伺服器進入被動模式。伺服器會開啟資料連接埠並監聽。並返迴響應碼 227 和資料連線的連接埠號碼。
用戶端通過被動模式下載檔案
當用戶端發送命令下載檔案。伺服器會返迴響應碼 150,並向資料連線傳送檔案內容。
用戶端退出伺服器
當用戶端下載完畢後,發送命令退出伺服器,並關閉串連。伺服器會返迴響應碼 200。
需要注意的是發送 FTP 命令的時候,在命令後要緊跟 “\r\n”,否則伺服器不會返回資訊。斷行符號分行符號號 “\r\n” 是 FTP 命令的結尾符號,當伺服器接收到這個符號時,認為用戶端發送的命令已經結束,開始處理。否則會繼續等待。
用戶端通過被動模式向伺服器上傳檔案
當用戶端發送命令上傳檔案,伺服器會從資料連線接收檔案。
用戶端通過主動模式向伺服器上傳檔案
到目前為止,本文介紹的都是用戶端用被動模式進行檔案的上傳和下載。下面將介紹用戶端用主動模式下載檔案。
本文出自 “小止” 部落格,請務必保留此出處http://10541556.blog.51cto.com/10531556/1818256
FTP-------應用程式層協議