原文參考RFC0959,,源自:http://www./ /翻譯:果皮版本:v1.0 02010-7-28 8 文件傳輸協(xié)議 備忘錄的狀況 此備忘錄是FTP P協(xié)議的官方規(guī)范,,可無條件分發(fā),。 下列新的可選命令包含在此版本的規(guī)范中:CDUP P(Change eto oParent tDirectory), ,SMNT T(Structure eMount), ,STOU(Store eUnique), ,RMD D(Remove eDirectory),MKD(MakeDirectory),PWD(PrintDirectory),andSYST(System). . 注意此規(guī)范兼容以前的版本。1 .簡介 FTP P的目標如下: 1)促進文件共享(計算機程序和數(shù)據(jù)),,2)鼓勵間接或隱式(通過程序)的使用遠程計算機,,3)使用戶免受主機之間文件存儲系統(tǒng)的變化,4)可靠高效的傳輸數(shù)據(jù),。盡管用戶可在終端機上直接使用FTP P,,但設(shè)計FTP P主要是為了在程序中使用。 此規(guī)范試圖用一個簡單且容易實現(xiàn)的協(xié)議設(shè)計來滿足用戶的各種需求,,如大型機,、小型機、個人工作站和TACs,。 這篇文章假設(shè)您已熟悉TCP P和Telnet t協(xié)議,,相關(guān)文檔包含在ARPA A互聯(lián)網(wǎng)協(xié)議手冊中。2 .概述 本節(jié)內(nèi)容討論歷史,、術(shù)語和FTP P模型,。本節(jié)定義的術(shù)語僅僅是那些在FTP P中有特殊意義的詞語。某些術(shù)語僅針對FTP P模型,;當回顧術(shù)語時,,一些讀者可能需要借助于本節(jié)的FTP P模型。2.1 歷史 多年來,,F(xiàn)TP P協(xié)議有一個長期的演化,。附錄III I是和FTP P有關(guān)的按時間排序的RFC C文檔列表。這些文檔包含1971 1年第一個被提議的文件傳輸機制,,它在麻省理工學院(M.I.T.)(RFC114)的主機上實現(xiàn),,RFC141 1中加上了注解和討論。 RFC172 2提供了一個面向用戶級的在主機間(包括終端IMPs s)傳輸文件的協(xié) 議,。作為修訂版,,RFC265 5改編了FTP,RFC281 1提議做進一步的改變,。1982 2年1 1月,,RFC294 4提議使用事務數(shù)據(jù)集類型(?"SetDataType" "transaction),。 RFC354 4淘汰了RFC264 4和265,。FTP P現(xiàn)在被定義為在ARPANET T上主機之間進行文件傳輸?shù)囊粋€協(xié)議,F(xiàn)TP P的主要功能是在主機之間高效可靠的傳輸文件,,并允許方便的使用遠程文件存儲功能,。RFC385 5進一步評論了協(xié)議的錯誤、目的和附件,,RFC414 4則提供了關(guān)于serverFTP和userFTP P工作情況的報告,。1973 3年發(fā)布的RFC430 0提出關(guān)于FTP P的進一步評議,。最終,一份正式的FTP P文檔出版了,,這就是RFC454,。 1973 3年7 7月以前,F(xiàn)TP P的最后一個版本發(fā)生了相當大的改變,,但總體結(jié)構(gòu)未變,。作為新的官方規(guī)范,RFC542 2的發(fā)布體現(xiàn)了這些變化,。盡管如此,,基于舊版本的許多實現(xiàn)未被更新。 1974 4年,,RFC607 7和614 4繼續(xù)對FTP P發(fā)表評論,。RFC624 4提出了深層的設(shè)計更改和小的修訂。1975 5年,,RFC686 6,,標題為"Leaving gWell lEnoughAlone" ",,討論了所有新舊FTP P版本的不同,。RFC691 1提出了對RFC686 6的輕微修訂,和文件打印相關(guān),。 在底層協(xié)議從NCP P轉(zhuǎn)換到TCP P的推動下,,基于上述所有的努力,RFC765 5詳述了FTP P在TCP P上的使用,。 當前版本的FTP P規(guī)范準備改正一些小的文檔錯誤,,來改善某些協(xié)議特征的解釋,并增加一些新的可選命令,。 特別是,,下列新的可選命令包含在此版本的規(guī)范中: :CDUP– –進入上一級目錄 錄SMNT T– –結(jié)構(gòu)裝載(?StructureMount) )STOU U– –唯一存儲(?StoreUnique) )RMD D– –刪除目錄MKD D– –新建目錄PWD D–打印目錄SYST T-System m 此規(guī)范兼容以前的版本,。依據(jù)先前版本實現(xiàn)的程序應該可以自動適應此規(guī)范,。2.2 術(shù)語 ASCII I ASCII I字符集定義在ARPA互聯(lián)網(wǎng)協(xié)議手冊中。在FTP P中,,ASCII I字符集定義為一個八位編碼集的低半部分(例如,,最高位是零)。 訪問控制(accesscontrols) ) 訪問控制定義了用戶使用系統(tǒng)及系統(tǒng)文件的權(quán)限,。訪問控制必須防止對文件進行非法或意外的使用,。調(diào)用訪問控制是server-FTPprocess s的特權(quán)。 字節(jié)大?。╞ytesize) ) FTP P中有兩種字節(jié)大?。何募倪壿嬜止?jié)大小,,用于數(shù)據(jù)傳輸?shù)膫鬏斪止?jié)大小。傳輸字節(jié)大小總是8 8位,。傳輸字節(jié)大小不一定是數(shù)據(jù)接收方系統(tǒng)的字節(jié)大小,, ,也不一定是邏輯字節(jié)大?。ㄓ糜诮忉寯?shù)據(jù)的結(jié)構(gòu)),。 控制連接(controlconnection) ) 在USER-PI I和SERVER-PI I之間交換命令和應答的通信路徑。此連接遵循 Telnet t協(xié)議,。 數(shù)據(jù)連接(dataconnection) ) 全雙工連接,,在此之上,數(shù)據(jù)以一種指定的模式和類型進行傳輸,。被傳輸?shù)?br>數(shù)據(jù)可能是文件的一部分,、整個文件或若干文件。連接可以建立在server-DTP P和user-DTP P之間,,或者兩個server-DTP P之間,。 數(shù)據(jù)端口(dataport) ) 被動DTP P在數(shù)據(jù)端口上偵聽來自主動DTP P的連接,以便能夠打開數(shù)據(jù)連接,。 DTP(datatransferprocess) ) DTP P建立和管理數(shù)據(jù)連接,。DTP P可以是被動的或主動的。 行結(jié)束符(End-of-Line) ) 行結(jié)束符定義了可打印行之間的間隔,?;剀?換行。 文件結(jié)束符(EOF) ) 文件結(jié)束符定義了在傳文件的結(jié)尾,。 記錄終止符(EOR) ) 記錄終止符定義了在傳記錄的結(jié)尾,。 錯誤恢復(errorrecovery) ) 允許用戶從某些錯誤中恢復,比如主機系統(tǒng)或DTP P的故障,。在FTP P中,,錯誤恢復可能涉及文件傳輸?shù)闹貑ⅲㄔ诮o定的檢查點)。 FTP P命令(FTPcommands) ) 一個命令集,,包含了從user-FTP P到server-FTP P傳輸?shù)目刂菩畔ⅰ?br>文件(File) )計算機數(shù)據(jù)(包括程序)的有序集合,,具有任意長度,通過路徑名唯一識別,。模式(mode) )在數(shù)據(jù)連接上,,數(shù)據(jù)以此模式傳輸。模式定義了傳輸過程中的數(shù)據(jù)格式,,包 括EOR R和EOF F,。FTP P中定義的傳輸模式在TransmissionModes s一節(jié)中講述。 網(wǎng)絡虛擬終端(VNT) ) 網(wǎng)絡虛擬終端同Telnet t協(xié)議中的定義相同。 網(wǎng)絡虛擬文件系統(tǒng)(NVFS) ) 此概念定義了一個標準的網(wǎng)絡文件系統(tǒng),,具有標準的命令和路徑名約定,。 頁(Page) ) 一個文件可能被結(jié)構(gòu)化為被稱為頁的獨立部分的集合。FTP P支持不連續(xù)文件 (獨立的索引頁)的傳輸,。 路徑名(pathname) ) 路徑名是用戶輸入到文件系統(tǒng)中的一個字符串,,用于標識一個文件。路徑名 一般包括設(shè)備和目錄名,,以及文件名,。FTP P尚未指定標準的路徑名約定。每個用戶必須遵循傳輸過程中所涉及文件系統(tǒng)的文件名約定,。 協(xié)議解釋器(PI) ) Theprotocolinterpreter r,。協(xié)議兩端的user r和server r具有不同的角色(分別在user-PI I和server-PI I中實現(xiàn))。 記錄(record) ) 一個順序文件可能被結(jié)構(gòu)化為若干稱為記錄的部分,。FTP P支持記錄結(jié)構(gòu),,但傳輸?shù)奈募槐胤堑檬怯涗浗Y(jié)構(gòu)。 應答(reply) ) 應答是server r通過控制連接向user r發(fā)送的一個確認(肯定的或否定的),,它是對FTP P命令的響應,。應答的一般形式是一個完成碼(包括錯誤碼)后跟一個文本串。完成碼為程序所用,,文本串通常為人類用戶所用,。 服務器數(shù)據(jù)傳輸進程(server-DTP) ) DTP P,以正常的主動狀態(tài),,通過偵聽數(shù)據(jù)端口來建立數(shù)據(jù)連接,。它為傳輸和存儲設(shè)置一些參數(shù),,并且按照來自其協(xié)議解釋器(PI I)的命令傳輸數(shù)據(jù),。DTP P 可以設(shè)置為被動狀態(tài)進行偵聽,而不是在數(shù)據(jù)端口發(fā)起一個連接,。 服務器FTP P進程(server-FTPprocess) ) 一個process s或process s集合,,它與一個user-FTPprocess s(也可能是另一個 server r)協(xié)作完成文件傳輸?shù)墓δ堋4斯δ馨ㄒ粋€協(xié)議解釋器(PI I)和一個數(shù)據(jù)傳輸進程(DTP),。 服務器協(xié)議解釋器(server-PI) ) server-PI I在端口L(PortL L)上偵聽來自user-PI I的連接,,并且建立一個控制通信連接。它接收來自user-PI I的標準FTP P命令,,發(fā)送應答,,以及管理server-DTP P。 類型(type) ) 數(shù)據(jù)表示類型,,用于數(shù)據(jù)傳輸和存儲,。類型意味著在數(shù)據(jù)存儲和數(shù)據(jù)傳輸之間的某些轉(zhuǎn)換。FTP P中定義的表示類型在EstablishingDataConnections s一節(jié)中講述。 用戶(user) ) 想要獲得文件傳輸服務的一個人或可代表人的process s,。人類用戶可以直接與server-FTPprocess s交互,,但是應優(yōu)先使用user-FTPprocess s,因為FTP P協(xié)議的 設(shè)計更傾向于自動裝置,。 用戶數(shù)據(jù)傳輸進程(user-DTP) ) DTP P在數(shù)據(jù)端口偵聽來自server-FTPprocess s的連接,。如果兩個server r正在 相互傳輸數(shù)據(jù),那么此user-DTP P將是不活躍的,。 用戶FTP P進程(user-FTPprocess) ) 一個功能集合,,包括一個PI I、一個DTP P以及一個用戶界面,,與一個或多個 server-FTPprocess s協(xié)作,,共同完成文件傳輸功能。用戶界面允許在命令應答中使用本地語言與user r進行對話,。 用戶協(xié)議解釋器(user-PI) ) 用戶協(xié)議解釋器(userprotocolinterpreter r)發(fā)起從其端口U(portU U)到server-FTPprocess s的控制連接,,發(fā)出FTP P命令,并且管理user-DTP P(若其屬于 此次文件傳輸),。2.3FTP 模型 (THEFTPMODEL) 基于上述定義,,下面的模型(圖1)解釋了一個FTPservice。 注意:1.數(shù)據(jù)連接可用于任何一個方向,。 2.數(shù)據(jù)連接不必一直存在,。 。圖1--FTP P使用模型 在圖1 1描述的模型中,,User-PI I發(fā)起了控制連接,。控制連接遵循Telnet t協(xié)議,。在user r的發(fā)起時刻,,標準FTP P命令由user-PI I生成并通過控制連接傳輸給server rprocess。(user r可以直接建立一個到server-FTP P的控制連接,,例如從一個TAC C終端機,,獨立的生成標準FTP P命令,繞過user-FTPprocess s)為響應命令,,server-PI I通過控制連接向user-PI I發(fā)送標準應答,。 FTP P命令為數(shù)據(jù)連接及文件系統(tǒng)操作指定了若干參數(shù),前者的參數(shù)有數(shù)據(jù)端口,、傳輸模式,、表示類型和結(jié)構(gòu),后者有存儲,、獲取,、附加、刪除等等。user-DTP P或其指派(,?designate)應在特定數(shù)據(jù)端口上偵聽,,server r按照規(guī)定的參數(shù)發(fā)起數(shù)據(jù)連接和數(shù)據(jù)傳輸。注意,,數(shù)據(jù)端口不必在發(fā)出FTP P命令的主機上,,但是user r或user-FTPprocess s必須保證在指定的數(shù)據(jù)端口上偵聽。也應注意,,數(shù)據(jù)連接可能同時用于收發(fā),。 另一種情況,user r可能希望在兩個遠程主機間傳輸文件,。User r建立到兩個server r的控制連接,,接著安排server r之間的數(shù)據(jù)連接。這樣,,控制信息被傳遞給user-PI,,但是數(shù)據(jù)在server-DTP P間傳輸。下圖是這種server-server r交互的模型,。 圖2 2 當數(shù)據(jù)正在傳輸時,,此協(xié)議要求控制連接處于打開狀態(tài)。當FTPservice e使用完畢時,,user r有責任請求關(guān)閉控制連接,,盡管是server r執(zhí)行關(guān)閉動作。如果控制連接在沒有收到命令的情況下被關(guān)閉了,,server r可能會終止數(shù)據(jù)傳輸,。 FTP P和Telnet t的關(guān)系: FTP P在控制連接中使用Telnet t協(xié)議。這可以通過兩種方式完成:第一,,user-PI I或者server-PI I可在它們自己的程序中直接實現(xiàn)Telnet t協(xié)議的規(guī)則,;第二,user-PI I或者server-PI I可利用系統(tǒng)中已存在的Telnet t組件,。 第二種方法適用于免實現(xiàn),、代碼共享及模塊化編程的情況。若講求效率和自主性則選第一種方法,。 事實上,F(xiàn)TP P只用到了很少的Telnet t協(xié)議,,因此第一種方法不需要寫大量的代碼,。3. 數(shù)據(jù)傳輸功能(DATATRANSFERFUNCTIONS) ) 文件僅通過數(shù)據(jù)連接進行傳輸??刂七B接用于傳輸命令(描述了將要執(zhí)行的功能)以及這些命令的應答(見FTPReplies s小節(jié)),。一些命令涉及到主機間數(shù)據(jù)的傳輸,這些命令包括MODE E命令(指定了數(shù)據(jù)位如何傳輸)、STRUCTURE E以及TYPE E命令(定義了數(shù)據(jù)的表示方式),。傳輸和表示基本上是無關(guān)的,,但是流傳輸模式取決于文件結(jié)構(gòu)屬性,如果使用了壓縮傳輸模式,,填充字節(jié)取決于表示類型,。3.1 數(shù)據(jù)表示和存儲(DATAREPRESENTATIONANDSTORAGE) 數(shù)據(jù)從發(fā)送者主機的存儲設(shè)備中傳輸?shù)浇邮照咧鳈C的存儲設(shè)備中。因為這兩個系統(tǒng)的數(shù)據(jù)存儲表示法常常是不同的,,所以需要執(zhí)行某些數(shù)據(jù)轉(zhuǎn)換,。例如,在不同的系統(tǒng)中,,NVT-ASCII I具有不同的數(shù)據(jù)存儲表示法,。DECTOPS-20s s通常將NVT-ASCII I存儲為5 5個7 7位ASCII I字符,在一個36 6位字中左對齊,。IBM M大型機將NVT-ASCII I存儲為8 8位EBCDIC C碼,。Multics s將NVT-ASCII I存儲為4 4個9 9位字符,在一個36 6位字中,。在不同的系統(tǒng)間傳輸文本時,,適合將字符轉(zhuǎn)換成標準NVT-ASCII I表示法。收發(fā)方需在標準表示法和它們的內(nèi)部表示法之間執(zhí)行必要的轉(zhuǎn)換,。 當在不同字長的主機系統(tǒng)間傳輸二進制數(shù)據(jù)時,,在表示法上出現(xiàn)了一個問 題。并不總是能夠清楚的知道發(fā)送者如何發(fā)送數(shù)據(jù)以及接收者如何存儲之,。例如,, ,當從32 2位字長的系統(tǒng)向36 6位字長的系統(tǒng)傳輸32 2位字節(jié)時,,在后者系統(tǒng)中,,在36 6位字中按照右對齊來存儲32 2位字節(jié)可能是合適的。在任何情況下,,user r應該能夠指定數(shù)據(jù)表示法和轉(zhuǎn)換方法,。應該注意FTP P提供的數(shù)據(jù)類型表示法非常有限,其它類型的數(shù)據(jù)轉(zhuǎn)換應該由user r直接執(zhí)行,。 3.3.3.3.1.1.1.1.1111數(shù)據(jù)類型(DATATYPES) ) FTP依據(jù)user指定的表示類型來處理數(shù)據(jù)表示,。指定的類型可能含蓄的(asin nASCIIorEBCDIC)或明確的(asinLocalbyte)定義了邏輯字節(jié)大小。注意,,這與在數(shù)據(jù)連接上傳輸?shù)淖止?jié)大?。ǚQ為傳輸字節(jié)大小)沒有任何關(guān)系,,二者不能混淆,。例如,,NVT-ASCII I的邏輯字節(jié)大小為8 8位。如果類型為本地字節(jié),,那么TYPE E命令必須用第二個參數(shù)來指定邏輯字節(jié)大小,。傳輸字節(jié)大小總是8位。3.1.1.1.ASCII 類型( ASCIITYPE) 這是所有的FTP P必須接受的默認類型,,主要用于傳輸文本文件,。如果雙方主機認為使用EBCDIC C類型更方便,則不使用ASCII I類型,。 發(fā)送方將數(shù)據(jù)由字符的內(nèi)部表示法轉(zhuǎn)換為標準的8位NVT-ASCII表示法(參見Telnet t規(guī)范),。接收方則把數(shù)據(jù)由標準表示法轉(zhuǎn)換為內(nèi)部表示法。 按照NVT T標準,,在文本行尾應當使用<CRLF> >序列,。(參見Data aRepresentationandStorage e小節(jié)最后關(guān)于文件結(jié)構(gòu)的討論) 使用標準的NVT-ASCII I表示法意味著必須將8位數(shù)據(jù)看作一個字節(jié)。 ASCII I和EBCDIC C類型的格式參數(shù)將在下面討論,。3.1.1.2.EBCDIC EBCDICTYPE) 當某些主機采用EBCDIC C作為內(nèi)部字符表示法時,,EBCDIC C可用于此類主機間的高效數(shù)據(jù)傳輸。 為進行傳輸,,數(shù)據(jù)被表示為8位EBCDIC C字符序列,。EBCDIC C和ASCII I類型的唯一區(qū)別在于字符編碼。 EBCDIC C類型中很少使用行結(jié)束符(end-of-line),,但使用換行符<NL>,。3.1.1.3. 圖像IMAGETYPE) 圖像類型數(shù)據(jù)被看作連續(xù)的位,這些位被打包成8位傳輸字節(jié),,以便進行傳輸,。接收方須將這些數(shù)據(jù)存儲為連續(xù)的位。存儲系統(tǒng)的結(jié)構(gòu)可能要求對文件或文件中的記錄進行填充,,使得文件或記錄處于字節(jié),、字或塊的邊界上。填充字節(jié)全為0,,僅在文件或記錄的末尾用到,。對于填充字節(jié),必須有一種識別方法,,在重新獲取文件時可將其剔除,。填充字節(jié)的轉(zhuǎn)換必須實現(xiàn),使得用戶可以進行文件存儲,。 圖像類型用于高效存儲,、文件檢索以及二進制數(shù)據(jù)的傳輸。建議所有的FTP P都應具有處理圖像類型的能力,。 3.1.1.4. 本地類型(LOCALTYPE) 此類型數(shù)據(jù)以邏輯字節(jié)進行傳輸,,字節(jié)大小由第二個參數(shù)指定。參數(shù)二的值必須是十進制整數(shù),,且沒有默認值,。邏輯字節(jié)不必與傳輸字節(jié)大小相同。若這兩種字節(jié)大小不同,,那么應將數(shù)據(jù)連續(xù)的包裝成邏輯字節(jié),,而不考慮傳輸字節(jié)的邊界,末尾也無需進行字節(jié)填充,。 當數(shù)據(jù)到達接收方主機時,,將按某種方式進行轉(zhuǎn)換,這取決于邏輯字節(jié)大小和特定的主機,。這種轉(zhuǎn)換必須是可逆的(若使用相同參數(shù),,獲取到的文件也應相同),所有的FTP P應該實現(xiàn)此種轉(zhuǎn)換,。 例如,,將36 6位浮點數(shù)發(fā)送到32 2位字長的主機時,數(shù)據(jù)應當按本地類型傳輸,,邏輯字節(jié)為36 6位,。接收方主機存儲這些邏輯字節(jié)以便它們能更容易被操作; ,;此例將36 6位邏輯字節(jié)放入64 4位雙字中就足夠了,。 另一個例子,兩臺36 6位字長的主機,,彼此間使用TYPEL36 6按字傳輸數(shù)據(jù),。數(shù)據(jù)將按8 8位傳輸字節(jié)打包傳輸,如此,,9 9個傳輸字節(jié)可以運載2 2個字,。3.1.1.5. 格式控制FORMATCONTROL) ASCII I和EBCDIC C類型都接受第二個可選參數(shù),指出了與文件相關(guān)聯(lián)的垂直格式控制,。 向主機傳輸一個字符文件,,目的有三個:打印,存儲及以后的獲取,,處理,。若傳輸?shù)奈募糜诖蛴。邮辗街鳈C必須知道垂直格式控制是如何表示的,。對于第二個目的,,文件存儲在主機上以后,必須能夠原樣取回,。最后,,當文件從一臺主機傳輸?shù)搅硪慌_后,,應可以在第二臺主機上順利的處理它。單獨的ASCII I或EBCDIC C格式無法滿足所有的情況,。因此,,這些類型具有第二個參數(shù),用來說明下列三種格式:3.1.1.5.1.NONPRINT 若省略第二個格式參數(shù),,NONPRINT T將是默認使用的參數(shù),。所有FTP P必須實現(xiàn)Non-print t格式。 該文件無需包含垂直格式信息,。若將此文件傳給了printerprocess,,此process s可能采用空格和邊距的標準值。 通常,,NONPRINT T格式適用于僅執(zhí)行處理或存儲操作的文件,。 3.3.3.3.1.1.1.1.1.1.1.1.5.5.5.5.2.2.2.2.TTTTeeeellllnnnneeeetttt格式控制(TELNETFORMATCONTROLS) ) printerprocess s能夠正確地解釋文件中的ASCII/EBCDIC C垂直格式控制,例如<CR>,<LF>,<NL>,<VT>,<FF>,。<CRLF>表示行結(jié)束,。 3.1.1.5.3.CARRIAGECONTROL(ASA) 文件包含ASA(FORTRAN N)垂直格式控制字符。按照ASA A標準格式化后,, ,,行或記錄的第一個字符不打印,此字符用于確定紙張的垂直移動,,紙張移動發(fā)生在剩余內(nèi)容打印之前,。ASA A標準指定了下列控制字符: 字符 垂直間距 空白 將紙張向上移動一行 0 0 將紙張向上移動兩行 1 1 將紙張移動到下一頁的頂部 + + 無移動,比如套印 很明顯,,必須有一些方法使得打printerprocess s能夠辨別結(jié)構(gòu)實體的末端,。對于記錄結(jié)構(gòu)的文件不存在任何問題;在傳輸和存儲的過程中記錄將被明確的標記,。若文件不是記錄結(jié)構(gòu),,<CRLF>行結(jié)束符序列用于分割printinglines s,但這些格式控制字符被ASA A控制符覆蓋,。 3.3.3.3.1.1.1.1.2.2.2.2.數(shù)據(jù)結(jié)構(gòu)(DATASTRUCTURES) ) 除了不同的表示類型外,,F(xiàn)TP P允許指定文件的結(jié)構(gòu)。FTP P定義了三種文件結(jié)構(gòu): file-structure e沒有內(nèi)部結(jié)構(gòu),,文件被看作是數(shù)據(jù)字節(jié)的連續(xù)序列,。 record-structure e文件由若干有序記錄組成。 page-structure e文件由獨立的若干索引頁組成,。 如果STRUcture e命令未被使用,,默認為file-structure,但是對于文本文件(例如ASCII I或EBCDIC C類型)來說,,所有的FTP P必須實現(xiàn)file-structure e和record-structure,。 文件的固有結(jié)構(gòu)取決于存儲它的主機類型,。在IBM M大型機上source-code e文件以定長記錄的形式存儲,但在DECTOPS-20 0上以字符流存儲,,字符流被CRLF F分割成多行,。若文件在這不同的主機之間傳輸,,必須有一些方法使得一臺主機可以識別另一臺主機的文件結(jié)構(gòu),。 若將某種結(jié)構(gòu)的文件傳輸?shù)街С至硪环N文件結(jié)構(gòu)的主機上,可能會出現(xiàn)問題,。如果文本文件以record-structure e傳輸?shù)街С謋ile-structure e的主機上,,那么該主機應對此文件做一個內(nèi)部轉(zhuǎn)換。顯然,,此轉(zhuǎn)換是有用的,,同時必須可逆,以便按record-structure e重新得到原文件,。 當文件以file-structure e傳輸?shù)街С謗ecord-structure e的主機上時,,這就出現(xiàn)一個問題,主機如何將文件分割成若干record,。如果必須分割,,F(xiàn)TP P應該使用end-of-line e序列,ASCII I使用<CRLF>,,EBCDIC C使用<NL>作為定界符,。如果采用這種技術(shù),那么當以file-structure e重新獲取文件時,,F(xiàn)TP P必須支持逆變換,。3.1.2.1. 文件結(jié)構(gòu)(FILESTRUCTURE) STRUcture e命令未被使用時,默認為file-structure,。file-structure e不存在內(nèi)部結(jié)構(gòu),,此結(jié)構(gòu)的文件被看作是連續(xù)的數(shù)據(jù)字節(jié)序列。 3.1.2.2. 記錄結(jié)構(gòu)(RECORDSTRUCTURE) 對于文本文件(例如ASCII I或EBCDIC C類型的文件)來說,,所有的FTP P必須支持record-structure,。具有record-structure e結(jié)構(gòu)的文件由若干有序的record d組成。3.1.2.3. 頁PAGESTRUCTURE) 為傳輸不連續(xù)的文件,,F(xiàn)TP P定義了pagestructure,。此類文件有時被叫做"randomaccessfiles"或者也稱為"holeyfiles"。傳輸這些文件時,,需要添加一些附加信息:為整個文件添加filedescriptor r,,為文件的一個section n添加pageaccess scontrols s,或者兩者同時添加,。在FTP P中,,文件的section n稱為page,。為提供各種page e大小和相關(guān)信息,每一page e在傳輸時都帶有一個pageheader,。Pageheader r包含下列定義域: HeaderLength h–pageheader r的邏輯字節(jié)數(shù)(包括此字節(jié)),,headerlength h最小值為4。 PageIndex x– –邏輯頁編號,,而非此頁的傳輸序列號,,此編號用于識別文件中的頁。 DataLength h– –頁中的邏輯字節(jié)數(shù),,最小值為0,。 PageType e– –頁類型。 ,。頁類型定義如下: : 0=LastPage e用于指明傳輸過程的結(jié)束,。Headerlength h必須為4,data alength h必須為0,。 1=SimplePage e 常規(guī)類型,,用于不含頁級訪問控制信息的簡單頁文件。Headerlength h必須為4,。2=DescriptorPage e 用于傳輸文件整體的描述信息,。 3=AccessControlledPage e 對于具有頁級訪問控制信息的文件來說,此類型頁包含一個附加的headerfield,。Headerlength h必須為5,。 OptionalFields s–Furtherheaderfields,可能用于提供每一頁的控制信息,,例 如每頁的訪問控制,。所有的域在長度上都是一個邏輯字節(jié)。邏輯字節(jié)的大小由TYPE E命令指定,。參數(shù)警告:如果想得到與初始的傳輸文件完全相同的文件,,所需參數(shù)應同存 儲文件時用到的一樣。反之,,若使用相同的參數(shù)來存儲和獲取文件,,那么FTP P必須返回與原文件完全相同的文件。 3.2. 建立數(shù)據(jù)連接(ESTABLISHINGDATACONNECTIONS) 傳輸數(shù)據(jù)的過程包括在合適的端口建立數(shù)據(jù)連接,,選擇傳輸參數(shù),。User r和server-DTP P都有一個默認的數(shù)據(jù)端口。User-process s的默認數(shù)據(jù)端口與控制連接端口(即U)相同,。Server-process s的默認數(shù)據(jù)端口與控制連接端口(即L-1 1)鄰近,。 傳輸字節(jié)大小為8 8位。傳輸字節(jié)大小僅和實際的數(shù)據(jù)傳輸有關(guān),與主機文件系統(tǒng)中數(shù)據(jù)的表示無關(guān),。 被動DTP P(可能是一個user-DTP P或server-DTP P)在發(fā)送傳輸請求命令前,,必須在數(shù)據(jù)端口上偵聽。請求命令決定了數(shù)據(jù)傳輸?shù)姆较?。依?jù)收到的傳輸請求,, ,server r向特定端口發(fā)起數(shù)據(jù)連接,。當連接建立后,,DTP P之間開始數(shù)據(jù)傳輸,server-PI I給user-PI I發(fā)送一個確認應答,。 所有FTP P必須支持默認數(shù)據(jù)端口的使用,,僅有user-PI I能修改為非默認端口。 User r可以通過PORT T命令指定一個備用數(shù)據(jù)端口,。User r可能想將文件傳到TAClineprinter r或者從第三方主機獲取一個文件。在后一種情況中,,user-PI I與兩個server-PI I建立控制連接,。其中一個server r(通過一個FTP P命令)被告知偵聽另一個server r發(fā)起的連接。User-PI I向一個server-PI I發(fā)送PORT命令,,指明另一個server r的數(shù)據(jù)端口,。最后,兩個server r就可以互相發(fā)送傳輸命令了,。User-controller r和server r之間發(fā)送的命令和應答序列在FTPReplies s一節(jié)中定義,。 一般來說,server r負責數(shù)據(jù)連接的發(fā)起和關(guān)閉,,有一種情況例外,,當user-DTP P正在發(fā)送數(shù)據(jù)時需要關(guān)閉連接來表示文件結(jié)束。遇到下列情況server r必須關(guān)閉數(shù)據(jù)連接: 1,、server r已經(jīng)完成數(shù)據(jù)傳輸,,需要關(guān)閉連接以表明文件結(jié)束。 2,、server r收到了來自user r的ABORT T命令,。 3、默認端口被用戶命令改變,。 4,、控制連接被關(guān)閉 5、發(fā)生了不可恢復的錯誤,。 其它情況下,,server r可選擇是否關(guān)閉數(shù)據(jù)連接,server r必須向user-process s發(fā)送250 0或226 6應答。3.3. 的管理DATACONNECTIONMANAGEMENT) 默認的數(shù)據(jù)連接端口:所有FTP P必須支持默認數(shù)據(jù)連接端口的使用,,僅有user-PI I可以使用非默認端口,。 非默認數(shù)據(jù)端口的協(xié)商:user-PI I可通過PORT T命令指定一個非默認的user rside e數(shù)據(jù)端口。User-PI I可通過PASV V命令請求server r識別非默認serverside e數(shù)據(jù)端口,。因為連接由地址對確定,,僅執(zhí)行PORT T和PASV V其中一個就足以獲得一個不同的數(shù)據(jù)連接。但是允許這兩個命令全部執(zhí)行,,這樣可在數(shù)據(jù)連接的兩端全部使用新的端口,。 數(shù)據(jù)連接的重用:當使用流模式傳輸數(shù)據(jù)時,必須通過關(guān)閉連接來表明文件結(jié)束,。由于TCP P需要將連接保持一個超時周期來保證通信的可靠,,因而當一個會話中有多個文件需要傳輸時,會造成問題:無法立即重新打開連接,。 對這個問題,,有兩種解決方案:協(xié)商一個非默認端口,或者使用另一種傳輸 模式,。 關(guān)于傳輸模式的評論,。流傳輸模式與生俱來是不可靠的,因為它不能確定連接是否過早的被關(guān)閉,。其它傳輸模式(Block,Compressed)不通過關(guān)閉連接來表明文件結(jié)束,,它們有足夠的FTPencoding g來解析數(shù)據(jù)連接,以確定文件是否結(jié)束,。因此使用這些模式就能在傳輸多個文件時保持數(shù)據(jù)連接的打開,。3.4. 傳輸模式(TRANSMISSIONMODES) 傳輸數(shù)據(jù)還需要選擇合適的傳輸模式。有三種模式:第一種,,將數(shù)據(jù)格式化,, ,允許重啟程序,;第二種,,為高效傳輸而將數(shù)據(jù)壓縮;第三種,,傳輸數(shù)據(jù)時,,僅做極少的或不做處理。在最后一種情況中,,傳輸模式與數(shù)據(jù)結(jié)構(gòu)共同決定了處理操作的類型,。在壓縮模式中,表示類型(representationtype e)決定了填充字節(jié)(filler rbyte),。 所有的數(shù)據(jù)傳輸在文件結(jié)束時完成,,end-of-file(EOF F)可以明確地給出,,或者通過關(guān)閉數(shù)據(jù)連接來表示。對于recordstructure e類型的文件,,所有的end-of-record(EOR)標記都是明確給出的,,包括最后一個。對于pagestructure e文件,,傳輸結(jié)束時使用last-page e頁類型,。 注意:在本節(jié)其余內(nèi)容里,byte e是指傳輸字節(jié),,除非有明確的說明,。 為使傳輸合乎標準,發(fā)送主機將end-of-line e或end-of-record d符號的內(nèi)部表示法轉(zhuǎn)變?yōu)橛蓚鬏斈J郊拔募Y(jié)構(gòu)規(guī)定的表示法,,接收主機將執(zhí)行逆變換,。IBM M大型機的recordcount t域可能不被其它主機識別,因此end-of-record d信息在流模式中被當作兩個字節(jié)控制碼傳輸,,在Block k或Compressed d模式中被當作描述符的一個標志位,。ASCII I或EBCDIC C文件不具有recordstructure,其中的end-of-line e應當分別通過<CRLF>或<NL>來表示,。對于某些系統(tǒng),,這些轉(zhuǎn)換意味著額外的工作,同類型的系統(tǒng)之間傳輸非記錄結(jié)構(gòu)的文本文件時,,可能希望使用二進制表示法和流傳輸模式。 下列傳輸模式定義于FTP P中: 3.3.3.3.4.4.4.4.1.1.1.1.流模式(STREAMMODE) ) 數(shù)據(jù)以字節(jié)流傳輸,。不限制表示類型,,允許recordstructure。 在recordstructure e文件中,,EOR R和EOF F分別用一個兩字節(jié)控制碼表示,。控制碼的第一個字節(jié)都一樣,,為轉(zhuǎn)義字符,。對于EOR R,第二個字節(jié)的低階位(low worderbit t)為1,,其余位全0,;對于EOF F,第二字節(jié)的次低階位(secondloworder rbit t)為1,,其余位為0,;也就是說,對于EOR R和EOF F,,第二字節(jié)的值分別為1 1和2,。將第二字節(jié)的最后兩位置1(也即值為3),可同時表示EOR R和EOF。Ifa abyte eof fall lones swas sintended dto obe esent tas sdata, ,it tshould dbe erepeated din nthe esecond dbyteofthecontrolcode. . 在filestructure e文件中,,發(fā)送主機關(guān)閉數(shù)據(jù)連接就表示EOF,。所有字節(jié)都是數(shù)據(jù)字節(jié)。 3.3.3.3.4.4.4.4.2.2.2.2.塊模式(BLOCKMODE) ) 文件以一系列數(shù)據(jù)塊傳輸,,數(shù)據(jù)塊頭部加上了一個或多個headerbytes,。Headerbyte e包含一個countfield d和descriptorcode。Countfield d指明了數(shù)據(jù)塊的字節(jié)總數(shù),,因而也標記了下一個數(shù)據(jù)塊(無填充字節(jié))的開始位置,。descriptorcode e定義了如下內(nèi)容:文件的最后一個塊(EOF),記錄的最后一個塊(EOR),,restart tmarker r(見ErrorRecoveryandRestart t一節(jié)),,suspectdata a(也即傳輸?shù)臄?shù)據(jù)不可靠,被懷疑有錯誤),。其中suspectdata a不是用于FTP P錯誤控制的,。它是出于主機交換某類型數(shù)據(jù)(例如地震或天氣數(shù)據(jù))的要求:收發(fā)所有的數(shù)據(jù)而忽略本地錯誤(比如磁帶讀錯誤),但在傳輸過程中指明某些部分是不可信的,。塊模式允許record dstructure,,可以使用任何表示類型。 Header r包含三個字節(jié),。在header r的24 4個位中,,低16 6位表示bytecount,高8 8位表示descriptorcodes,,如下所示,。 descriptorcodes s由descriptor r字節(jié)的標志位指出,共有4 4個code,,每一個code e 編號以十進制表示,。 Code e Meaning g 128 8 數(shù)據(jù)塊結(jié)尾是EOR R 64 4 數(shù)據(jù)塊結(jié)尾是EOF F 32 2 數(shù)據(jù)塊中的可疑錯誤 16 6 數(shù)據(jù)塊是一個restart tmarker r 依上述編碼,一個塊可以有多種狀態(tài),。按照需要設(shè)置相應的位,。restartmarker r作為一個整數(shù)(8-bitbytes s)嵌入到數(shù)據(jù)流中,marker r中的字節(jié)都是可打印字符,,restartmarker r內(nèi)不能使用<SP>(空格),。例如,傳輸一個六字符marker,,下列內(nèi)容將被傳輸: 3.3.3.3.4.4.4.4.3.3.3.3.壓縮模式(COMPRESSEDMODE) ) 有三種信息將被發(fā)送:常規(guī)數(shù)據(jù),,按字節(jié)串發(fā)送;壓縮數(shù)據(jù),,由replications s或填充字節(jié)組成,;控制信息,,以兩字節(jié)轉(zhuǎn)義序列的方式發(fā)送。如果有n(0<n<127) )個字節(jié)的常規(guī)數(shù)據(jù)被發(fā)送,,在這n n個字節(jié)之前加上一個字節(jié),,該字節(jié)的最左邊一位置0,右邊7 7位表示數(shù)n,。 n 個數(shù)據(jù)字節(jié)d(1),...,d(n),,n必須是正數(shù)。為壓縮傳輸n個重復的數(shù)據(jù)字節(jié)d,,發(fā)送下面2 2個字節(jié): N N 個填充字節(jié)可被壓縮成一個字節(jié),,填充字節(jié)依表示類型而變化。若類型為ASCII I或EBCDIC,,填充字節(jié)是<SP>(空格,,ASCII I碼32,EBCDIC C碼64),。若類型是Image e或Local,,填充字節(jié)是0。 轉(zhuǎn)義序列是雙字節(jié),,字節(jié)1 1是轉(zhuǎn)義字節(jié)(全0),,字節(jié)2包含descriptorcodes。此處descriptorcodes s與塊模式中的定義相同,,并應用于隨后的字節(jié)串,。 壓縮模式有助于增加帶寬,在網(wǎng)絡傳輸中僅需要一點點額外的CPU U開銷,。它可以有效地減小printerfiles s的大小,,比如由遠程作業(yè)輸入(RJE E)主機生成的文件。3.5. 錯誤恢復與重啟(ERRORRECOVERYANDRESTART) 數(shù)據(jù)傳輸過程中無法檢測位丟失和亂序,;此級別的錯誤控制由TCP P處理。盡管如此,,重啟過程用于保護用戶免受顯而易見的系統(tǒng)故障(包括主機,、FTP-process s或者底層網(wǎng)絡的故障)。 重啟過程僅用于塊或流模式的數(shù)據(jù)傳輸,。它要求發(fā)送者向數(shù)據(jù)流中插入一個 特殊的markercode,。Marker信息僅對發(fā)送者有意義,但必須是可打印字符,。Marker r可以表示一個bit-count,,一個record-count,或者其它任何信息,,系統(tǒng)利用marker r來識別一個數(shù)據(jù)檢查點,。若接收者支持重啟過程,,將在數(shù)據(jù)流中標記出此marker r的相應位置,并且向user r返回此信息,。 如果系統(tǒng)發(fā)生故障,,user r可通過識別markerpoint,利用FTPrestartprocedure e重啟數(shù)據(jù)傳輸,。下面的例子說明了restartprocedure e的使用,。 發(fā)送者在數(shù)據(jù)流的某個點插入一個適當?shù)膍arker r塊。接收方主機在其文件系統(tǒng)內(nèi)標記相應的數(shù)據(jù)點,,并且將最后一個已知的發(fā)送者和接收者marker r信息傳達給user,,傳達方式要么是直接的,要么通過控制連接上的一個110 0應答,,這取決于誰是發(fā)送者,。若發(fā)生系統(tǒng)故障,user r或者controllerprocess s通過發(fā)送重啟命令在最后一個servermarker r點重啟server r,,重啟命令的參數(shù)為server r的marker rcode,。重啟命令在控制連接上傳輸,緊隨其后的命令如RETR,、STOR R或LIST,, ,這些命令在系統(tǒng)發(fā)生故障時執(zhí)行,。4. 文件傳輸功能(FILETRANSFERFUNCTIONS) ) 從user-PI I到server-PI I的通信信道是TCP P連接,。User-PI I負責發(fā)送FTP P命令及解釋收到的應答;server-PI I解釋命令,,發(fā)送應答,,指導其DTP P建立數(shù)據(jù)連接及傳輸數(shù)據(jù)。在被動傳輸過程中,,一方是server-DTP,,如果第二方是user-DTP, ,,那么它被user-FTP P主機通過內(nèi)部協(xié)議進行管理,;若第二方同樣是server-DTP,那么它被其PI I按照來自user-PI I的命令進行管理,。FTP P應答在下一節(jié)中討論,。此節(jié)中描述的幾個命令,有助于明確可能的應答,。4.1.FTP 命令(FTPCOMMANDS) 4.4.4.4.1.1.1.1.1.1.1.1. 訪問控制命令(ACCESSCONTROLCOMMANDS) ) 下列命令指定了訪問控制標識符(命令碼顯示在括號中),。 USERNAME(USER) ) 參數(shù)域是標識user r的Telnet t串。Server r需要user r標識來訪問其文件系統(tǒng),。當控制連接建立后(一些server r需要這樣),,此命令通常是user r傳送的第一個命令,。某些server r還需要額外的標識信息(以password d或account t命令的形式)。Server r允許在任何時候輸入新的USER R命令,,以改變訪問控制或accounting ginformation,。這會沖掉任何user、密碼和accountinformation,,再次啟動登錄過程,。所有的傳輸參數(shù)未變,任何正在進行的文件傳輸按照原來的訪問控制參數(shù)完成,。 PASSWORD(PASS) ) 參數(shù)域是一個Telnet t串,,指明了用戶密碼。此命令必須緊跟在USER R命令之后,,完成user r的識別,,進行訪問控制。因為密碼信息非常敏感,,通常應掩蓋它 或禁止屏幕顯示,。server r沒有十分安全的方法來完成此任務,因此user-FTPprocess s有責任隱藏敏感的密碼信息,。 ACCOUNT(ACCT) ) 參數(shù)域是標識用戶賬戶的Telnet t串,。此命令與USER R命令沒有必然聯(lián)系,一些主機可能需要一個account t用于登錄,,另一些僅用于特定的訪問,,比如存儲文件。對于后一種情況,,此命令可能隨時到達,。 有一些應答碼用于自動區(qū)分這些情況:當account t信息用于登錄時,成功執(zhí)行PASSword d命令的應答碼為332,。另一方面,,若登錄不需要account t信息,成功執(zhí)行PASSword d命令的應答碼是230,;若在以后的對話中發(fā)出了一個命令,,需要account t信息,server r應該返回應答碼332 2或532,,這取決于server r是存儲(pending greceiptoftheACCounTcommand) )還是丟棄此命令。 CHANGEWORKINGDIRECTORY(CWD) ) 此命令允許用戶改變工作目錄或dataset,,進行文件存取,,無須改變其登錄或accounting g信息。傳輸參數(shù)同樣不變,。此命令的參數(shù)為目錄路徑名或其它與系統(tǒng)相關(guān)的文件組標志符,。 CHANGETOPARENTDIRECTORY(CDUP) ) 此命令是CWD D的特例,,在具有不同父目錄命名語法的操作系統(tǒng)間傳輸目錄樹時,此命令可簡化程序的實現(xiàn),。應答碼與CWD D的應答碼相同,。更多細節(jié)見附錄II I。 STRUCTUREMOUNT(SMNT) ) 此命令允許user r裝載一個不同的文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu),,無須改變其登錄或accounting g信息,,傳輸參數(shù)同樣未變。此命令的參數(shù)為目錄的路徑名或其它與系統(tǒng)相關(guān)的文件組標志符,。 REINITIALIZE(REIN) ) 此命令終止USER R,,沖掉所有的I/O O和accountinformation n,但允許執(zhí)行完正在進行的傳輸,。所有的參數(shù)重置為默認值,,控制連接保持打開。Thisisidenticalto othe estate ein nwhich ha auser rfinds shimself fimmediately yafter rthe econtrol lconnection nis sopened.USER R命令應該緊跟REIN N之后,。 LOGOUT(QUIT) ) 此命令終止USER R,,若沒有文件在傳輸,server r關(guān)閉控制連接,。若有文件正在傳輸,,連接將保持打開直至有響應結(jié)果,此時server r將關(guān)閉連接,。如果user-process s正在給若干個USER R傳輸文件,,但不愿關(guān)閉連接然后重新打開,那 么應該使用REIN命令來取代QUIT,。若控制連接意外關(guān)閉,,server r將執(zhí)行ABOR R和QUIT T命令。 4.4.4.4.1.1.1.1.2.2.2.2.傳輸參數(shù)命令(TRANSFERPARAMETERCOMMANDS) ) 所有的數(shù)據(jù)傳輸參數(shù)都有缺省值,,僅當改變?nèi)笔?shù)值時,,才需要執(zhí)行用于指定傳輸參數(shù)的命令,最后給定的值將被作為缺省值,。若傳輸數(shù)據(jù)時未指定傳輸參數(shù),,則標準缺省值如上所述。這意味著sever r必須記住可用的缺省值,。傳輸參數(shù)命令可按任何順序執(zhí)行,,但必須在FTPservice e請求之前。下列命令指定了數(shù)據(jù)傳輸參數(shù): DATA APORT(PORT) ) 其參數(shù)說明了用于數(shù)據(jù)連接的數(shù)據(jù)端口,。User r和server r都有默認的數(shù)據(jù)端口,,正常情況下,不需要此命令及其應答,。若使用了該命令,,其參數(shù)是32 2位因特網(wǎng)主機地址加上16 6位TCP P端口地址,。地址信息被分割為多個8 8位的域,每個域的值被轉(zhuǎn)換為一個十進制數(shù)(以字符串的形式表示),。所有的域以逗號隔開,。PORT命令如下: PORTh1,h2,h3,h4,p1,p2 2 其中,h1 1是因特網(wǎng)主機地址的高8位,。 PASSIVE(PASV) ) 此命令請求server-DTP P在某個數(shù)據(jù)端口(非默認端口)上偵聽,,等待連接, ,,而不是收到傳輸命令時發(fā)起連接,。此命令的響應包含server r正在偵聽的主機和端口的地址。 REPRESENTATIONTYPE(TYPE) ) 其參數(shù)指明了表示類型(DataRepresentationandStorage e一節(jié)中有描述),。某些類型需要第二個參數(shù),。參數(shù)一用一個單獨的Telnet t字符表示,如同ASCII I和EBCDIC C的第二個格式參數(shù),;參數(shù)二是一個十進制整數(shù),,用于指出本地字節(jié)的大小。兩個參數(shù)用<SP>分割(空格,,ASCII I碼32),。 類型碼如下: 默認的表示類型是ASCIINon-print。如果格式參數(shù)發(fā)生改變,,只是第一個參數(shù)被改變,,那么格式將恢復到默認的Non-print。 FILESTRUCTURE(STRU) ) 其參數(shù)是一個單獨的Telent t字符,,指明了文件的結(jié)構(gòu)(在DataRepresentation nandStorage e一節(jié)中有描述),。 文件結(jié)構(gòu)的編碼如下: F-File(norecordstructure) )R-Recordstructure eP-Pagestructure e 默認結(jié)構(gòu)是File。 TRANSFERMODE(MODE) ) 其參數(shù)是一個單獨的Telnet t字符,,指明了數(shù)據(jù)傳輸模式(在Transmission nModes s一節(jié)中描述),。 傳輸模式的編碼如下: S-Stream mB-Block kC-Compressed d 默認傳輸模式是Stream。 4.4.4.4.1.1.1.1.3.3.3.3.FFFFTTTTPPPP服務命令(FTPSERVICECOMMANDS) ) FTPservice e命令定義了文件傳輸或者用戶請求的文件系統(tǒng)功能,。FTPservice e命令的參數(shù)正常情況下是一個路徑名,。路徑名的語法必須符合server r的約定及控制連接的約定。默認使用最后指定的設(shè)備,、目錄或文件名,,或者本地缺省值。此類命令可按任意次序執(zhí)行,,例外情況:renamefrom m命令之后必須是renameto o命令,,restart t命令后必須是中斷服務命令(例如STOR R或者RETR)。為響應FTP Pservice e命令而傳輸?shù)臄?shù)據(jù),總是通過數(shù)據(jù)連接發(fā)送,,某些informativereplies s除外。下列命令說明了FTPservice e請求: RETRIEVE(RETR) ) 此命令要求server-DTP P向數(shù)據(jù)連接另一端的server-或user-DTP P傳輸一個由pathname e指定的文件的拷貝,。Server r上原文件的狀態(tài)和內(nèi)容應不受影響,。 STORE(STOR) ) 此命令請求server-DTP P接收由數(shù)據(jù)連接傳來的數(shù)據(jù),并將這些數(shù)據(jù)以文件的形式存儲在server r上,。若指定的文件路徑名在server r上已存在,,其內(nèi)容將被這些數(shù)據(jù)替換。若指定的文件路徑名不存在,,將在server r上創(chuàng)建一個新文件,。 STOREUNIQUE(STOU) ) 此命令同STOR R一樣,有一點除外:文件在當前目錄下以唯一的名字創(chuàng)建,。TransferStarted d的響應(250)必須包含生成的文件名,。 APPEND(withcreate)(APPE) ) 此命令請求server-DTP P接收由數(shù)據(jù)連接傳來的數(shù)據(jù),并將這些數(shù)據(jù)以文件的形式存儲在server r上,。若server r上存在指定的文件路徑名,,數(shù)據(jù)將被附加到該文件中;否則將按指定的路徑名在server r上創(chuàng)建一個文件,。 ALLOCATE(ALLO) ) 某些server r可能需要此命令來預留足夠的空間,,以便容納傳輸來的新文件。其參數(shù)是一個十進制整數(shù),,表示預留給新文件的存儲字節(jié)數(shù),。對于按record d或page e結(jié)構(gòu)傳輸?shù)奈募瑀ecord d或page e尺寸(以邏輯字節(jié)計)的最大值可能同樣需要,,此命令的第二個參數(shù)指明了這個值(十進制整數(shù)),。參數(shù)二是可選的,與參數(shù)一通過三個Telnet t字符<SP>R<SP> >進行分割,。此命令之后應該緊跟著一個STORe e或APPEnd d命令,。對于那些不必事先聲明文件最大值的server r,或者僅對record d或page e的尺寸最大值感興趣的server,,ALLO O命令被當作一個NOOP P(無操作)命令,,第二類server r將參數(shù)一視為假值并忽略它。 RESTART(REST) ) 其參數(shù)表示servermarker r,,將在此處重啟文件傳輸,。此命令不會啟動文件傳輸,只是定位到指定的數(shù)據(jù)檢查點,。此命令之后應該緊跟著適當?shù)腇TPservice e命令,,用于啟動文件傳輸。 RENAMEFROM(RNFR) ) 此命令指定了重命名文件的舊路徑名。該命令之后必須緊跟著一個renameto o命令,,用于指定新的文件路徑名,。 RENAMETO(RNTO) ) 此命令指定了重命名文件的新路徑名,與RNFR R命令一起完成文件重命名,。 ABORT(ABOR) ) 此命令告知server r中止先前的FTPservice e命令以及與之相關(guān)的數(shù)據(jù)傳輸,。中止命令可能需要特殊的動作(依照FTPCommands s一節(jié)中的討論)來強制server r做出識別。如果先前的命令已經(jīng)完成(包括數(shù)據(jù)傳輸),,則不執(zhí)行任何特殊動作,。Server r不關(guān)閉控制連接,但必須關(guān)閉數(shù)據(jù)連接,。 Server r收到此命令時,,有兩種情況:FTPservice e命令已經(jīng)完成,或者正在執(zhí) 行當中,。 在第一種情況中,,server r關(guān)閉數(shù)據(jù)連接(若是打開狀態(tài)),發(fā)出應答碼226,, ,,表明abort t命令成功執(zhí)行。 第二種情況,,server r中止正在執(zhí)行的FTPservice e,,關(guān)閉數(shù)據(jù)連接,返回應答碼426,,表明service e請求非正常結(jié)束,。接著server r發(fā)送應答碼226,表明abort t命令成功執(zhí)行,。 DELETE(DELE) ) 此命令依給定的pathname e刪除server r上的文件,。若要求額外的保護,比如“確信要刪除嗎,?”,,這應該由user-FTPprocess s提供。 REMOVEDIRECTORY(RMD) ) 此命令依給定的pathname e移除相應的目錄,,pathname e可以是絕對路徑或相對路徑,。見附錄II I。 MAKEDIRECTORY(MKD) ) 此命令依給定的pathname e創(chuàng)建一個目錄,,pathname e可以是絕對目錄或相對目錄,。見附錄II I。 PRINTWORKINGDIRECTORY(PWD) ) 此命令將在reply y中返回當前工作目錄的名稱,。見附錄II I,。 LIST(LIST) ) 此命令從server r向passiveDTP P發(fā)送一個列表,。如果pathname e指定了一個目錄或其它的文件組,server r應該傳輸指定目錄的一個文件列表,。如果pathname e指定了一個文件,,server r應當發(fā)送文件的當前信息。若參數(shù)為null l意味著用戶的當前工作目錄或缺省目錄,。數(shù)據(jù)以ASCII I或EBCDIC C類型在數(shù)據(jù)連接上傳輸,。 (用戶必須保證TYPE E是ASCII I或EBCDIC)。因為文件信息隨著系統(tǒng)的不同而不同,, ,很難被程序自動使用,,但對人類用戶非常有用,。 NAMELIST(NLST) ) 此命令從server r向用戶發(fā)送一個目錄列表。Pathname e應當給出一個目錄或其它系統(tǒng)特有的文件組描述符,;參數(shù)為null l是指當前目錄,。Server r將返回一個文件名稱流,而沒有其它信息,。數(shù)據(jù)將按ASCII I或EBCDIC C類型通過數(shù)據(jù)連接進行傳輸,,<CRLF> >或<NL> >將這些數(shù)據(jù)分割為有效的路徑名字符串。(用戶必須保證TYPE E是正確的),。此命令返回的信息能夠被程序使用,,以便進一步自動處理這些文件,例如,,用于“multipleget t”功能的實現(xiàn),。 SITEPARAMETERS(SITE) ) Server r使用此命令提供針對自身系統(tǒng)的service e,這些service e對于數(shù)據(jù)傳輸是必要的,,但不具有普遍性,,不能作為協(xié)議中的命令。這些service e的本性以及它們的語法規(guī)格在HELPSITE E命令的響應中有陳述,。 SYSTEM(SYST) ) 此命令用于獲取server r操作系統(tǒng)的類型,。 STATUS S(STAT) ) 此命令將以應答的形式通過控制連接發(fā)送一個狀態(tài)響應。此命令可在一個文件傳輸過程中發(fā)送(連同TelnetIP P和同步信號一起—見FTPCommands s一節(jié)),, ,,此時server r將以正在執(zhí)行的操作的狀態(tài)作為回復;STAT T也可在多個文件傳輸過程中發(fā)送,。在后一種情況下,,STAT T命令有一個參數(shù)。若此參數(shù)是一個pathname,, ,,STAT T與list t命令相似,,只不過數(shù)據(jù)通過控制連接進行傳輸。如果只給出了部分pathname,,server r可能返回與之相關(guān)的文件名或?qū)傩粤斜?。若沒有給出參數(shù),應當返回serverFTPprocess s的一般狀態(tài)信息,,包括所有傳輸參數(shù)的當前值和連server接狀態(tài),。 HELP(HELP) ) 此命令請求server r通過控制連接向用戶發(fā)送有關(guān)其實現(xiàn)狀態(tài)(implementation nstatus s)的幫助信息。HELP P命令可以有一個參數(shù)(例如任何一個命令名),,并且返回更多的詳細信息,。應答碼是211 1或214。建議在輸入USER R命令之前允許HELP P命令的執(zhí)行,。Server r可以利用此應答來列舉站點依賴(site-dependent t)的參數(shù),,例如對HELPSITE E的響應。 NOOP(NOOP) ) 此命令不影響任何參數(shù)或以前輸入的命令,。它不執(zhí)行動作,,僅server r發(fā)送一個OK K應答。 對控制連接上的所有通信,,F(xiàn)TP P遵循Telnet t協(xié)議規(guī)范,。 FTP P命令是以Telnet t行結(jié)束符終止的Telnet t字符串。命令碼(commandcodes) )本身是字母字符,,其后若有參數(shù)則以<SP> >分割,,若無參數(shù)則以Telnet t行結(jié)束符終止。本節(jié)討論了命令碼和命令的語義,;詳細的命令語法在Commands s一節(jié)中給出,,應答序列在SequencingofCommandsandReplies s一節(jié)中討論,命令的使用情景說明在TypicalFTPScenarios s一節(jié)中提供,。 FTP P命令可能被劃分為幾部分,,分別用于指定訪問控制標識符,數(shù)據(jù)傳輸參數(shù),,或者FTP Pservice e請求,。當數(shù)據(jù)傳輸正在進行時,某些命令(比如ABOR,STAT,QUIT T)可能通過控制連接進行傳輸,。某些server r可能無法同時監(jiān)測控制和數(shù)據(jù)連接,,此時需要一些特殊的動作來獲得server r的關(guān)注。暫時推薦下列有序格式: 1,、在Telnet t流中,,用戶系統(tǒng)插入Telnet t“InterruptProcess”(IP)信號。2,、用戶系統(tǒng)發(fā)送Telnet t同步信號,。3,、在Telnet t流中,用戶系統(tǒng)插入命令(例如ABOR),。4,、在收到“IP”后,serverPI I掃描Telnet t流,,以查找EXACTLYONEFTP P 命令,。 (對其它server r來說可能不需要如此,但是上面列舉的action n應該沒有不正常的影響)4.2.FTP 應答(FTPREPLIES) FTP P命令的應答用來保證requests s和文件傳輸過程中的動作之間的同步,,也用來保證userprocess s總是能知道server r的狀態(tài),。每個命令必須至少產(chǎn)生一個應答,也可能多個,;后一種情況中,,多個應答必須很容易被識別。另外,,一些命令按照有序的組出現(xiàn),例如USER,,PASS S和ACCT T,,或者RNFR R和RNTO。如果先前所有的命令已經(jīng)成功執(zhí)行,,應答就說明了中間狀態(tài)的存在,。在這個序列中任何一點發(fā)生故障,都將迫使整個序列從頭開始重新執(zhí)行,。 下面的一組狀態(tài)圖明確的說明了命令應答序列的細節(jié),。 一個FTP P應答由三個數(shù)字(按三個數(shù)字字符傳輸)后跟一些文本組成。數(shù)字專供自動裝置使用,,來決定下一步的輸入,;文本專供人類用戶使用。三個數(shù)字包含了足夠的編碼信息,,user-process(theuser-PI I)不需要檢查文本,,并可能丟棄它或傳給user,視情況而定,。特別的,,文本可能依賴于server,所以對于每個應答碼可能有不同的文本,。 一個應答定義為包含3 3位數(shù)字,,跟著空格<SP> >,跟著一行文本(有些指定了文本行長度最大值),,以Telnet t行結(jié)束符終止,??墒且灿幸恍┣闆r,文本行超過一行,,此時必須將文本用括號括起來,,這樣user-process s才能知道何時停止讀reply(也即停止處理控制連接上的輸入),轉(zhuǎn)而去做其它事情,。第一行文本需要特殊的格式表明文本有多行,,最后一行文本也需要特殊格式指明其為最后一行。不論何種情況,,應答必須包含合適的應答碼以表明傳輸?shù)臓顟B(tài),。為滿足所有的情況,第一行及最后一行的code e應當相同,。 因此多行應答的格式為第一行以應答碼開始,,緊跟著連字符“-”(也被稱為負號),接著是文本,。最后一行以相同的應答碼開始,,緊跟著空格<SP> >,然后是可選的文本,,最后是行結(jié)束符,。 例如: 123-第一行 第二行 234 4以數(shù)字開始的行 123 3最后一行 于是user-process s僅需要搜索相同應答碼第二次在行首出現(xiàn),且跟著空格<SP>,。找到后,,user-process s將忽略所有的中間行。若中間行以一個3位數(shù)開頭,, ,,server r必須填充該行頭部來避免混淆。 此scheme e允許標準的系統(tǒng)程序產(chǎn)生應答信息(比如STAT T應答),,通過添加偽造的首行和尾行,。這些系統(tǒng)程序一般不會在行的開始處產(chǎn)生3個數(shù)字和一個空格,每一文本行的開始處應當添加一些中性的文本,,像空格,。此scheme e假設(shè)多行應答不被嵌套。 應答碼的3 3個數(shù)字都有特別的意義,。User-process s可利用這3個數(shù)字來簡化復雜的response e,。第一個數(shù)字表示response e是好的,壞的或不完整的,。(參閱狀態(tài)圖),,user-process s通過簡單的檢查第一個數(shù)字就能決定下一步的動作(按計劃繼續(xù)執(zhí)行,重做,,retrench h,,等等),。若User-process s想知道發(fā)生了何種錯誤(例如文件系統(tǒng)錯誤,命令語法錯誤),,可以檢查第二個數(shù)字,,保留第三個數(shù)字用于信息分級(例如RNTO O命令先前沒有執(zhí)行RNFR R命令)。 應答碼的第一個數(shù)字有五種取值: 1yz zPositive ePreliminary yreply y 請求的action n正在被發(fā)起,;在繼續(xù)一個新命令前期待另一個應答,。(在應答結(jié)束前,user-process s發(fā)送另一個命令將違反協(xié)議,;若先前的命令正在執(zhí)行,,server-FTPprocess s應當把此時收到的命令進行排隊)此應答類型表明命令已被接受,user-process s現(xiàn)在可以關(guān)注數(shù)據(jù)連接了,。Server-FTPprocess s每個命令至多發(fā)送一個1yz z應答,。 2yz zPositiveCompletionreply y 請求的action n成功執(zhí)行。一個新的request t可以被發(fā)起,。 3yz zPositiveIntermediatereply y 命令已被接受,,但請求的action n處于暫停狀態(tài),等待收到進一步的信息,。User r應當發(fā)送另一個命令指定這個信息,。此應答用于命令序列組。 4yz zTransientNegativeCompletionreply y 命令沒被接受,,請求的action n沒有發(fā)生,但錯誤情況是暫時的,,action n可以被再次請求,。User r應當返回命令序列的開始處,若有,。很難為transient t指派一個含義,,特別是兩個不同的site(server-和user-process s)都必須贊成這個解釋。4yz z類的每個應答可能有稍微不同的time e值,,但目的都是鼓勵user-process s再嘗試一次,。判斷一個reply y屬于4yz z還是5yz z:若命令可被重復,而無需改變命令形式或user/server r的屬性,,則reply y屬于4yz z,。(例如使用相同的命令及參數(shù);user r不改變文件訪問或username,;server r沒有提出一個新的implementation.) ) 5yz zPermanentNegativeCompletionreply y 命令沒被接受,,請求的action n沒有發(fā)生。User-process s被勸阻不要再重復執(zhí)行相同的請求(按相同序列),。實際上某些“permanent t”錯誤情況可以被改正,, ,,因而人類用戶可通過directaction n指揮user-process s重新發(fā)起命令序列(例如,在改變拼寫后,,或user r更改了目錄狀態(tài)),。 第二個數(shù)字對下列功能組進行了編碼: x0z zSyntax x 此類應答涉及語法錯誤,依照句法改正命令,。 x1z zInformation n 對信息請求的應答,,例如status s或help。 x2z zConnections s 應答涉及控制和數(shù)據(jù)連接,。 x3z zAuthenticationandaccounting g 對登錄過程或accountingprocedures s的應答,。 x4z z尚未指明。 x5z zFile esystem m 此類應答指出了server r文件系統(tǒng)的狀態(tài),。 在每個功能組(由第二個數(shù)字指定)中,,第三個數(shù)字給出了一個好的gradation nofmeaning。下面的應答列表將對此進行說明,。注意,,建議(非強制)每個應答關(guān)聯(lián)一些文本,依照與之相關(guān)的命令,,這些文本可能會有所改變,。另一方面,應答碼必須嚴格遵循最后一節(jié)的規(guī)范,;對于那些與此處描述稍有不同的情況,,server rimplementations s不應當創(chuàng)造新的應答碼,而是要適應已定義的碼,。 有些命令,,如TYPE E或ALLO O,成功執(zhí)行后,,不向user-process s提供任何新的信息,,將返回一個200 0應答。若一個特別的server-FTPprocess s沒有實現(xiàn)某個命令,,例如TOPS20site e上的ALLO O,,依然需要一個PositiveCompletionreply, ,,以便簡單的user-process知道它能繼續(xù)進行其action過程,。此情況的應答碼是202, ,,應答文本:“Nostorageallocationnecessary”,。另一方面,若某個未實現(xiàn)的命令請求一個non-site-specificaction,應答是502,。對于已實現(xiàn)的命令,,應答是504,但需要一個未實現(xiàn)的參數(shù),。 4.4.4.4.2.2.2.2.1111依功能分組的應答碼(ReplyCodesbyFunctionGroups) ) 200 0命令ok k 500 0語法錯誤,,命令無法識別 可以包含錯誤比如命令行太長 501 1參數(shù)語法錯誤 202 2命令未實現(xiàn),當前主機不需要此命令 502 2命令未實現(xiàn) 503 3錯誤的命令序列504Commandnotimplementedforthatparameter. . 110Restartmarker r應答這里,,文本是確切的,,與特定的實現(xiàn)無關(guān); MARK Kyyyy y= =此處yyyy y是user-process s數(shù)mmmm據(jù)流marker,,mmmm m是server r的對等 等 marker r(注意marker r和“=”間的空格)211 1系統(tǒng)狀態(tài),,或systemhelp p應答212 2目錄狀態(tài)213 3文件狀態(tài)214 4幫助信息 關(guān)于server r的使用方法或特殊的非標準命令的含義。該應答僅對人類用戶有用,。 215NAMEsystemtype. . 此處NAME E是一個官方系統(tǒng)名(來自號碼分配文檔),。120 0在nnn n分鐘內(nèi)serviceready y。220 0對于新用戶serviceready y,。221service e關(guān)閉控制連接,。 退出登錄(若支持logout) ) 421service e不可用,關(guān)閉控制連接,。Thismaybeareplytoanycommand dif ftheserviceknowsit tmustshutdown. . 125 5數(shù)據(jù)連接已打開,,傳輸開始225 5數(shù)據(jù)連接已打開,無數(shù)據(jù)傳輸425Can'topendataconnection. .226Closingdataconnection. . Requestedfileactionsuccessful(forexample,file e transferorfileabort). .426Connectionclosed;transferaborted. .227EnteringPassiveMode(h1,h2,h3,h4,p1,p2). . 230Userloggedin,proceed. .530Notloggedin. .331Usernameokay,needpassword. .332Needaccountforlogin. .532Needaccountforstoringfiles. . 150Filestatusokay;abouttoopendataconnection. .250Requestedfileactionokay,completed. .257"PATHNAME" "created. .350Requestedfileactionpendingfurtherinformation. .450Requestedfileactionnottaken. . Fileunavailable(e.g.,filebusy). . 550Requestedactionnottaken. . Fileunavailable(e.g.,filenotfound,noaccess). .451Requestedactionaborted.Localerrorinprocessing. .551Requestedactionaborted.Pagetypeunknown. .452Requestedactionnottaken. . Insufficientstoragespaceinsystem. . 552Requestedfileactionaborted. .Exceededstorageallocation(forcurrentdirectoryor rdataset). . 553Requestedactionnottaken. .Filenamenotallowed. . 4.4.4.4.2.2.2.2.2222應答碼的數(shù)值序列表(NumericOrderListofReplyCodes) ) 110Restartmarkerreply. .Inthiscase,thetextisexactandnotlefttothe eparticularimplementation;itmustread: : MARKyyyy y=mmmm mWhereyyyyisUser-processdatastreammarker,andmmmm mserver'sequivalentmarker(notethespacesbetweenmarkers sand d"="). . 120Servicereadyinnnnminutes. .125Dataconnectionalreadyopen;transferstarting. .150Filestatusokay;abouttoopendataconnection. . 200Commandokay. .202Commandnotimplemented,superfluousatthissite. .211Systemstatus,orsystemhelpreply. .212Directorystatus. .213Filestatus. .214Helpmessage. . Onhowtousetheserverorthemeaningofaparticular rnon-standardcommand. .Thisreplyisusefulonlytothe ehumanuser. . 215NAMEsystemtype. .WhereNAMEisanofficialsystemnamefromthelistinthe eAssignedNumbersdocument. . 220Servicereadyfornewuser. .221Serviceclosingcontrolconnection. . Loggedout tif fappropriate. .225Dataconnectionopen;notransferinprogress. .226Closingdataconnection. . Requestedfileactionsuccessful(forexample,file etransferorfileabort). . 227EnteringPassiveMode(h1,h2,h3,h4,p1,p2). .230Userloggedin,proceed. .250Requestedfileactionokay,completed. .257"PATHNAME" "created. . 331Usernameokay,needpassword. .332Needaccountforlogin. .350Requestedfileactionpendingfurtherinformation. . 421Servicenotavailable,closingcontrolconnection. .Thismaybeareplytoanycommand dif ftheserviceknowsit tmustshutdown. . 425Can'topendataconnection. .426Connectionclosed;transferaborted. .450Requestedfileactionnottaken. . Fileunavailable(e.g.,filebusy). .451Requestedactionaborted:localerrorinprocessing. .452Requestedactionnottaken. . Insufficientstoragespaceinsystem. . 500Syntaxerror,commandunrecognized. . Thismayincludeerrorssuchascommandlinetoolong. .501Syntaxerrorinparametersorarguments. .502Commandnotimplemented. .503Badsequenceofcommands. .504Commandnotimplementedforthatparameter. .530Notloggedin. .532Needaccountforstoringfiles. .550Requestedactionnottaken. . Fileunavailable(e.g.,filenotfound,noaccess). .551Requestedactionaborted:pagetypeunknown. .552Requestedfileactionaborted. . Exceededstorageallocation(forcurrentdirectoryor rdataset). .553Requestedactionnottaken. .Filenamenotallowed. .5. 規(guī)范說明(DECLARATIVESPECIFICATIONS) )5.1. 最小實現(xiàn)(MINIMUMIMPLEMENTATION) 為了使FTP P能工作,,而沒有多余的錯誤消息,,所有的server r必須完成下面 的最小實現(xiàn): TYPE E-ASCIINon-print t MODE E-Stream m STRUCTURE E-File,Record d COMMANDS S-USER,QUIT,PORT,TYPE,MODE,STRU, , forthedefaultvaluesRETR,STOR,NOOP. . 傳輸參數(shù)的缺省值: TYPE E-ASCIINon-print t MODE E-Stream m STRU U-File e 所有的主機必須接受上面的內(nèi)容作為缺省標準。5.2. 連接(CONNECTIONS) Server-PI I應當在PortL L上偵聽,。User r或user-PI I將發(fā)起全雙工控制連接,。Server-和user-process s應當遵循Telnet t協(xié)議(詳見ARPA-Internet tProtocol lHandbook[1] ])的約定。Server r沒有義務提供命令行編輯功能,,可以要求在user r主機上完成。完成所有的傳輸和應答后,,user r請求server r關(guān)閉控制連接,。 User-DTP P必須在指定的數(shù)據(jù)端口上偵聽;可以是默認的用戶端口(U)或PORT命令指定的端口,。Server r應當從自己的默認數(shù)據(jù)端口(L-1 1)向指定的用戶數(shù)據(jù)端口發(fā)起數(shù)據(jù)連接,。傳輸?shù)姆较蚝褪褂玫亩丝谌Q于FTPservice e命令。 注意所有的FTP P必須支持使用默認端口的數(shù)據(jù)傳輸,,僅有user-PI I可以開始使用非默認端口,。 當數(shù)據(jù)在兩個server r之間傳輸時,A A和B(參考圖2),user-PI,,C,,同兩個server-PI I建立控制連接。user-PI I向serverA A發(fā)送一個PASV V命令告知它在其數(shù)據(jù)端口上偵聽,,而不是發(fā)起一個連接,。當user-PI I收到PASV V命令的確認時,其中包括serverA A和端口的標識,,user-PI I利用PORT命令把A的端口a a發(fā)送給B,;B B返回一個應答。User-PI I給A和B發(fā)送相應的service e命令,。B發(fā)起連接,,開始傳輸。下面列出了命令-應答序列,,消息在垂直方向上同步,,水平方向異步。 在EstablishingDataConnections s一節(jié)描述的情況下,,server r將關(guān)閉數(shù)據(jù)連接,。如果數(shù)據(jù)連接要關(guān)閉時,接著有一個數(shù)據(jù)傳輸,,此時不需要指明文件結(jié)束,,server r 必須立即關(guān)閉連接。等待直至一個新的傳輸命令被拒絕,,因為user-process s已經(jīng)測試了數(shù)據(jù)連接,,看看是否需要進行偵聽(記住,在發(fā)送傳輸請求之前,,user r必須偵聽一個已關(guān)閉的數(shù)據(jù)端口),。為避免情況紊亂,server r在關(guān)閉數(shù)據(jù)連接后發(fā)送一個226 6應答(若連接保持打開,,會發(fā)送一個文件傳輸完成應答250,,user-PI I在發(fā)出一個新的傳輸命令之前應當?shù)却@些應答)。 任何時候,,user r或server r發(fā)現(xiàn)連接被另一方關(guān)閉,,都應當立即讀取連接中剩余的隊列數(shù)據(jù)并且在自己一方進行關(guān)閉。5.3. COMMANDS 命令是在控制連接上傳輸?shù)腡elnet t字符串,,如同在FTPCommands s一節(jié)中描述的那樣,。命令的功能和語義在AccessControlCommands,TransferParameter rCommands,FTPServiceCommands,andMiscellaneousCommands s節(jié)中描述。命令語法在此說明,。 命令以命令碼開始,,跟著一個參數(shù)域。命令碼是4 4個或更少的字母字符。不區(qū)分大小寫,。因此,,下列任何一個都可表示獲取命令: RETR RRetr rretr rReTr rrETr r 這也可應用于任何表示參數(shù)值的符號,例如A A或a a表示ASCIITYPE,。命令碼和參數(shù)域用一個或多個空格分割,。 對于NVT-ASCII I表示法,參數(shù)域由一個可變長的字符串組成,,以字符序列<CRLF>(CarriageReturn,LineFeed)結(jié)尾,,對于其它協(xié)商的語言可能使用不同的行結(jié)束符。應當注意,,server r不會執(zhí)行動作直至收到行結(jié)束符,。 按照NVT-ASCII I表示法,下面給出了語法,。參數(shù)域中的所有字符都是ASCII I字符,,包括任何ASCII I表示的十進制整數(shù)。方括號表示一個可選的參數(shù)域,。若沒有給出可選項,,意味著使用缺省值。 5.5.5.5.3.3.3.3.1.1.1.1.FFFFTTTTPPPP命令(FTPCOMMANDS) ) 下面是FTP P命令: :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 D<SP><pathname><CRLF> > MKD D<SP><pathname><CRLF> > PWD D<CRLF> > LIST[<SP><pathname>]<CRLF> > NLST[<SP><pathname>]<CRLF> > SITE<SP><string><CRLF> > SYST<CRLF> > STAT T[<SP><pathname>]<CRLF> > HELP[<SP><string>]<CRLF> > NOOP<CRLF> > 5.5.5.5.3.3.3.3.2.2.2.2.FFFFTTTTPPPP命令參數(shù)(FTPCOMMANDARGUMENTS) ) 上述參數(shù)域(使用BNF F記號法)的語法是: <username>::= =<string> > <password>::= =<string> > <account-information>::= =<string> > <string>::= =<char>|<char><string> > <char>::= =anyofthe128ASCIIcharactersexcept<CR>and d <LF> > <marker>::= =<pr-string> > <pr-string>::= =<pr-char>|<pr-char><pr-string> > <pr-char>::= =printablecharacters,any y ASCIIcode33through126 6 <byte-size>::= =<number> > <host-port>::= =<host-number>,<port-number> > <host-number>::= =<number>,<number>,<number>,<number> > <port-number>::= =<number>,<number> > <number>::= =anydecimalinteger1through255 5 <form-code>::= =N|T|C C <type-code>::=A[<sp><form-code>] ] |E[<sp><form-code>] ] |I I |L<sp><byte-size> > <structure-code>::= =F|R|P P<mode-code>::= =S|B|C C<pathname>::= =<string> ><decimal-integer>::= =anydecimalinteger r5.4. 命令和應答序列(SEQUENCINGOFCOMMANDSANDREPLIES) User和server之間的通信是一個交互的對話,。User發(fā)出一個FTP命令,,server r立刻以一個應答進行響應。User r在發(fā)送下一個命令前,,應當?shù)却@個最初的成功或失敗的響應,。 某些命令需要第二個應答,對此user r也應當?shù)却?。這些應答可以報告文件傳輸?shù)倪M度或完成,,或者關(guān)閉數(shù)據(jù)連接。對于文件傳輸命令,,它們是secondary yreplies,。 一組重要的informationalreplies s是connectiongreetings。在正常情況下,,當連接建立后,,server r將發(fā)送一個220 0應答,“等待輸入”,。User r在發(fā)送任何命令前應當?shù)却@個greetingmessage,。若server r不能立即接受輸入,,應當馬上發(fā)送120 0應答,,就緒后再發(fā)送220 0應答。User r就可知道即使有延遲也不掛起。 自發(fā)應答(SpontaneousReplies) ) 有時系統(tǒng)自發(fā)的給用戶(通常是所有用戶)發(fā)送一個消息,。例如,,"System mgoingdownin15minutes"。FTP P沒有規(guī)定server r向user r發(fā)送這樣的自發(fā)信息,。建議將此類信息放入server-PI I的隊列,,并且在下一個reply(可能構(gòu)成了一個多行應答)中傳達給user-PI。 下面的表格列出了每個命令的可選的成功和失敗的應答,。必須嚴格遵守,;server r可以替換應答中的文本,但不能改變應答編碼的含義以及特定命令應答序列暗指的action,。 命令應答序列(Command-ReplySequences) ) 本節(jié)列出了命令應答序列,。每個命令連同其可能的應答一起列出,同組的命令寫在了一起,。首先列出開始的應答(后續(xù)的應答縮進寫在下面),,然后是positive eandnegativecompletion n,最后是序列中其余命令的應答,。這個列表是狀態(tài)圖的基礎(chǔ),,狀態(tài)圖將單獨給出。 ConnectionEstablishment t120 0 220 0220 0421 1 Login n USER R230 0530 0 500,501,421 1331,332 2 PASS S230 0202 2530 0500,501,503,421 1332 2 ACCT T230 0202 2530 0500,501,503,421 1 CWD D250 0500,501,502,421,530,550 0 CDUP P200 0500,501,502,421,530,550 0 SMNT T202,250 0500,501,502,421,530,550 0 Logout tREIN N120 0 220 0220 0421 1500,502 2 QUIT T221 1500 0 Transferparameters s PORT T200 0500,501,421,530 0 PASV V227 7500,501,502,421,530 0 MODE E200 0500,501,504,421,530 0 TYPE E200 0 500,501,504,421,530 0 STRU U 200 0 500,501,504,421,530 0Fileactioncommands s ALLO O 200 0 202 2 500,501,504,421,530 0 REST T 500,501,502,421,530 0 350 0 STOR R 125,150 0 (110) )226,250 0425,426,451,551,552 2 532,450,452,553 3500,501,421,530 0STOU U125,150 0 (110) )226,250 0425,426,451,551,552 2 532,450,452,553 3500,501,421,530 0RETR R125,150 0 (110) )226,250 0425,426,451 1 450,550 0 500,501,421,530 0 LIST T 125,150 0 226,250 0 425,426,451 1 450 0 500,501,502,421,530 0 NLST T 125,150 0 226,250 0 425,426,451 1 450 0 500,501,502,421,530 0APPE E125,150 0 (110) )226,250 0425,426,451,551,552 2 532,450,550,452,553 3 500,501,502,421,530 0 RNFR R 450,550 0 500,501,502,421,530 0 350 0 RNTO O 250 0 532,553 3 500,501,502,503,421,530 0 DELE E 250 0 450,550 0 500,501,502,421,530 0 RMD D 250 0 500,501,502,421,530,550 0 MKD D 257 7 500,501,502,421,530,550 0 PWD D 257 7 500,501,502,421,550 0 ABOR R 225,226 6 500,501,502,421 1Informationalcommands s SYST T 215 5 500,501,502,421 1 STAT T 211,212,213 3 450 0 500,501,502,421,530 0 HELP P 211,214 4 500,501,502,421 1 Miscellaneouscommands s SITE E 200 0 202 2 500,501,530 0 NOOP P 200 0 500421 16. 狀態(tài)圖(STATEDIAGRAMS) ) 在此我們介紹一個簡單FTP P實現(xiàn)的狀態(tài)圖,。僅使用了應答編碼的第一個數(shù)字,。對每個FTP P命令組或命令序列都給出了狀態(tài)圖。 命令分組取決于每個命令的構(gòu)造模型,,用相同結(jié)構(gòu)的模型把命令聚集在一起就形成了命令組,。 對每個命令或命令序列,有三種可能的結(jié)果:success(S),failure(F),error(E),。在下面的狀態(tài)圖中,,我們使用符號B B表示開始,符號W W表示等待應答,。 我們首先給出的這個圖描繪了FTP P的最大命令組: 此圖為下列命令建模: ABOR, ,ALLO, ,DELE, ,CWD, ,CDUP, ,SMNT, ,HELP, ,MODE, ,NOOP, ,PASV, ,QUIT,SITE,PORT,SYST, ,STAT, ,RMD,MKD,PWD,STRU,andTYPE. . 另一個大的命令組用一個類似的圖描繪: 此圖為下列命令建模: APPE,LIST,NLST,REIN,RETR,STOR,andSTOU. . 注意第二個模型也能用來描繪第一組命令,,僅有的區(qū)別在于,第一組中100 0系列的應答是出乎意料的,,因此被看作是錯誤,,但第二組期望(有些命令可能需要)100 0系列的應答。記住,,每個命令至多允許一個100 0系列的應答,。 其余的圖為命令序列建模,也許其中最簡單的是rename e序列,。 下圖是Restart t命令的簡單模型: 此處cmd d是APPE,,STOR R或者RETR R,。 我們注意到上面三個模型是相似的。Restart t和Rename e的區(qū)別僅在于第二階段對100 0系列應答的處理,,第二組期望(有些命令可能需要)100 0系列的應答,。記住,每個命令至多允許一個100 0系列的應答,。 最復雜的圖是Login n序列: 最后,,我們給出了一個一般化的圖,可用來對命令和應答的交換進行建模: 7. 典型的FTP 場景(TYPICALFTPSCENARIO) ) 主機U U上的user r想和主機S S進行文件傳輸(to/from): : 一般的,,user r通過一個間接的user-FTPprocess s和server r通訊,。下面可能是一個典型的場景。User-FTP P提示出現(xiàn)在圓括號中,,‘----> >’表示命令從主機U到主機S,,'<----'表示從S到U的應答。 LOCALCOMMANDSBYUSER RACTIONINVOLVED D ftp(host)multics<CR> > usernameDoe<CR> > passwordmumble<CR> > retrieve(localtype)ASCII<CR> >(localpathname)test1<CR> >(for.pathname)test.pl1<CR> > ConnecttohostS,portL, , establishingcontrolconnections. . <----220Serviceready<CRLF>. . USERDoe<CRLF>----> > <----331Usernameok, , needpassword<CRLF>. .PASSmumble<CRLF>----> ><----230Userloggedin<CRLF>. . User-FTPopenslocalfileinASCII. . RETRtest.pl1<CRLF> >----> > <----150Filestatusokay; ; abouttoopendata a connection<CRLF>. . Servermakesdataconnection n toportU. . <----226Closingdataconnection, , filetransfersuccessful<CRLF>. .typeImage<CR> >TYPEI<CRLF> >----> > <----200CommandOK<CRLF> >store(localtype)image<CR> >(localpathname)filedump<CR> >User-FTPopenslocalfileinImage. .(for.pathname)>udd>cn>fd<CR> >STOR>udd>cn>fd<CRLF> >----> > <----550Accessdenied<CRLF> > terminate eQUIT<CRLF> >----> >Serverclosesall lconnections. .8. 連接建立(CONNECTIONESTABLISHMENT) ) FTPcontrolconnection n通過TCP P在user-process s端口U U和serverprocess s端口L L之間建立,。此協(xié)議被分配了serviceport21(八進制25),,也即L=21。
|