1. 介紹數組
FTP的目標是提升文件的共享性,提供非直接使用遠程計算機,使存儲介質對用戶透明和可靠高效地傳送數據。雖然咱們也能夠手工使用它,可是它的主要做用是供程序使用的。在閱讀本文以前最好可以閱讀TCP協議標準規範和Telnet協議標準規範。安全
2. 概覽服務器
在本節中咱們將討論一些表面上的問題,有些名詞的定義請參閱TCP和Telnet 參考文獻。咱們先介紹一下(1)字節大小,在FTP中字節大小有兩個:邏輯字節大小和用於傳輸的字節大小。後者一般是8位,而前者可不必定是多少了。傳輸 字節沒必要等於邏輯字節大小,也沒必要對數據結構進行解釋。(2)控制鏈接是創建在USER-PIT和SERVER-PI之間用於交換命令與應答的通訊鏈 路。(3)數據鏈接是傳輸數據的全雙工鏈接。傳輸數據能夠發生在服務器DTP和用戶DTP之間也能夠發生在兩個服務器DTP之間。(4)DTP:數據傳輸 過程(DTP)創建和管理數據鏈接,DTP能夠是主動的也能夠是被動的。(5)EOR表明記錄尾。(6)NTV表明網絡虛擬終端,它的定義與在 Telnet協議中的定義一致。(7)NVFS表明網絡虛擬文件系統。(8)FTP能夠傳輸非連續的文件,這些文件的一部分稱爲頁。(9)PI表明協議解 釋器。(10)服務器DTP表明一種傳輸過程,它一般處於「主動」狀態,它和偵聽端口創建數據鏈接,它還能夠爲傳輸和存儲設置參數,並根據PI的指令傳輸 數據。固然,DTP也能夠轉入「被動」狀態。(11)服務器FTP進程,它是和用戶FTP進程一塊兒工做的,它由PI和DTP組成。至於用戶FTP進程則是 由PI,DTP和用戶接口組成的。下圖是FTP服務示意圖:網絡
注意:數據鏈接是雙向的,它不用整個時間都存在。上圖中用戶PI開始控制鏈接,控 制鏈接與Telnet協議很象。在開始階段,標準FTP命令由用戶PI產生並經過控制鏈接傳送到服務器進程。服務器PI向用戶PI返回標準應答。FTP命 令指定數據鏈接參數和文件系統操做。用戶DTP在特定數據端口偵聽,服務器開始數據鏈接並以指定的參數開始數據傳輸。數據端口沒必要在開始FTP命令的機器 上,但用戶或用戶FTP進程必須肯定它在指定的數據端口上偵聽。這個數據鏈接是全雙工的。數據結構
在另一種狀況下,用戶或許但願在兩個主機間傳送文件,不是兩個本地主機。用戶在兩臺主機間創建控制鏈接,而後規劃數據鏈接。用這種方式,控制信息由用戶PI得到,可是數據在服務器DTP之間傳送。下面就是一個例子:tcp
協議要求數據傳輸在處理時打開控制鏈接。在完成FTP服務後由用戶停止控制鏈接, 而服務器具體操做。若是在未接收命令時關閉了控制鏈接,服務器也會關閉數據傳輸。FTP和Telnet頗有聯繫,FTP使用Telnet協議進行控制連 接,可有兩種方法達到目的:用戶PI或服務器PI能夠在本身的過程當中實現Telnet協議的功能;第二種方法是利用系統中現有的Telnet模塊。實現 上,FTP對Telnet協議的依賴也很少,即便從新實現,代碼量也不大。函數
3. 數據傳輸功能編碼
數據鏈接只傳輸數據,控制鏈接傳送命令和響應。幾個命令是關於在主機間傳輸數據的,數據傳輸基本上獨立於物理結構的,可是若是在壓縮傳輸模式下流式傳輸與文件結構有關,文件的屬性與表示類型有關。spa
3.1. 數據表示與保存操作系統
數據是在主機間的存儲設置間傳送的。由於兩個系統的數據存儲方式不一樣,所以須要對 它進行轉換,在傳送文本時會有對ASCII表示的問題,在進行二進制傳送的時候,會有不一樣系統對字節長度規定不一樣的問題,有的系統是7位,有的系統多是 32位,這也須要進行轉換。須要提供數據表示與傳輸模型函數,可是FTP提供這方面的功能很少,超過FTP提供功能的那一部分要用戶本身實現。
3.1.1. 數據類型
數據表示是由用戶指定的表示類型,它能夠是隱含的,也能夠是用戶指定的。請必定注意:邏輯字節長度與物理字節長度是不一樣的。
3.1.1.1. ASCII類型
這是全部FTP必須實現的默認類型,用於傳送文本文件,當在主機間使用 EBCDIC傳送時更方便,則不使用ASCII類型。發送方將內部表示轉換爲NVT-ASCII格式,接收方則進行相反的過程接收數據。根據NVT標準, 要在行結束處使用<CRLF>序列。NVT-ASCII是8位的。ASCII和EBCDIC的格式參數在下面討論。
3.1.1.2. EBCDIC類型
它是做爲ASCII的另外一種方法在主機間傳送數據的數據類型。EBCDIC和ASCII很象,僅在類型的功能描述上有一些差異。行結束符使用不多。
3.1.1.3. 圖象類型
在此類型下傳送的數據被看做連續的位,發送方將數據打包到8位傳輸字節中傳送。由於結構的須要要對傳送數據進行填充,填充字節所有爲0,填充必須在文件結構時使用,並且要標記出以便接收方過濾掉。它用於傳送二進制數據和有效地傳送和存儲文件,所以全部FTP也必須實現。
3.1.1.4. 本地類型
也能夠以十進制指定邏輯字節大小。若是物理字節大小和邏輯字節大小不一樣,直接將物理數據打包爲邏輯字節,不用什麼填充。接收方根據邏輯字節大小進行和本機的存儲特色進行轉換。傳輸必須是可重複的,也就是說,相同的文件相同的參數,那內容必須是同樣的。
3.1.1.5. 格式控制
ASCII和EBCDIC有一個可選參數,它說明文件垂直格式控制,下面的數據表 示類型在FTP中有定義。字符文件可能有三種用途,打印,存儲或留待之後處理。若是是用於打印,那主機必須知道垂直格式控制的表示,若是存儲或等之後處 理,也須要保留文件格式。若是在遠程主機上處理完後傳輸回本地主機,要保證遠程主機處理時沒有麻煩。這都須要在ASCII和EBCDIC格式上加入新的參 數。
3.1.1.5.1. NON PRINT
未指定第二個參數是它是默認值。它必須爲全部FTP接受。若是傳輸的文件是用於打印的,則使用邊界和間隔的默認值。一般它不用於打印目的,而用於保存文件或執行文件。
3.1.1.5.2. TELNET格式控制
文件包括ASCII/EBCDIC垂直格式控制,這些控制字符可使打印正常進行。
3.1.1.5.3. CARRIAGE CONTROL (ASA)
文件包含ASA (FORTRAN)垂直格式控制字符。在以ASA標準造成的行中,第一個字符不打印,它用於決定打印前的走紙量。下面是定義了的ASA字符:
blank: 向下移動1行;0:向下移動2行;1:移動至下一頁;+:不移動
打印機必須可以決定結構體的結束。若是文件自己有記錄結構就沒有問題,若是沒有,<CRLF>用於區別打印行,但這些格式標記已經由ASA控制字符使用了。
3.1.2. 數據結構
除了有不一樣的數據類型外,FTP還容許有不一樣的文件結構,下面是三種文件結構:文件式結構:文件中沒有內部結構,文件被看做是二進制流;記錄結構:文件是由一系列記錄組成的;頁結構:文件是由不一樣的索引頁組成的。
若是未使用STRU命令,文件結構是默認值。文件的結構會影響傳輸模型,存儲和數 據表示。文件原本的屬性和保存它的主機有關,不一樣的機器會以本身的方式保存文件。在不一樣主機間傳送文件時必須使主機可以識別相互的表示。有些主機上的文件 是面向字節的,有些是面向記錄的,在傳送時就會出現問題。那就要在接收方進行內部轉換。在進行轉換的時候,須要區別記錄的邊界,在ASCII中使 用<CRLF>,在EBCDIC中使用<NL>做爲分隔符。採用這種實現方法的必須保證轉換是可逆的。
3.1.2.1. 文件結構
若是未使用STRU命令,文件結構是默認值。文件結構中沒有默認值,文件被看做是連續的字節串。
3.1.2.2. 記錄結構
對於文本文件,記錄結構必須是全部FTP實現必須有的。記錄結構文件是由連續的記錄構成的。
3.1.2.3. 頁結構
文件是非連續時使用頁結構。這種文件稱爲隨機訪問文件。這些文件中有時會的和文件總體或部分相關的信息出現。在FTP中,文件的一個部分稱爲頁。爲了提供不一樣的頁大小和相關信息,每頁都帶頁頭髮送。頁頭中有以下域:
頭長度 |
包括此字節的頁頭長度,單位爲字節,最小長度爲4 |
頁索引 |
指出此部分在原文件中的位置,它和傳輸編號不是一回事 |
數據長度 |
頁數據中的邏輯字節數,最小值爲0 |
頁類型 |
頁的類型有如下幾種:0=未頁,指示傳輸結構,包頭必須爲4,數據長度必須爲0;1=一般頁,沒有控制信息的一般頁文件的普通類型;2=描述子頁,用於傳送總體文件的描述信息;3=訪問控制頁,包括頁級訪問控制信息的頁文件頭域,包頭長度必須爲5 |
可選域 |
提供每頁的控制信息 |
描述子 8位 |
字節計數 16位 |
描述子代碼由在描述子字節中的位標記說明,下面是已經指定的四種代碼及其意義:
代碼 |
意義 |
128 |
數據塊結束是EOR |
64 |
數據塊結束是EOF |
32 |
數據塊內有懷疑錯誤 |
16 |
數據塊是從新開始標記 |
以這種編碼,對於特定塊可能存在多個描述子編碼條件,所須要的位必須所有設置。從新開始標記包括在數據流中,它做爲8位整數表明在控制鏈接上使用語言的可打印字節,但<SP>不得出如今其中。例如要傳送6字節標記,下面就是例子:
Descrptr code = 16 |
Byte count = 6 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
3.4.3. 壓縮模式
有三種信息須要傳送:常規數據以字節串傳送;壓縮數據,包括複本和過濾器;控制信息,以兩個轉義字符傳送。若是有N(>0但小於127)個常規數據傳送,在數據前一位加上一個字節,這個字節最高位爲0,其它位表示的數值等於N。以下圖:
若要壓縮一個數據位D的N複本字符串,用兩個字節傳送,以下圖,它表示的是壓縮的字節:
一串N過慮器字節能夠壓縮爲一個字節,而過濾器字節根據表示法不一樣而不一樣。若是類型是ASCII或EBCDIC,過濾器字節是<SP>,若是是圖象或本地類型,則是0。下面就是過濾器字節:
轉義序列是雙字節,頭一個全0,後一個內是定義於塊模式下的描述子代碼。描述子代碼與塊模式中的意義相同,它做用於其後串中的字節。而壓縮模式對於增長帶寬有好處(由於數據是壓縮過的)。
3.5. 差錯恢復和從新開始
位丟失和數據錯誤是這一層的差錯控制由TCP負責。而從新開始則是給用戶一個處理 系統(包括操做系統,網絡等)失敗的方法。從新開始過程僅適用於塊和壓縮模式,它要求發送者在數據流中加入特定標記,標記僅對傳送者有意義,但其中的內容 是控制鏈接使用的語言。標記能夠表明一個位記數,記錄記數或能夠標記數據數目的任何點。若是接收方也支持從新開始,將會在接收系統中保存這一標記。在系統 失敗從新啓動後,用戶能夠根據原來的標記從新開始數據傳送,也就是咱們一般熟悉的斷點續傳過程。接收方接收到一段數據,而後記下一點,若是發送方失敗了, 就從這一點之後再傳送相應的數據。具體的這裏很少說了。
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 |
未執行請求的操做:文件名不合法 |
5. 說明
5.1. 最小實現
下面是FTP服務器的最小實現:
類型 - ASCII Non-print
模式 - Stream
結構 - File, Record
命令 - USER, QUIT, PORT,TYPE, MODE, STRU,RETR, STOR,NOOP.
傳輸的默認參數爲:
類型 - ASCII Non-print
模式 - Stream
結構 - File
全部主機都將上面的值做爲默認值。
5.2. 鏈接
服務器協議解釋器會在端口L偵聽,用戶或用戶協議解釋器初始化全雙工控制鏈接,服 務器和用戶進程應該遵照Telnet協議的說明進行。服務器不提供對命令行的編輯功能,應該由用戶負責這一切。在所有傳送和應答結束後,在用戶的請求下服 務器關閉控制鏈接。用戶DTP必須在指定的數據端口上偵聽,它能夠是默認端口U或由PORT命令指定的端口。服務器的默認數據端口爲L-1。傳輸方向和端 口都可由FTP命令決定。只有用戶PI能夠改變默認端口。當數據在服務器A和B之間傳送時,用戶PI,C,在兩個服務器PI之間創建控制鏈接。其中一個服 務器A,在接收到傳輸服務命令時接收PASV命令初始化鏈接,用戶PI接收到PASV命令的確認時(確認內包括主機標識和端口),將端口以PORT命令發 送到B。在接收到確認後,用戶PI能夠發送相應的命令給A和B了,B初始鏈接和傳輸進程,命令應答序列以下面所示,請根據位置注意時差:
在任什麼時候間,服務器和用戶只要有一方關閉鏈接,另外一方就要趕快讀取緩衝中的數據,而後也關閉本方的鏈接。
5.3. 命令
本節主要討論命令格式。命令對大小寫不敏感。命令一般由命令碼和相應的參數組成。 中間由一個或幾個空格分開。參數域由<CRLF>結束,服務器在未接收到行結束符時不會採起任何動做。下面描述的格式是以NVT-ASCII 以準的,方括號表明可選的參數域,若是未選擇可選的參數域則採用默認值。
5.3.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>
5.3.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> ::= 任何十進制整數
5.4. 命令和響應序列
服務器和用戶之間的通訊是對話的過程,用戶發送FTP命令,而後等待服務器的一個(或多個)響應,根據響應再發送新命令。
鏈接時的響應帶有許多信息,一般狀況下,服務器會返回220應答,等待輸入,用戶 在接收到此響應後才發送新命令,若是服務器不能當即接收輸入,會在220後面返回120。有些信息如服務器將在15分鐘後中止工做是要服務器發向用戶的, 可是服務器卻不能直接發向用戶,處理的方法是將消息緩衝,在下一個響應中返回給用戶。下面列出命令的應答,第一個是預備應答,第二個是肯定完成,第三個是 拒絕完成,最後是中間應答。這些應答是構成狀態圖的基礎,狀態圖會在下節中給出:
創建鏈接 120
220
220
421
登陸
USER
230
530
500, 501, 421
331, 332
PASS
230
202
530
500, 501, 503, 421
332
ACCT
230
202
530
500, 501, 503, 421
CWD
250
500, 501, 502, 421, 530, 550
CDUP
200
500, 501, 502, 421, 530, 550
SMNT
202, 250
500, 501, 502, 421, 530, 550
退出登陸
REIN
120
220
220
421
500, 502
QUIT
221
500
傳輸參數
PORT
200
500, 501, 421, 530
PASV
227
500, 501, 502, 421, 530
MODE
200
500, 501, 504, 421, 530
TYPE
200
500, 501, 504, 421, 530
STRU
200
500, 501, 504, 421, 530
文件操做命令
ALLO
200
202
500, 501, 504, 421, 530
REST
500, 501, 502, 421, 530
350
STOR
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 452, 553
500, 501, 421, 530
STOU
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 452, 553
500, 501, 421, 530
RETR
125, 150
(110)
226, 250
425, 426, 451
450, 550
500, 501, 421, 530
LIST
125, 150
226, 250
425, 426, 451
450
500, 501, 502, 421, 530
NLST
125, 150
226, 250
425, 426, 451
450
500, 501, 502, 421, 530
APPE
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 550, 452, 553
500, 501, 502, 421, 530
RNFR
450, 550
500, 501, 502, 421, 530
350
RNTO
250
532, 553
500, 501, 502, 503, 421, 530
DELE
250
450, 550
500, 501, 502, 421, 530
RMD
250
500, 501, 502, 421, 530, 550
MKD
257
500, 501, 502, 421, 530, 550
PWD
257
500, 501, 502, 421, 550
ABOR
225, 226
500, 501, 502, 421
得到信息命令
SYST
215
500, 501, 502, 421
STAT
211, 212, 213
450
500, 501, 502, 421, 530
HELP
211, 214
500, 501, 502, 421
其它命令
SITE
200
202
500, 501, 530
NOOP
200
500 421
6. 狀態圖
下面是一個簡單實現的FTP的狀態圖,只用到響應碼的首位。對於全部命令或命令序列有三種可能性:成功(S),失敗(F)或錯誤(E)。在狀態圖中B表明開始,W表明等待響應。下面咱們給出一個總圖,總圖能夠包括的命令有:
ABOR,ALLO,DELE,CWD,CDUP,SMNT,HELP,MODE,NOOP,PASV,QUIT,SITE,PORT,SYST,STAT,RMD,MKD,PWD,STRU和TYPE
而下圖能夠包括的命令有:APPE,LIST,NLST,REIN,RETR,STOR和STOU。
第一幅圖和第二幅圖差異不大,第一幅圖中若是出現了100系列響應會是錯誤,而在第二幅圖中不會。下面是重命名過程:
下面是從新啓動命令,其中cmd表明APPE,STOR或RETR。
下圖表明登陸過程:
7. 典型FTP過程
假設位於U的用戶但願從S上(下)傳文件,一般用戶須要使用用戶FTP進程和服務器通訊,下面就是一個例子:
用戶發出的本地命令 |
解釋 |
ftp (host) multics<CR> |
鏈接到 S 的端口 L ,創建控制鏈接 <---- 220 Service ready <CRLF>. |
用戶名 Doe <CR> need password<CRLF>. |
USER Doe<CRLF>----> <---- 331 用戶名正確 |
口令 <CR> |
PASS 口令 <CRLF>----> <---- 230 User logged in<CRLF>. |
retrieve (local type) ASCII<CR> (local pathname) test 1 <CR> (for. pathname) test.pl1<CR> |
User-FTP opens local file in ASCII. RETR test.pl1<CRLF> ----> <---- 150 文件狀態正常,將打開數據鏈接 <CRLF> 服務器於端口 U 創建數據鏈接 |
文件傳輸中 |
|
|
<---- 226 關閉數據鏈接,文件傳輸正確 <CRLF> |
type Image<CR> |
TYPE I<CRLF> ----> <---- 200 Command OK<CRLF> |
store (local type) image<CR> (local pathname) file dump<CR> (for.pathname) >udd>cn>fd<CR> |
User-FTP opens local file in Image. STOR >udd>cn>fd<CRLF> ----> <---- 550 訪問拒絕 <CRLF> |
停止 |
QUIT <CRLF> ----> |
服務器關閉全部鏈接 |
FTP控制鏈接經過用戶進程端口U和服務器端口L創建,這裏默認的L=21。
全部域均以1個邏輯字節長度爲大小,邏輯字節長度由TYPE命令指定。若是讀取版本與和開始版本號一致,文件訪問時必須以相同的參數進行。若是參數相同,FTP實現要保證取得的文件內容是相同的。
3.2. 創建數據鏈接
傳送數據機制包括創建鏈接選擇數據參數。用戶和服務器DTP有默認數據端口。用戶 進程默認數據端口和控制鏈接端口相同。服務器進程默認數據端口和控制鏈接端口相鄰。傳輸字節大小是8位字節。此字節是實際傳輸字節,但不表明主機內的數據 表示。被動數據傳輸進程在數據端口接收數據,FTP請求命令決定數據傳輸的方向。服務器在接收到請求之後,將初始化端口的數據鏈接。當鏈接創建後,傳輸在 DTP之間傳送,服務器PI對用戶PI返回應答。FTP實現運行一個默認數據端口,用戶PI才能改變默認端口。
經過PORT命令可能改變端口,用戶可能但願數據在第三方主機上進行其它操做,用 戶PI須要在兩個服務器PI上創建鏈接。一個服務器被告知偵聽另外一服務器的請求。用戶PI經過PORT命令通知另外一服務器的數據端口。最後雙方發送相應的 傳送命令。一般,服務器負責支持數據鏈接,初始化並關閉它,除非用戶DTP在傳輸模式下要求關閉鏈接。服務器在下面狀況下關閉數據鏈接:
1. 服務器結束髮送數據,經過EOF要求停止傳送;
2. 用戶發送ABORT命令;
3. 用戶改變端口;
4. 控制鏈接關閉;
5. 發生不可恢復錯誤。
3.3. 數據鏈接管理
默認數據鏈接端口:全部FTP必須支持默認數據鏈接,只有用戶PI可以初始化非默認端口的使用。
肯定非默認數據端口:用戶PI可使用PORT命令指定非默認端口,它要求服務器方以PASV肯定非默認數據端口。鏈接是由雙方地址肯定的,所以改變一方地址就改變了鏈接。
數據鏈接的重用:在使用流式數據傳輸模型時,文件結束經過關閉鏈接指示。若是要傳 送多個文件時就會出麻煩,解決的方法有兩個,一個是肯定非默認端口,另外一個是使用另外一種傳輸模式。就傳輸模式而言,流傳輸模式是不安全的,所以沒法肯定連 接是暫時仍是永久關閉。其它傳輸模式不經過關閉鏈接表示文件結構,它們能夠經過FTP命令決定傳送結構。所以使用這些傳輸模式能夠在保持鏈接的狀況下傳送 多個文件。
3.4. 傳輸模式
有三種傳輸模式:一種將數據格式化並考慮從新開始過程;一種壓縮數據;一種是不經 過處理(少許處理)傳送。全部數據傳輸必須以一個EOF結束,它能夠顯式給出,也能夠經過關閉鏈接隱式給出。對於記錄文件,全部EOR是顯式的,包括最後 一個記錄。對於以頁結構傳送的文件,使用「最後一頁」表示結束。從這裏開始,下文中咱們提到的字節指的是「傳輸字節」。
爲了進行標準化傳送,傳送主機必須把行結束或記錄結束的內部表示轉化爲傳輸模式和 文件結構指定的形式傳送,接收方則進行相反的工做。IBM大型機的記錄計數域可能不能爲其它主機識別,因此記錄結束標記在流模式下以雙字節控制碼傳送,在 塊或壓縮模式下以標記位傳送。而ASCII或EBCDIC的行結束則則<CRLF>或<NL>指示。這樣的轉換須要時間,因此相 同的系統在傳送文本文件時採用二進制或流表示比較合適。下面是FTP定義的傳輸模式:
3.4.1. 流模式
數據以字節流的形式傳送。使用的表示類型沒有限制,容許記錄結構。在記錄結構文件 EOR和EOF表示爲雙字節控制碼。第一字節全爲0,後一字節爲轉義字符。當第二位值爲1時表示EOR,爲2時表示EOF,若是要同時表示EOR和 EOF,值爲3。全1字節做爲數據發送時必須使用雙字節傳送,其中數據保存在第二個字節內。若是是文件結構,經過發送方關閉鏈接表示EOF,接收到的全部 數據就是文件內容。
3.4.2. 塊模式
文件以塊形式傳送,塊帶有本身的頭部分。頭字節包括計數域和描述子代碼。計數域說 明瞭數據塊的字節數,描述子代碼定義瞭如下內容:EOF,EOR從新開始標記或懷疑錯誤數據。懷疑錯誤數據不是爲了進行差錯控制,它是爲了站點間交換特定 數據,傳送時無論本地錯誤(如硬盤錯誤)而只管傳送,可是傳送時可要指出,這個數據可能有錯。在此模式下可使用記錄結構,也可使用相應的數據表示。頭 字節的結構以下圖所示: