FTP協議
一、概述
F T P採用兩個T C P連接來傳輸一個文件:
1) 控制連接以通常的客戶服務器方式建立。服務器以被動方式打開衆所周知的用於FTP的端口(21),等待客戶的連接。客戶則以主動方式打開TCP端口21,來建立連接。控制連接始終等待客戶與服務器之間的通信。該連接將命令從客戶傳給服務器,並傳回服務器的應答。由於命令通常是由用戶鍵入的,所以IP對控制連接的服務類型就是“最大限度地減小遲延”。
2) 每當一個文件在客戶與服務器之間傳輸時,就創建一個數據連接。(其他時間也可以創建,後面我們將說到)。由於該連接用於傳輸目的,所以IP對數據連接的服務特點就是“最大限度提高吞吐量”。
二、數據表示
FTP協議規範提供了控制文件傳送與存儲的多種選擇。在以下四個方面中每一個方面都必
須作出一個選擇。
1.文件類型
(a)ASCII碼文件類型(默認選擇)文本文件以NVT ASCII碼形式在數據連接中傳輸。這要求發方將本地文本文件轉換成NVT ASCII碼形式,而收方則將NVT ASCII碼再還原成本地文本文件。其中,用NVT ASCII碼傳輸的每行都帶有一個回車,而後是一個換行。這意味着收方必須掃描每個字節,查找CR、LF對。
(b)EBCDIC文件類型該文本文件傳輸方式要求兩端都是EBCDIC系統。
(c)圖像文件類型(也稱爲二進制文件類型)數據發送呈現爲一個連續的比特流。通常用於傳輸二進制文件。
(d)本地文件類型該方式在具有不同字節大小的主機間傳輸二進制文件。每一字節的比特數由發方規定。對使用8 bit字節的系統來說,本地文件以8 bit字節傳輸就等同於圖像文件傳輸。
2.格式控制
該選項只對ASCII和EBCDIC文件類型有效。
(a) 非打印(默認選擇)文件中不含有垂直格式信息。
(b) 遠程登錄格式控制文件含有向打印機解釋的遠程登錄垂直格式控制。
(c) Fortran 回車控制每行首字符是Fortran格式控制符。
3. 結構
(a) 文件結構(默認選擇)文件被認爲是一個連續的字節流。不存在內部的文件結構。
(b) 記錄結構該結構只用於文本文件(ASCII或EBCDIC)。
(c) 頁結構每頁都帶有頁號發送,以便收方能隨機地存儲各頁。該結構由TOPS-20操作系統提供(主機需求RFC不提倡採用該結構)。
4. 傳輸方式
它規定文件在數據連接中如何傳輸。
(a) 流方式(默認選擇)文件以字節流的形式傳輸。對於文件結構,發方在文件尾提示關閉數據連接。對於記錄結構,有專用的兩字節序列碼標誌記錄結束和文件結束。
(b) 塊方式文件以一系列塊來傳輸,每塊前面都帶有一個或多個首部字節。
(c) 壓縮方式一個簡單的全長編碼壓縮方法,壓縮連續出現的相同字節。在文本文件中常用來壓縮空白串,在二進制文件中常用來壓縮0字節(這種方式很少使用,也不受支持。
現在有一些更好的文件壓縮方法來支持FTP)。
如果算一下所有這些選擇的排列組合數,那麼對傳輸和存儲一個文件來說就有72種不同
的方式。幸運的是,其中很多選擇不是廢棄了,就是不爲多數實現環境所支持,所以我們可
以忽略掉它們。
通常由Unix實現的FTP 客戶和服務器把我們的選擇限制如下:
• 類型:ASCII或圖像。
• 格式控制:只允許非打印。
• 結構:只允許文件結構。
• 傳輸方式:只允許流方式。
這就限制我們只能取一、兩種方式: ASCII或圖像(二進制)。
該實現滿足主機需求RFC的最小需求(該RFC也要求能支持記錄結構,但只有操作系統
支持它才行,而Unix不行)。
很多非Unix的實現提供了處理它們自己文件格式的FTP功能。主機需求RFC指出“FTP協議有很多特徵,雖然其中一些通常不實現,但對FTP中的每一個特徵來說,都存在着至少一種實現”。
5. 連接管理
數據連接有以下三大用途:
1) 從客戶向服務器發送一個文件。
2) 從服務器向客戶發送一個文件。
3) 從服務器向客戶發送文件或目錄列表。
FTP服務器把文件列表從數據連接上發回,而不是控制連接上的多行應答。這就避免了行
的有限性對目錄大小的限制,而且更易於客戶將目錄列表以文件形式保存,而不是把列表顯
示在終端上。
我們已說過,控制連接一直保持到客戶-服務器連接的全過程,但數據連接可以根據需要
隨時來,隨時走。那麼需要怎樣爲數據連接選端口號,以及誰來負責主動打開和被動打開?
首先,我們前面說過通用傳輸方式(Unix環境下唯一的傳輸方式)是流方式,並且文件
結尾是以關閉數據連接爲標誌。這意味着對每一個文件傳輸或目錄列表來說都要建立一個全
新的數據連接。其一般過程如下:
1) 正由於是客戶發出命令要求建立數據連接,所以數據連接是在客戶的控制下建立的。
2) 客戶通常在客戶端主機上爲所在數據連接端選擇一個臨時端口號。客戶從該端口發佈
一個被動的打開。
3) 客戶使用PORT命令從控制連接上把端口號發向服務器。
4) 服務器在控制連接上接收端口號,並向客戶端主機上的端口發佈一個主動的打開。服
務器的數據連接端一直使用端口20。
服務器總是執行數據連接的主動打開。通常服務器也執行數據連接的主動關閉,除非當
客戶向服務器發送流形式的文件時,需要客戶來關閉連接(它給服務器一個文件結束的通
知)。
客戶也有可能不發出PORT命令,而由服務器向正被客戶使用的同一個端口號發出主動打
開,來結束控制連接。這是可行的,因爲服務器面向這兩個連接的端口號是不同的:一個是
20,另一個是21。
6. 命令與應答
本節主要討論命令格式。命令對大小寫不敏感。命令通常由命令碼和相應的參數組成。中間由一個或幾個空格分開。參數域由<CRLF>結束,服務器在未接收到行結束符時不會採取任何動作。下面描述的格式是以NVT-ASCII以準的,方括號代表可選的參數域,如果未選擇可選的參數域則採用默認值。
6.1 FTP命令格式
下面是FTP命令,其中username代表用戶名,password代表口令,pathname代表路徑名,host-port代表主機端口,account-information代表帳戶信息,typecode代表類型代碼,decimal-integer代表十進制整數,marker代表標記,string代表字符串:
USER <SP> <username> <CRLF>
PASS <SP> <password> <CRLF>
ACCT <SP> <account-information> <CRLF>
CWD <SP> <pathname> <CRLF>
CDUP <CRLF>
SMNT <SP> <pathname> <CRLF>
QUIT <CRLF>
REIN <CRLF>
PORT <SP> <host-port> <CRLF>
PASV <CRLF>
TYPE <SP> <type-code> <CRLF>
STRU <SP> <structure-code> <CRLF>
MODE <SP> <mode-code> <CRLF>
RETR <SP> <pathname> <CRLF>
STOR <SP> <pathname> <CRLF>
STOU <CRLF>
APPE <SP> <pathname> <CRLF>
ALLO <SP> <decimal-integer>
[<SP> R <SP> <decimal-integer>] <CRLF>
REST <SP> <marker> <CRLF>
RNFR <SP> <pathname> <CRLF>
RNTO <SP> <pathname> <CRLF>
ABOR <CRLF>
DELE <SP> <pathname> <CRLF>
RMD <SP> <pathname> <CRLF>
MKD <SP> <pathname> <CRLF>
PWD <CRLF>
LIST [<SP> <pathname>] <CRLF>
NLST [<SP> <pathname>] <CRLF>
SITE <SP> <string> <CRLF>
SYST <CRLF>
STAT [<SP> <pathname>] <CRLF>
HELP [<SP> <string>] <CRLF>
NOOP <CRLF>
6.1.1 訪問控制命令
下列命令指定訪問控制標記(命令碼在括號內):
用戶名(USER)
參數是標記用戶的Telnet串。用戶標記是訪問服務器必須的,此命令通常是控制連接後第一個發出的命令,有些主機還會要求口令和帳戶。服務器可以在任何時間接收新的USER命令以改變訪問控制和(或)帳戶信息。這可以重新開始登錄過程,所以傳輸參數不變,在進行中的文件傳輸在過去的訪問控制參數下完成。
口令(PASS)
參數是標記用戶口令的Telnet串。此命令緊跟USER命令,在某些站點它是完成訪問控制不可缺少的一步。因此口令是個重要的東西,因此不能顯示出來,服務器方沒有辦法隱藏口令,所以這一任務得由用戶FTP進程完成。
ACCOUNT (ACCT)
參數是標記用戶帳戶的Telnet串。此命令不需要與USER相關,一些站點可能需要帳戶用於登錄,另一些可以限制帳戶的權限,在後一種情況下,此命令可在任何時候發送。應答的不同可以區別不同的情況:當登錄需要帳戶信息時,對PASS命令的響應是332。另外,如果不需要帳戶信息,對PASS的響應是230,如果需要帳戶信息在以後需要,服務器會返回332或532,這要看它是保存此命令還是拒絕此命令了。
改變工作目錄(CWD)
此命令使用戶可以在不同的目錄或數據集下工作而不用改變它的登錄或帳戶信息。傳輸參數也不變。參數一般是目錄名或與系統相關的文件集合。
回到上一層目錄(CDUP)
此命令要求系統實現目錄樹結構,它的響應和CWD的相同。
結構加載(SMNT)
此命令使用戶在不改變登錄或帳戶信息的情況下加載另一個文件系統數據結構。傳輸參數也不變。參數是文件目錄或與系統相關的文件集合。
重新初始化(REIN)
此命令終止USER,將所有I/O和帳戶信息寫入,但不許進行中的數據傳輸完成。重置所有參數,控制連接打開,可以再次開始USER命令。
退出登錄(QUIT)
此命令終止USER,如果沒有數據傳輸,服務器關閉控制連接;如果有數據傳輸,在得到傳輸響應後服務器關閉控制連接。如果用戶進程正在向不同的USER傳輸數據,不希望對每個USER關閉然後再打開,可以使用REIN。對控制連接的意外關閉,可以導致服務器運行中止
(ABOR)和退出登錄(QUIT)。
6.1.2 傳輸參數命令
所有數據傳輸參數有默認值。服務器必須記錄下默認值,在FTP服務請求後,可以以任何順序發送。下面命令傳送參數:
數據端口(PORT)
參數是要使用的數據連接端口,通常情況下對此不需要命令響應。如果使用此命令時,要發送32位的IP地址和16位的TCP端口號。上面的信息以8位爲一組,逗號間隔十進制傳輸,如下例:
PORT h1,h2,h3,h4,p1,p2
其中h1是IP地址的最高8位。
被動(PASV)
此命令要求服務器DTP在指定的數據端口偵聽,進入被動接收請求的狀態,參數是主機和端口地址。
表示類型(TYPE)
參數指定表示類型。有些類型需要第二個參數,第一個參數由單個Telnet字符定義,第二個參數是十進制整數指定字節大小,參數間以<SP>分隔。下面是格式:
默認表示類型是ASCII非打印字符,如果參數未改變,以後只改變了第一個參數,則使用默認值。
文件結構(STRU)
參數是一個Telnet字符代碼指定文件結構。下面是代碼及其意義:
F - 文件(非記錄結構),它是默認值
R - 記錄結構
P - 頁結構
傳輸模式(MODE)
參數是一個Telnet字符代碼指定傳輸模式。下面是代碼及其意義:
S - 流(默認值)
B - 塊
C - 壓縮
6.1.3 FTP服務命令
FTP服務命令定義用戶請求的文件傳輸或文件系統功能。此命令的參數通常是路徑名,其語法要和服務器的規範一致。推薦的默認值是最近指定的設備目錄或目錄。命令順序通常沒有限制,只有"rename from"命令後面必須是"rename to",重新啓動命令後面必須是中斷服務命令。服務命令的響應通常在數據連接上傳輸。下面是具體的命令:
獲得文件(RETR)
此命令使服務器DTP傳送指定路徑內的文件複本到服務器或用戶DTP。這邊服務器上文件的狀態和內容不受影響。
保存(STOR)
此命令使服務器DTP接收數據連接上傳送過來的數據,並將數據保存在服務器的文件中。如果文件已存在,原文件將被覆蓋。如果文件不存在,則新建文件。
唯一保存(STOU)
此命令和STOR差不多,此命令要求在此目錄下的文件名是唯一的,對此命令的響應必須包括產生的用戶名。
附加(APPE)
它和STOR的功能差不多,但是如果文件在指定路徑內已存在,則把數據附加到原文件尾部,如果不存在則新建文件。
分配(ALLO)
此命令用於在一些主機上爲新傳送的文件分配足夠的存儲空間。參數是十進制的邏輯字節數。如果是記錄或頁結構,頁或記錄的最大大小也需要,這在第二個參數內以十進制指定。第二個參數是可選的,如果有它,它和第一個參數以Telnet字符<SP> R <SP>分隔。此命令在STOR或APPE命令後,對於不需要分配存儲空間的機器,它的作用等於NOOP。
重新開始(REST)
參數域代表服務器要重新開始的那一點,此命令並不傳送文件,而是略過指定點後的數據,此命令後應該跟其它要求文件傳輸的FTP命令。
重命名(RNFR)
這個命令和我們在其它操作系統中使用的一樣,只不過後面要跟"rename to"指定新的文件名。
重命名爲(RNTO)
此命令和上面的命令共同完成對文件的重命名。
放棄(ABOR)
此命令通知服務中止以前的FTP命令和與之相關的數據傳送。如果先前的操作已經完成,則沒有動作,返回226。如果沒有完成,返回426,然後再返回226。關閉控制連接,數據連接不關閉。
刪除(DELE)
此命令刪除指定路徑下的文件。用戶進程負責對刪除的提示。
刪除目錄(RMD)
此命令刪除目錄。
創建目錄(MKD)
此命令在指定路徑下創建新目錄。
打印工作目錄(PWD)
在響應是返回當前工作目錄。
列表(LIST)
服務器傳送列表到被動DTP,如果路徑指定一個目錄或許多文件,返回指定路徑下的文件列表。如果路徑名指定一個文件,服務器返回文件的當前信息,參數爲空表示用戶當前的工作目錄或默認目錄。數據傳輸在ASCII或EBCDIC下進行,用戶必須確認這一點。因爲文件信息因系統不同而不同,所以不可能被程序自動利用,但是人類用戶卻很需要。
名字列表(NLST)
服務器傳送目錄表名到用戶,路徑名應指定目錄或其它系統指定的文件羣描述子;空參數指當前目錄。服務器返回文件名數據流,以ASCII或EBCDIC形式傳送,並以<CRLF>或<NL>分隔。這裏返回的信息有時可以供程序進行進一步處理。
站點參數(SITE)
服務器用來提供服務器系統信息,信息因系統不同而不同,格式在HELP SITE命令應答中給出。
系統(SYST)
用於確定服務器上運行的操作系統。
狀態(STAT)
此命令返回控制連接狀態,它可以在文件傳送過程中發送,服務器返回操作進行的狀態。也可以在文件傳送之間發送,這時命令有參數,參數是路徑名,此命令的功能除了數據在控制連接上傳送以外和列表命令相似。如果指定部分路徑,服務器以文件名或與說明相關的屬性返回;如沒有參數,服務器返回服務器FTP進程的狀態信息,包括傳輸參數的當前值和連接狀態。
幫助(HELP)
這條命令我們在平常系統中得到的幫助沒有什麼區別,響應類型是211或214。建議在使用USER命令前使用此命令。
等待(NOOP)
此命令不產生什麼實際動作,它僅使服務器返回OK。
FTP在控制連接上使用Telnet通信,因此有機會大家可以看看相關的協議說明。對下文的理解會很有好處。下面內容將對命令的應答和關於命令的詳細信息作以說明。FTP命令可分爲訪問控制標記,數據傳輸參數或FTP服務請求,特定的命令(如ABOR,STAT)可以在數據傳輸過程中在控制連接上傳輸。有些服務器不能同時監視數據和控制鏈路,那就要另外採取措施了。請注意下面的幾點建議:
1. 用戶系統將Telnet的"Interrupt Process"(IP)信息插入Telnet流;
2. 用戶系統發送Telnet的"Synch"信號;
3. 用戶系統將命令(如ABOR)插入Telnet流;
4. 服務器PI在接收到IP後,在Telnet流中尋找僅有一個的FTP命令。
6.2 FTP命令參數
下面是用BNF範式表示的參數格式:
<username> ::= <string>
<password> ::= <string>
<account-information> ::= <string>
<string> ::= <char> | <char><string>
<char> ::= 除<CR>和<LF>外的所有ASCII字符
<marker> ::= <pr-string>
<pr-string> ::= <pr-char> | <pr-char><pr-string>
<pr-char> ::= 可打印ASCII字符,從33到126
<byte-size> ::= <number>
<host-port> ::= <host-number>,<port-number>
<host-number> ::= <number>,<number>,<number>,<number>
<port-number> ::= <number>,<number>
<number> ::= 從1到255的十進制整數
<form-code> ::= N | T | C
<type-code> ::= A [<sp> <form-code>]| E [<sp> <form-code>]| I| L <sp> <byte-size>
<structure-code> ::= F | R | P
<mode-code> ::= S | B | C
<pathname> ::= <string>
<decimal-integer> ::= 任何十進制整數
6.3 FTP應答
應答都是ASCII碼形式的3位數字,並跟有報文選項。其原因是軟件系統需要根據數字代碼來決定如何應答,而選項串是面向人工處理的。由於客戶通常都要輸出數字應答和報文串,一個可交互的用戶可以通過閱讀報文串(而不必記憶所有數字回答代碼的含義)來確定應答的含義。應答3位碼中每一位數字都有不同的含義。
給出了應答代碼第1位和第2位的含義。
應答說明
1yz 肯定預備應答。它僅僅是在發送另一個命令前期待另一個應答時啓動
2yz 肯定完成應答。一個新命令可以發送
3yz 肯定中介應答。該命令已被接受,但另一個命令必須被髮送
4yz 暫態否定完成應答。請求的動作沒有發生,但差錯狀態是暫時的,所以命令可以過後再發
5yz 永久性否定完成應答。命令不被接受,並且不再重試
x0z 語法錯誤
x1z 信息
x2z 連接。應答指控制或數據連接
x3z 鑑別和記帳。應答用於註冊或記帳命令
x4z 未指明
x5z 文件系統狀態
第3位數字給出差錯報文的附加含義。例如,這裏是一些典型的應答,都帶有一個可能的
報文串。
• 125 數據連接已經打開;傳輸開始。
• 200 就緒命令。
• 214 幫助報文(面向用戶)。
• 331 用戶名就緒,要求輸入口令。
• 425 不能打開數據連接。
• 452 錯寫文件。
• 500 語法錯誤(未認可的命令)。
• 501 語法錯誤(無效參數)。
• 502 未實現的MODE (方式命令)類型。
通常每個FTP命令都產生一行回答。例如, QUIT命令可以產生如下應答:
221 Goodbye.
如果需要產生一條多行應答,第1行在3位數字應答代碼之後包含一個連字號,而不是空格,
最後一行包含相同的3位數字應答代碼,後跟一個空格符。
三、NAT中FTP流程