4. 檔案傳輸功能
從使用者PI到伺服器的通道是建立在使用者到標記伺服器連接埠間的。使用者協議解譯器負責發送命令和解釋接收的應答;伺服器PI解釋命令,發送應答,指導DTP建立資料連線並傳送資料。如果資料轉送的第二方是使用者DTP,通過使用者FTP主機的內部協議對它進行控制;如果第二方是伺服器DTP,它由使用者PI發來的命令經過自己的PI控制。
4.1. FTP命令
4.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)。
4.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 - 壓縮
4.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命令。
4.2. FTP應答
FTP命令的響應是為了對資料轉送請求和過程進行同步,也是為了讓使用者瞭解伺服器的狀態。每個命令必須有最少一個響應,如果是多個,它們要易於區別。有些命令是有順序性的,因此其中任何一個命令的失敗會導致從頭開始。FTP響應由三個數字構成,後面是一些文本。數字帶有足夠的資訊命名使用者PI不用檢查文本就知道發生了什麼。文本資訊與伺服器相關,使用者可能得到不同的文本資訊。文本和數字以<SP>間隔,文本後以Telnet行結束符結束。文本可能多於一行,這時文本必須在括弧內,第一行內要有資訊表示文本多於一行,最後一行也要有所標記。如果是多行,可以在數字代碼後加上"-",最後一行以數字開始,後面是<SP>,再加上Telnet的行結束符就可以了。下面是一個例子:
123-第一行
第二行
234 以數字開始的一行
123 最後一行
三位元字每位都有一定的意義,第一位確定響應是好的,壞的還是不完全的,通過檢查第一位,使用者進程通常就能夠知道大致要採取什麼行動了。如果使用者程式希望瞭解出了什麼問題,可以檢查第二位,第三位留表示其它資訊。第一位有五個值:
1yz 確定預備應答
請求的操作正在被初始化;在進入下一個命令前等待另外的應答。這類響應用於說明命令被接受,在實現中如何同步監視有困難,使用者進程現在可以關注資料連線了。伺服器FTP進程對第個命令幾乎都返回1yz響應。
2yz 確定完成應答
要求的操作已經完成,可以執行新命令。
3yz 確定中間應答
命令已接受,但要求的操作被停止,停止接收更新的資訊。
4yz 暫時拒絕完成應答
未接受命令,要求的操作未執行,但錯誤是臨時的,過一會兒可以再次發送訊息。使用者應該返回命令序列的開始。這個暫時可是不好確定,此命令的意思就是讓使用者進程再次嘗試使用此命令。
5yz 永遠拒絕完成應答
它與暫時拒絕完成應答的區別就在於錯誤條件是一時半會不會消失。
下面我們來看看第二位所代表的意義:
x0z 格式錯誤;
x1z 此類應答是為了請求資訊的;
x2z 此類應答是關於控制和資料連線的;
x3z 關於認證和帳戶登入過程;
x4z 未使用;
x5z 此類應答是關於檔案系統的;
第三個數字是在第二個數位基礎上對應答內容的進一步細化。一般來說,數字代碼後要有文本資訊。實現時應該盡量使用現有的代碼,而不要隨便添加新的意義不大的代碼。
有些命令如TYPE或ALLO,它們的成功不為使用者進程提供任務新資訊,所以不會有200應答返回。如果有些命令對於伺服器來說不支援,也要返回確定完成應答,這樣使用者進程才有可能進行下面的命令。如果要求的不是可選實現的命令,而這個命令確實沒有實現,那就要傳回碼502。下面我們根據數字順序列出各個應答碼及其意義:
110 |
重新啟動標記應答。在這種情況下文本是確定的,它必須是:MARK yyyy=mmmm,其中yyyy是使用者進程資料流標記,mmmm是伺服器標記。 |
120 |
服務在nnn分鐘內準備好 |
125 |
資料連線已開啟,準備傳送
|
150 |
檔案狀態良好,開啟資料連線
|
200 |
命令成功
|
202 |
命令未實現
|
211 |
系統狀態或系統協助響應
|
212 |
目錄狀態
|
213 |
檔案狀態
|
214 |
協助資訊,資訊僅對人類使用者有用
|
215 |
名字系統類別型
|
220 |
對新使用者服務準備好
|
221 |
服務關閉控制串連,可以退出登入
|
225 |
資料連線開啟,無傳輸進行中
|
226 |
關閉資料連線,請求的檔案操作成功
|
227 |
進入被動模式
|
230 |
使用者登入
|
250 |
請求的檔案操作完成
|
257 |
建立"PATHNAME"
|
331 |
使用者名稱正確,需要口令
|
332 |
登入時需要帳戶資訊
|
350 |
請求的檔案操作需要進一步命令
|
421 |
不能提供服務,關閉控制串連
|
425 |
不能開啟資料連線
|
426 |
關閉串連,中止傳輸
|
450 |
請求的檔案操作未執行
|
451 |
中止請求的操作:有本地錯誤
|
452 |
未執行請求的操作:系統儲存空間不足
|
500 |
格式錯誤,命令不可識別
|
501 |
參數語法錯誤
|
502 |
命令未實現
|
503 |
命令順序錯誤
|
504 |
此參數下的命令功能未實現
|
530 |
未登入
|
532 |
隱藏檔需要帳戶資訊
|
550 |
未執行請求的操作
|
551 |
請求操作中止:頁類型未知
|
552 |
請求的檔案操作中止,儲存分配溢出
|
553 |
未執行請求的操作:檔案名稱不合法
|