文件傳輸協議(File Transfer Protocol, FTP)(1)
發表于:2007-06-13來源:作者:點擊數:
標簽:
Echo Protocol這個協議可能是我知道的最簡單的協議了。它主要用于調試和檢測中。這個協議的作用也十分簡單,接收到什么原封發回就是了。它可以基于TCP協議, 服務器 就在TCP端口7檢測有無消息,如果有發送來的消息直接返回就是了。如果使用UDP協議的基本過程
Echo Protocol這個協議可能是我知道的最簡單的協議了。它主要用于調試和檢測中。這個協議的作用也十分簡單,接收到什么原封發回就是了。它可以基于TCP協議,
服務器就在TCP端口7檢測有無消息,如果有發送來的消息直接返回就是了。如果使用UDP協議的基本過程和TCP一樣,也是收到什么返回什么,檢測的端口也是7。
文件傳輸協議(File Transfer Protocol, FTP)
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之間傳送。下面就是一個例子:
協議要求數據傳輸在處理時打開控制連接。在完成FTP服務后由用戶中止控制連接,而服務器具體操作。如果在未接收命令時關閉了控制連接,服務器也會關閉數據傳輸。FTP和Telnet很有聯系,FTP使用Telnet協議進行控制連接,可有兩種方法達到目的:用戶PI或服務器PI可以在自己的過程中實現 Telnet協議的功能;第二種方法是利用系統中現有的Telnet模塊。實現上,FTP對Telnet協議的依賴也不多,即使重新實現,代碼量也不大。
3. 數據傳輸功能數據連接只傳輸數據,控制連接傳送命令和響應。幾個命令是關于在主機間傳輸數據的,數據傳輸基本上獨立于物理結構的,但是如果在壓縮傳輸模式下流式傳輸與文件結構有關,文件的屬性與表示類型有關。
3.1. 數據表示與保存
數據是在主機間的存儲設置間傳送的。因為兩個系統的數據存儲方式不同,因此需要對它進行轉換,在傳送文本時會有對ASCII表示的問題,在進行二進制傳送的時候,會有不同系統對字節長度規定不同的問題,有的系統是7位,有的系統可能是32位,這也需要進行轉換。需要提供數據表示與傳輸模型函數,但是FTP提供這方面的功能不多,超過FTP提供功能的那一部分要用戶自己實現。
3.1.1. 數據類型
數據表示是由用戶指定的表示類型,它可以是隱含的,也可以是用戶指定的。請一定注意:邏輯字節長度與物理字節長度是不同的。
3.1.1.1. ASCII類型
這是所有FTP必須實現的默認類型,用于傳送文本文件,當在主機間使用EBCDIC傳送時更方便,則不使用ASCII類型。發送方將內部表示轉換為NVT- ASCII格式,接收方則進行相反的過程接收數據。根據NVT標準,要在行結束處使用序列。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:移動至下一頁;+:不移動
打印機必須能夠決定結構體的結束。如果文件本身有記錄結構就沒有問題,如果沒有,用于區別打印行,但這些格式標記已經由ASA控制字符使用了。
3.1.2. 數據結構
除了有不同的數據類型外,FTP還允許有不同的文件結構,下面是三種文件結構:文件式結構:文件中沒有內部結構,文件被看作是二進制流;記錄結構:文件是由一系列記錄組成的;頁結構:文件是由不同的索引頁組成的。
如果未使用STRU命令,文件結構是默認值。文件的結構會影響傳輸模型,存儲和數據表示。文件本來的屬性和保存它的主機有關,不同的機器會以自己的方式保存文件。在不同主機間傳送文件時必須使主機能夠識別相互的表示。有些主機上的文件是面向字節的,有些是面向記錄的,在傳送時就會出現問題。那就要在接收方進行內部轉換。在進行轉換的時候,需要區別記錄的邊界,在ASCII中使用,在EBCDIC中使用作為分隔符。采用這種實現方法的必須保證轉換是可逆的。
3.1.2.1. 文件結構
如果未使用STRU命令,文件結構是默認值。文件結構中沒有默認值,文件被看作是連續的字節串。
3.1.2.2. 記錄結構
對于文本文件,記錄結構必須是所有FTP實現必須有的。記錄結構文件是由連續的記錄構成的。
3.1.2.3. 頁結構
文件是非連續時使用頁結構。這種文件稱為隨機訪問文件。這些文件中有時會的和文件整體或部分相關的信息出現。在FTP中,文件的一個部分稱為頁。為了提供不同的頁大小和相關信息,每頁都帶頁頭發送。頁頭中有如下域:
頭長度
包括此字節的頁頭長度,單位為字節,最小長度為4
頁索引
指出此部分在原文件中的位置,它和傳輸編號不是一回事
數據長度
頁數據中的邏輯字節數,最小值為0
頁類型
頁的類型有以下幾種:0=未頁,指示傳輸結構,包頭必須為4,數據長度必須為0;1=通常頁,沒有控制信息的通常頁文件的普通類型;2=描述子頁,用于傳送整體文件的描述信息;3=訪問控制頁,包括頁級訪問控制信息的頁文件頭域,包頭長度必須為5
可選域
提供每頁的控制信息
所有域均以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的行結束則則或指示。這樣的轉換需要時間,所以相同的系統在傳送文本文件時采用二進制或流表示比較合適。下面是 FTP定義的傳輸模式:
3.4.1. 流模式
數據以字節流的形式傳送。使用的表示類型沒有限制,允許記錄結構。在記錄結構文件EOR和EOF表示為雙字節控制碼。第一字節全為0,后一字節為轉義字符。當第二位值為1時表示EOR,為2時表示EOF,如果要同時表示EOR和 EOF,值為3。全1字節作為數據發送時必須使用雙字節傳送,其中數據保存在第二個字節內。如果是文件結構,通過發送方關閉連接表示EOF,接收到的所有數據就是文件內容。
3.4.2. 塊模式
文件以塊形式傳送,塊帶有自己的頭部分。頭字節包括計數域和描述子代碼。計數域說明了數據塊的字節數,描述子代碼定義了以下內容:EOF,EOR重新開始標記或懷疑錯誤數據。懷疑錯誤數據不是為了進行差錯控制,它是為了站點間交換特定數據,傳送時不管本地錯誤(如硬盤錯誤)而只管傳送,但是傳送時可要指出,這個數據可能有錯。在此模式下可以使用記錄結構,也可以使用相應的數據表示。頭字節的結構如下圖所示:
描述子 8位
字節計數 16位
描述子代碼由在描述子字節中的位標記說明,下面是已經指定的四種代碼及其意義:
代碼
意義
128
數據塊結束是EOR
64
數據塊結束是EOF
32
數據塊內有懷疑錯誤
16
數據塊是重新開始標記
以這種編碼,對于特定塊可能存在多個描述子編碼條件,所需要的位必須全部設置。重新開始標記包括在數據流中,它作為8位整數代表在控制連接上使用語言的可打印字節,但不得出現在其中。例如要傳送6字節標記,下面就是例子:
Desc
rptr 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,過濾器字節是,如果是圖象或本地類型,則是0。下面就是過濾器字節:
轉義序列是雙字節,頭一個全0,后一個內是定義于塊模式下的描述子代碼。描述子代碼與塊模式中的意義相同,它作用于其后串中的字節。而壓縮模式對于增加帶寬有好處(因為數據是壓縮過的)。
3.5. 差錯恢復和重新開始
位丟失和數據錯誤是這一層的差錯控制由TCP負責。而重新開始則是給用戶一個處理系統(包括操作系統,網絡等)失敗的方法。重新開始過程僅適用于塊和壓縮模式,它要求發送者在數據流中加入特定標記,標記僅對傳送者有意義,但其中的內容是控制連接使用的語言。標記可以代表一個位記數,記錄記數或可以標記數據數目的任何點。如果接收方也支持重新開始,將會在接收系統中保存這一標記。在系統失敗重新啟動后,用戶可以根據原來的標記重新開始數據傳送,也就是我們通常熟悉的斷點續傳過程。接收方接收到一段數據,然后記下一點,如果發送方失敗了,就從這一點以后再傳送相應的數據。具體的這里不多說了。