原文參考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的目標(biāo)如下: 1)促進(jìn)文件共享(計算機(jī)程序和數(shù)據(jù)),2)鼓勵間接或隱式(通過程序)的使用遠(yuǎn)程計算機(jī),3)使用戶免受主機(jī)之間文件存儲系統(tǒng)的變化,4)可靠高效的傳輸數(shù)據(jù)。盡管用戶可在終端機(jī)上直接使用FTP P,但設(shè)計FTP P主要是為了在程序中使用。 此規(guī)范試圖用一個簡單且容易實現(xiàn)的協(xié)議設(shè)計來滿足用戶的各種需求,如大型機(jī)、小型機(jī)、個人工作站和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模型;當(dāng)回顧術(shù)語時,一些讀者可能需要借助于本節(jié)的FTP P模型。2.1 歷史 多年來,F(xiàn)TP P協(xié)議有一個長期的演化。附錄III I是和FTP P有關(guān)的按時間排序的RFC C文檔列表。這些文檔包含1971 1年第一個被提議的文件傳輸機(jī)制,它在麻省理工學(xué)院(M.I.T.)(RFC114)的主機(jī)上實現(xiàn),RFC141 1中加上了注解和討論。 RFC172 2提供了一個面向用戶級的在主機(jī)間(包括終端IMPs s)傳輸文件的協(xié) 議。作為修訂版,RFC265 5改編了FTP,RFC281 1提議做進(jìn)一步的改變。1982 2年1 1月,RFC294 4提議使用事務(wù)數(shù)據(jù)集類型(?"SetDataType" "transaction)。 RFC354 4淘汰了RFC264 4和265。FTP P現(xiàn)在被定義為在ARPANET T上主機(jī)之間進(jìn)行文件傳輸?shù)囊粋€協(xié)議,F(xiàn)TP P的主要功能是在主機(jī)之間高效可靠的傳輸文件,并允許方便的使用遠(yuǎn)程文件存儲功能。RFC385 5進(jìn)一步評論了協(xié)議的錯誤、目的和附件,RFC414 4則提供了關(guān)于serverFTP和userFTP P工作情況的報告。1973 3年發(fā)布的RFC430 0提出關(guān)于FTP P的進(jìn)一步評議。最終,一份正式的FTP P文檔出版了,這就是RFC454。 1973 3年7 7月以前,F(xiàn)TP P的最后一個版本發(fā)生了相當(dāng)大的改變,但總體結(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,標(biāo)題為"Leaving gWell lEnoughAlone" ",討論了所有新舊FTP P版本的不同。RFC691 1提出了對RFC686 6的輕微修訂,和文件打印相關(guān)。 在底層協(xié)議從NCP P轉(zhuǎn)換到TCP P的推動下,基于上述所有的努力,RFC765 5詳述了FTP P在TCP P上的使用。 當(dāng)前版本的FTP P規(guī)范準(zhǔn)備改正一些小的文檔錯誤,來改善某些協(xié)議特征的解釋,并增加一些新的可選命令。 特別是,下列新的可選命令包含在此版本的規(guī)范中: :CDUP– –進(jìn)入上一級目錄 錄SMNT T– –結(jié)構(gòu)裝載(?StructureMount) )STOU U– –唯一存儲(?StoreUnique) )RMD D– –刪除目錄MKD D– –新建目錄PWD D–打印目錄SYST T-System m 此規(guī)范兼容以前的版本。依據(jù)先前版本實現(xiàn)的程序應(yīng)該可以自動適應(yīng)此規(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)限。訪問控制必須防止對文件進(jìn)行非法或意外的使用。調(diào)用訪問控制是server-FTPprocess s的特權(quán)。 字節(jié)大小(bytesize) ) 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之間交換命令和應(yīng)答的通信路徑。此連接遵循 Telnet t協(xié)議。 數(shù)據(jù)連接(dataconnection) ) 全雙工連接,在此之上,數(shù)據(jù)以一種指定的模式和類型進(jìn)行傳輸。被傳輸?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é)尾。 錯誤恢復(fù)(errorrecovery) ) 允許用戶從某些錯誤中恢復(fù),比如主機(jī)系統(tǒng)或DTP P的故障。在FTP P中,錯誤恢復(fù)可能涉及文件傳輸?shù)闹貑ⅲㄔ诮o定的檢查點)。 FTP P命令(FTPcommands) ) 一個命令集,包含了從user-FTP P到server-FTP P傳輸?shù)目刂菩畔ⅰ?br>文件(File) )計算機(jī)數(shù)據(jù)(包括程序)的有序集合,具有任意長度,通過路徑名唯一識別。模式(mode) )在數(shù)據(jù)連接上,數(shù)據(jù)以此模式傳輸。模式定義了傳輸過程中的數(shù)據(jù)格式,包 括EOR R和EOF F。FTP P中定義的傳輸模式在TransmissionModes s一節(jié)中講述。 網(wǎng)絡(luò)虛擬終端(VNT) ) 網(wǎng)絡(luò)虛擬終端同Telnet t協(xié)議中的定義相同。 網(wǎng)絡(luò)虛擬文件系統(tǒng)(NVFS) ) 此概念定義了一個標(biāo)準(zhǔn)的網(wǎng)絡(luò)文件系統(tǒng),具有標(biāo)準(zhǔn)的命令和路徑名約定。 頁(Page) ) 一個文件可能被結(jié)構(gòu)化為被稱為頁的獨立部分的集合。FTP P支持不連續(xù)文件 (獨立的索引頁)的傳輸。 路徑名(pathname) ) 路徑名是用戶輸入到文件系統(tǒng)中的一個字符串,用于標(biāo)識一個文件。路徑名 一般包括設(shè)備和目錄名,以及文件名。FTP P尚未指定標(biāo)準(zhǔn)的路徑名約定。每個用戶必須遵循傳輸過程中所涉及文件系統(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)。 應(yīng)答(reply) ) 應(yīng)答是server r通過控制連接向user r發(fā)送的一個確認(rèn)(肯定的或否定的),它是對FTP P命令的響應(yīng)。應(yīng)答的一般形式是一個完成碼(包括錯誤碼)后跟一個文本串。完成碼為程序所用,文本串通常為人類用戶所用。 服務(wù)器數(shù)據(jù)傳輸進(jìn)程(server-DTP) ) DTP P,以正常的主動狀態(tài),通過偵聽數(shù)據(jù)端口來建立數(shù)據(jù)連接。它為傳輸和存儲設(shè)置一些參數(shù),并且按照來自其協(xié)議解釋器(PI I)的命令傳輸數(shù)據(jù)。DTP P 可以設(shè)置為被動狀態(tài)進(jìn)行偵聽,而不是在數(shù)據(jù)端口發(fā)起一個連接。 服務(wù)器FTP P進(jìn)程(server-FTPprocess) ) 一個process s或process s集合,它與一個user-FTPprocess s(也可能是另一個 server r)協(xié)作完成文件傳輸?shù)墓δ?。此功能包括一個協(xié)議解釋器(PI I)和一個數(shù)據(jù)傳輸進(jìn)程(DTP)。 服務(wù)器協(xié)議解釋器(server-PI) ) server-PI I在端口L(PortL L)上偵聽來自user-PI I的連接,并且建立一個控制通信連接。它接收來自user-PI I的標(biāo)準(zhǔn)FTP P命令,發(fā)送應(yīng)答,以及管理server-DTP P。 類型(type) ) 數(shù)據(jù)表示類型,用于數(shù)據(jù)傳輸和存儲。類型意味著在數(shù)據(jù)存儲和數(shù)據(jù)傳輸之間的某些轉(zhuǎn)換。FTP P中定義的表示類型在EstablishingDataConnections s一節(jié)中講述。 用戶(user) ) 想要獲得文件傳輸服務(wù)的一個人或可代表人的process s。人類用戶可以直接與server-FTPprocess s交互,但是應(yīng)優(yōu)先使用user-FTPprocess s,因為FTP P協(xié)議的 設(shè)計更傾向于自動裝置。 用戶數(shù)據(jù)傳輸進(jìn)程(user-DTP) ) DTP P在數(shù)據(jù)端口偵聽來自server-FTPprocess s的連接。如果兩個server r正在 相互傳輸數(shù)據(jù),那么此user-DTP P將是不活躍的。 用戶FTP P進(jìn)程(user-FTPprocess) ) 一個功能集合,包括一個PI I、一個DTP P以及一個用戶界面,與一個或多個 server-FTPprocess s協(xié)作,共同完成文件傳輸功能。用戶界面允許在命令應(yīng)答中使用本地語言與user r進(jìn)行對話。 用戶協(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ā)起時刻,標(biāo)準(zhǔn)FTP P命令由user-PI I生成并通過控制連接傳輸給server rprocess。(user r可以直接建立一個到server-FTP P的控制連接,例如從一個TAC C終端機(jī),獨立的生成標(biāo)準(zhǔn)FTP P命令,繞過user-FTPprocess s)為響應(yīng)命令,server-PI I通過控制連接向user-PI I發(fā)送標(biāo)準(zhǔn)應(yīng)答。 FTP P命令為數(shù)據(jù)連接及文件系統(tǒng)操作指定了若干參數(shù),前者的參數(shù)有數(shù)據(jù)端口、傳輸模式、表示類型和結(jié)構(gòu),后者有存儲、獲取、附加、刪除等等。user-DTP P或其指派(?designate)應(yīng)在特定數(shù)據(jù)端口上偵聽,server r按照規(guī)定的參數(shù)發(fā)起數(shù)據(jù)連接和數(shù)據(jù)傳輸。注意,數(shù)據(jù)端口不必在發(fā)出FTP P命令的主機(jī)上,但是user r或user-FTPprocess s必須保證在指定的數(shù)據(jù)端口上偵聽。也應(yīng)注意,數(shù)據(jù)連接可能同時用于收發(fā)。 另一種情況,user r可能希望在兩個遠(yuǎn)程主機(jī)間傳輸文件。User r建立到兩個server r的控制連接,接著安排server r之間的數(shù)據(jù)連接。這樣,控制信息被傳遞給user-PI,但是數(shù)據(jù)在server-DTP P間傳輸。下圖是這種server-server r交互的模型。 圖2 2 當(dāng)數(shù)據(jù)正在傳輸時,此協(xié)議要求控制連接處于打開狀態(tài)。當(dāng)FTPservice e使用完畢時,user r有責(zé)任請求關(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ù)連接進(jìn)行傳輸??刂七B接用于傳輸命令(描述了將要執(zhí)行的功能)以及這些命令的應(yīng)答(見FTPReplies s小節(jié))。一些命令涉及到主機(jī)間數(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ā)送者主機(jī)的存儲設(shè)備中傳輸?shù)浇邮照咧鳈C(jī)的存儲設(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大型機(jī)將NVT-ASCII I存儲為8 8位EBCDIC C碼。Multics s將NVT-ASCII I存儲為4 4個9 9位字符,在一個36 6位字中。在不同的系統(tǒng)間傳輸文本時,適合將字符轉(zhuǎn)換成標(biāo)準(zhǔn)NVT-ASCII I表示法。收發(fā)方需在標(biāo)準(zhǔn)表示法和它們的內(nèi)部表示法之間執(zhí)行必要的轉(zhuǎn)換。 當(dāng)在不同字長的主機(jī)系統(tǒng)間傳輸二進(jìn)制數(shù)據(jù)時,在表示法上出現(xiàn)了一個問 題。并不總是能夠清楚的知道發(fā)送者如何發(fā)送數(shù)據(jù)以及接收者如何存儲之。例如, ,當(dāng)從32 2位字長的系統(tǒng)向36 6位字長的系統(tǒng)傳輸32 2位字節(jié)時,在后者系統(tǒng)中,在36 6位字中按照右對齊來存儲32 2位字節(jié)可能是合適的。在任何情況下,user r應(yīng)該能夠指定數(shù)據(jù)表示法和轉(zhuǎn)換方法。應(yīng)該注意FTP P提供的數(shù)據(jù)類型表示法非常有限,其它類型的數(shù)據(jù)轉(zhuǎn)換應(yīng)該由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必須接受的默認(rèn)類型,主要用于傳輸文本文件。如果雙方主機(jī)認(rèn)為使用EBCDIC C類型更方便,則不使用ASCII I類型。 發(fā)送方將數(shù)據(jù)由字符的內(nèi)部表示法轉(zhuǎn)換為標(biāo)準(zhǔn)的8位NVT-ASCII表示法(參見Telnet t規(guī)范)。接收方則把數(shù)據(jù)由標(biāo)準(zhǔn)表示法轉(zhuǎn)換為內(nèi)部表示法。 按照NVT T標(biāo)準(zhǔn),在文本行尾應(yīng)當(dāng)使用<CRLF> >序列。(參見Data aRepresentationandStorage e小節(jié)最后關(guān)于文件結(jié)構(gòu)的討論) 使用標(biāo)準(zhǔn)的NVT-ASCII I表示法意味著必須將8位數(shù)據(jù)看作一個字節(jié)。 ASCII I和EBCDIC C類型的格式參數(shù)將在下面討論。3.1.1.2.EBCDIC EBCDICTYPE) 當(dāng)某些主機(jī)采用EBCDIC C作為內(nèi)部字符表示法時,EBCDIC C可用于此類主機(jī)間的高效數(shù)據(jù)傳輸。 為進(jìn)行傳輸,數(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é),以便進(jìn)行傳輸。接收方須將這些數(shù)據(jù)存儲為連續(xù)的位。存儲系統(tǒng)的結(jié)構(gòu)可能要求對文件或文件中的記錄進(jìn)行填充,使得文件或記錄處于字節(jié)、字或塊的邊界上。填充字節(jié)全為0,僅在文件或記錄的末尾用到。對于填充字節(jié),必須有一種識別方法,在重新獲取文件時可將其剔除。填充字節(jié)的轉(zhuǎn)換必須實現(xiàn),使得用戶可以進(jìn)行文件存儲。 圖像類型用于高效存儲、文件檢索以及二進(jìn)制數(shù)據(jù)的傳輸。建議所有的FTP P都應(yīng)具有處理圖像類型的能力。 3.1.1.4. 本地類型(LOCALTYPE) 此類型數(shù)據(jù)以邏輯字節(jié)進(jìn)行傳輸,字節(jié)大小由第二個參數(shù)指定。參數(shù)二的值必須是十進(jìn)制整數(shù),且沒有默認(rèn)值。邏輯字節(jié)不必與傳輸字節(jié)大小相同。若這兩種字節(jié)大小不同,那么應(yīng)將數(shù)據(jù)連續(xù)的包裝成邏輯字節(jié),而不考慮傳輸字節(jié)的邊界,末尾也無需進(jìn)行字節(jié)填充。 當(dāng)數(shù)據(jù)到達(dá)接收方主機(jī)時,將按某種方式進(jìn)行轉(zhuǎn)換,這取決于邏輯字節(jié)大小和特定的主機(jī)。這種轉(zhuǎn)換必須是可逆的(若使用相同參數(shù),獲取到的文件也應(yīng)相同),所有的FTP P應(yīng)該實現(xiàn)此種轉(zhuǎn)換。 例如,將36 6位浮點數(shù)發(fā)送到32 2位字長的主機(jī)時,數(shù)據(jù)應(yīng)當(dāng)按本地類型傳輸,邏輯字節(jié)為36 6位。接收方主機(jī)存儲這些邏輯字節(jié)以便它們能更容易被操作; ;此例將36 6位邏輯字節(jié)放入64 4位雙字中就足夠了。 另一個例子,兩臺36 6位字長的主機(jī),彼此間使用TYPEL36 6按字傳輸數(shù)據(jù)。數(shù)據(jù)將按8 8位傳輸字節(jié)打包傳輸,如此,9 9個傳輸字節(jié)可以運(yùn)載2 2個字。3.1.1.5. 格式控制FORMATCONTROL) ASCII I和EBCDIC C類型都接受第二個可選參數(shù),指出了與文件相關(guān)聯(lián)的垂直格式控制。 向主機(jī)傳輸一個字符文件,目的有三個:打印,存儲及以后的獲取,處理。若傳輸?shù)奈募糜诖蛴。邮辗街鳈C(jī)必須知道垂直格式控制是如何表示的。對于第二個目的,文件存儲在主機(jī)上以后,必須能夠原樣取回。最后,當(dāng)文件從一臺主機(jī)傳輸?shù)搅硪慌_后,應(yīng)可以在第二臺主機(jī)上順利的處理它。單獨的ASCII I或EBCDIC C格式無法滿足所有的情況。因此,這些類型具有第二個參數(shù),用來說明下列三種格式:3.1.1.5.1.NONPRINT 若省略第二個格式參數(shù),NONPRINT T將是默認(rèn)使用的參數(shù)。所有FTP P必須實現(xiàn)Non-print t格式。 該文件無需包含垂直格式信息。若將此文件傳給了printerprocess,此process s可能采用空格和邊距的標(biāo)準(zhǔn)值。 通常,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標(biāo)準(zhǔn)格式化后, ,行或記錄的第一個字符不打印,此字符用于確定紙張的垂直移動,紙張移動發(fā)生在剩余內(nèi)容打印之前。ASA A標(biāo)準(zhǔn)指定了下列控制字符: 字符 垂直間距 空白 將紙張向上移動一行 0 0 將紙張向上移動兩行 1 1 將紙張移動到下一頁的頂部 + + 無移動,比如套印 很明顯,必須有一些方法使得打printerprocess s能夠辨別結(jié)構(gòu)實體的末端。對于記錄結(jié)構(gòu)的文件不存在任何問題;在傳輸和存儲的過程中記錄將被明確的標(biāo)記。若文件不是記錄結(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命令未被使用,默認(rèn)為file-structure,但是對于文本文件(例如ASCII I或EBCDIC C類型)來說,所有的FTP P必須實現(xiàn)file-structure e和record-structure。 文件的固有結(jié)構(gòu)取決于存儲它的主機(jī)類型。在IBM M大型機(jī)上source-code e文件以定長記錄的形式存儲,但在DECTOPS-20 0上以字符流存儲,字符流被CRLF F分割成多行。若文件在這不同的主機(jī)之間傳輸,必須有一些方法使得一臺主機(jī)可以識別另一臺主機(jī)的文件結(jié)構(gòu)。 若將某種結(jié)構(gòu)的文件傳輸?shù)街С至硪环N文件結(jié)構(gòu)的主機(jī)上,可能會出現(xiàn)問題。如果文本文件以record-structure e傳輸?shù)街С謋ile-structure e的主機(jī)上,那么該主機(jī)應(yīng)對此文件做一個內(nèi)部轉(zhuǎn)換。顯然,此轉(zhuǎn)換是有用的,同時必須可逆,以便按record-structure e重新得到原文件。 當(dāng)文件以file-structure e傳輸?shù)街С謗ecord-structure e的主機(jī)上時,這就出現(xiàn)一個問題,主機(jī)如何將文件分割成若干record。如果必須分割,F(xiàn)TP P應(yīng)該使用end-of-line e序列,ASCII I使用<CRLF>,EBCDIC C使用<NL>作為定界符。如果采用這種技術(shù),那么當(dāng)以file-structure e重新獲取文件時,F(xiàn)TP P必須支持逆變換。3.1.2.1. 文件結(jié)構(gòu)(FILESTRUCTURE) STRUcture e命令未被使用時,默認(rèn)為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. 頁P(yáng)AGESTRUCTURE) 為傳輸不連續(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ù)應(yīng)同存 儲文件時用到的一樣。反之,若使用相同的參數(shù)來存儲和獲取文件,那么FTP P必須返回與原文件完全相同的文件。 3.2. 建立數(shù)據(jù)連接(ESTABLISHINGDATACONNECTIONS) 傳輸數(shù)據(jù)的過程包括在合適的端口建立數(shù)據(jù)連接,選擇傳輸參數(shù)。User r和server-DTP P都有一個默認(rèn)的數(shù)據(jù)端口。User-process s的默認(rèn)數(shù)據(jù)端口與控制連接端口(即U)相同。Server-process s的默認(rèn)數(shù)據(jù)端口與控制連接端口(即L-1 1)鄰近。 傳輸字節(jié)大小為8 8位。傳輸字節(jié)大小僅和實際的數(shù)據(jù)傳輸有關(guān),與主機(jī)文件系統(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ù)連接。當(dāng)連接建立后,DTP P之間開始數(shù)據(jù)傳輸,server-PI I給user-PI I發(fā)送一個確認(rèn)應(yīng)答。 所有FTP P必須支持默認(rèn)數(shù)據(jù)端口的使用,僅有user-PI I能修改為非默認(rèn)端口。 User r可以通過PORT T命令指定一個備用數(shù)據(jù)端口。User r可能想將文件傳到TAClineprinter r或者從第三方主機(jī)獲取一個文件。在后一種情況中,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ā)送的命令和應(yīng)答序列在FTPReplies s一節(jié)中定義。 一般來說,server r負(fù)責(zé)數(shù)據(jù)連接的發(fā)起和關(guān)閉,有一種情況例外,當(dāng)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、默認(rèn)端口被用戶命令改變。 4、控制連接被關(guān)閉 5、發(fā)生了不可恢復(fù)的錯誤。 其它情況下,server r可選擇是否關(guān)閉數(shù)據(jù)連接,server r必須向user-process s發(fā)送250 0或226 6應(yīng)答。3.3. 的管理DATACONNECTIONMANAGEMENT) 默認(rèn)的數(shù)據(jù)連接端口:所有FTP P必須支持默認(rèn)數(shù)據(jù)連接端口的使用,僅有user-PI I可以使用非默認(rèn)端口。 非默認(rèn)數(shù)據(jù)端口的協(xié)商:user-PI I可通過PORT T命令指定一個非默認(rèn)的user rside e數(shù)據(jù)端口。User-PI I可通過PASV V命令請求server r識別非默認(rèn)serverside e數(shù)據(jù)端口。因為連接由地址對確定,僅執(zhí)行PORT T和PASV V其中一個就足以獲得一個不同的數(shù)據(jù)連接。但是允許這兩個命令全部執(zhí)行,這樣可在數(shù)據(jù)連接的兩端全部使用新的端口。 數(shù)據(jù)連接的重用:當(dāng)使用流模式傳輸數(shù)據(jù)時,必須通過關(guān)閉連接來表明文件結(jié)束。由于TCP P需要將連接保持一個超時周期來保證通信的可靠,因而當(dāng)一個會話中有多個文件需要傳輸時,會造成問題:無法立即重新打開連接。 對這個問題,有兩種解決方案:協(xié)商一個非默認(rèn)端口,或者使用另一種傳輸 模式。 關(guān)于傳輸模式的評論。流傳輸模式與生俱來是不可靠的,因為它不能確定連接是否過早的被關(guān)閉。其它傳輸模式(Block,Compressed)不通過關(guān)閉連接來表明文件結(jié)束,它們有足夠的FTPencoding g來解析數(shù)據(jù)連接,以確定文件是否結(jié)束。因此使用這些模式就能在傳輸多個文件時保持?jǐn)?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)標(biāo)記都是明確給出的,包括最后一個。對于pagestructure e文件,傳輸結(jié)束時使用last-page e頁類型。 注意:在本節(jié)其余內(nèi)容里,byte e是指傳輸字節(jié),除非有明確的說明。 為使傳輸合乎標(biāo)準(zhǔn),發(fā)送主機(jī)將end-of-line e或end-of-record d符號的內(nèi)部表示法轉(zhuǎn)變?yōu)橛蓚鬏斈J郊拔募Y(jié)構(gòu)規(guī)定的表示法,接收主機(jī)將執(zhí)行逆變換。IBM M大型機(jī)的recordcount t域可能不被其它主機(jī)識別,因此end-of-record d信息在流模式中被當(dāng)作兩個字節(jié)控制碼傳輸,在Block k或Compressed d模式中被當(dāng)作描述符的一個標(biāo)志位。ASCII I或EBCDIC C文件不具有recordstructure,其中的end-of-line e應(yīng)當(dāng)分別通過<CRLF>或<NL>來表示。對于某些系統(tǒng),這些轉(zhuǎn)換意味著額外的工作,同類型的系統(tǒng)之間傳輸非記錄結(jié)構(gòu)的文本文件時,可能希望使用二進(jìn)制表示法和流傳輸模式。 下列傳輸模式定義于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é)控制碼表示??刂拼a的第一個字節(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ā)送主機(jī)關(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ù),因而也標(biāo)記了下一個數(shù)據(jù)塊(無填充字節(jié))的開始位置。descriptorcode e定義了如下內(nèi)容:文件的最后一個塊(EOF),記錄的最后一個塊(EOR),restart tmarker r(見ErrorRecoveryandRestart t一節(jié)),suspectdata a(也即傳輸?shù)臄?shù)據(jù)不可靠,被懷疑有錯誤)。其中suspectdata a不是用于FTP P錯誤控制的。它是出于主機(jī)交換某類型數(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é)的標(biāo)志位指出,共有4 4個code,每一個code e 編號以十進(jìn)制表示。 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è)置相應(yīng)的位。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個重復(fù)的數(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與塊模式中的定義相同,并應(yīng)用于隨后的字節(jié)串。 壓縮模式有助于增加帶寬,在網(wǎng)絡(luò)傳輸中僅需要一點點額外的CPU U開銷。它可以有效地減小printerfiles s的大小,比如由遠(yuǎn)程作業(yè)輸入(RJE E)主機(jī)生成的文件。3.5. 錯誤恢復(fù)與重啟(ERRORRECOVERYANDRESTART) 數(shù)據(jù)傳輸過程中無法檢測位丟失和亂序;此級別的錯誤控制由TCP P處理。盡管如此,重啟過程用于保護(hù)用戶免受顯而易見的系統(tǒng)故障(包括主機(jī)、FTP-process s或者底層網(wǎng)絡(luò)的故障)。 重啟過程僅用于塊或流模式的數(shù)據(jù)傳輸。它要求發(fā)送者向數(shù)據(jù)流中插入一個 特殊的markercode。Marker信息僅對發(fā)送者有意義,但必須是可打印字符。Marker r可以表示一個bit-count,一個record-count,或者其它任何信息,系統(tǒng)利用marker r來識別一個數(shù)據(jù)檢查點。若接收者支持重啟過程,將在數(shù)據(jù)流中標(biāo)記出此marker r的相應(yīng)位置,并且向user r返回此信息。 如果系統(tǒng)發(fā)生故障,user r可通過識別markerpoint,利用FTPrestartprocedure e重啟數(shù)據(jù)傳輸。下面的例子說明了restartprocedure e的使用。 發(fā)送者在數(shù)據(jù)流的某個點插入一個適當(dāng)?shù)膍arker r塊。接收方主機(jī)在其文件系統(tǒng)內(nèi)標(biāo)記相應(yīng)的數(shù)據(jù)點,并且將最后一個已知的發(fā)送者和接收者marker r信息傳達(dá)給user,傳達(dá)方式要么是直接的,要么通過控制連接上的一個110 0應(yīng)答,這取決于誰是發(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ù)責(zé)發(fā)送FTP P命令及解釋收到的應(yīng)答;server-PI I解釋命令,發(fā)送應(yīng)答,指導(dǎo)其DTP P建立數(shù)據(jù)連接及傳輸數(shù)據(jù)。在被動傳輸過程中,一方是server-DTP,如果第二方是user-DTP, ,那么它被user-FTP P主機(jī)通過內(nèi)部協(xié)議進(jìn)行管理;若第二方同樣是server-DTP,那么它被其PI I按照來自user-PI I的命令進(jìn)行管理。FTP P應(yīng)答在下一節(jié)中討論。此節(jié)中描述的幾個命令,有助于明確可能的應(yīng)答。4.1.FTP 命令(FTPCOMMANDS) 4.4.4.4.1.1.1.1.1.1.1.1. 訪問控制命令(ACCESSCONTROLCOMMANDS) ) 下列命令指定了訪問控制標(biāo)識符(命令碼顯示在括號中)。 USERNAME(USER) ) 參數(shù)域是標(biāo)識user r的Telnet t串。Server r需要user r標(biāo)識來訪問其文件系統(tǒng)。當(dāng)控制連接建立后(一些server r需要這樣),此命令通常是user r傳送的第一個命令。某些server r還需要額外的標(biāo)識信息(以password d或account t命令的形式)。Server r允許在任何時候輸入新的USER R命令,以改變訪問控制或accounting ginformation。這會沖掉任何user、密碼和accountinformation,再次啟動登錄過程。所有的傳輸參數(shù)未變,任何正在進(jìn)行的文件傳輸按照原來的訪問控制參數(shù)完成。 PASSWORD(PASS) ) 參數(shù)域是一個Telnet t串,指明了用戶密碼。此命令必須緊跟在USER R命令之后,完成user r的識別,進(jìn)行訪問控制。因為密碼信息非常敏感,通常應(yīng)掩蓋它 或禁止屏幕顯示。server r沒有十分安全的方法來完成此任務(wù),因此user-FTPprocess s有責(zé)任隱藏敏感的密碼信息。 ACCOUNT(ACCT) ) 參數(shù)域是標(biāo)識用戶賬戶的Telnet t串。此命令與USER R命令沒有必然聯(lián)系,一些主機(jī)可能需要一個account t用于登錄,另一些僅用于特定的訪問,比如存儲文件。對于后一種情況,此命令可能隨時到達(dá)。 有一些應(yīng)答碼用于自動區(qū)分這些情況:當(dāng)account t信息用于登錄時,成功執(zhí)行PASSword d命令的應(yīng)答碼為332。另一方面,若登錄不需要account t信息,成功執(zhí)行PASSword d命令的應(yīng)答碼是230;若在以后的對話中發(fā)出了一個命令,需要account t信息,server r應(yīng)該返回應(yīng)答碼332 2或532,這取決于server r是存儲(pending greceiptoftheACCounTcommand) )還是丟棄此命令。 CHANGEWORKINGDIRECTORY(CWD) ) 此命令允許用戶改變工作目錄或dataset,進(jìn)行文件存取,無須改變其登錄或accounting g信息。傳輸參數(shù)同樣不變。此命令的參數(shù)為目錄路徑名或其它與系統(tǒng)相關(guān)的文件組標(biāo)志符。 CHANGETOPARENTDIRECTORY(CDUP) ) 此命令是CWD D的特例,在具有不同父目錄命名語法的操作系統(tǒng)間傳輸目錄樹時,此命令可簡化程序的實現(xiàn)。應(yīng)答碼與CWD D的應(yīng)答碼相同。更多細(xì)節(jié)見附錄II I。 STRUCTUREMOUNT(SMNT) ) 此命令允許user r裝載一個不同的文件系統(tǒng)數(shù)據(jù)結(jié)構(gòu),無須改變其登錄或accounting g信息,傳輸參數(shù)同樣未變。此命令的參數(shù)為目錄的路徑名或其它與系統(tǒng)相關(guān)的文件組標(biāo)志符。 REINITIALIZE(REIN) ) 此命令終止USER R,沖掉所有的I/O O和accountinformation n,但允許執(zhí)行完正在進(jìn)行的傳輸。所有的參數(shù)重置為默認(rèn)值,控制連接保持打開。Thisisidenticalto othe estate ein nwhich ha auser rfinds shimself fimmediately yafter rthe econtrol lconnection nis sopened.USER R命令應(yīng)該緊跟REIN N之后。 LOGOUT(QUIT) ) 此命令終止USER R,若沒有文件在傳輸,server r關(guān)閉控制連接。若有文件正在傳輸,連接將保持打開直至有響應(yīng)結(jié)果,此時server r將關(guān)閉連接。如果user-process s正在給若干個USER R傳輸文件,但不愿關(guān)閉連接然后重新打開,那 么應(yīng)該使用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ù)都有缺省值,僅當(dāng)改變?nèi)笔?shù)值時,才需要執(zhí)行用于指定傳輸參數(shù)的命令,最后給定的值將被作為缺省值。若傳輸數(shù)據(jù)時未指定傳輸參數(shù),則標(biāo)準(zhǔn)缺省值如上所述。這意味著sever r必須記住可用的缺省值。傳輸參數(shù)命令可按任何順序執(zhí)行,但必須在FTPservice e請求之前。下列命令指定了數(shù)據(jù)傳輸參數(shù): DATA APORT(PORT) ) 其參數(shù)說明了用于數(shù)據(jù)連接的數(shù)據(jù)端口。User r和server r都有默認(rèn)的數(shù)據(jù)端口,正常情況下,不需要此命令及其應(yīng)答。若使用了該命令,其參數(shù)是32 2位因特網(wǎng)主機(jī)地址加上16 6位TCP P端口地址。地址信息被分割為多個8 8位的域,每個域的值被轉(zhuǎn)換為一個十進(jìn)制數(shù)(以字符串的形式表示)。所有的域以逗號隔開。PORT命令如下: PORTh1,h2,h3,h4,p1,p2 2 其中,h1 1是因特網(wǎng)主機(jī)地址的高8位。 PASSIVE(PASV) ) 此命令請求server-DTP P在某個數(shù)據(jù)端口(非默認(rèn)端口)上偵聽,等待連接, ,而不是收到傳輸命令時發(fā)起連接。此命令的響應(yīng)包含server r正在偵聽的主機(jī)和端口的地址。 REPRESENTATIONTYPE(TYPE) ) 其參數(shù)指明了表示類型(DataRepresentationandStorage e一節(jié)中有描述)。某些類型需要第二個參數(shù)。參數(shù)一用一個單獨的Telnet t字符表示,如同ASCII I和EBCDIC C的第二個格式參數(shù);參數(shù)二是一個十進(jìn)制整數(shù),用于指出本地字節(jié)的大小。兩個參數(shù)用<SP>分割(空格,ASCII I碼32)。 類型碼如下: 默認(rèn)的表示類型是ASCIINon-print。如果格式參數(shù)發(fā)生改變,只是第一個參數(shù)被改變,那么格式將恢復(fù)到默認(rèn)的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 默認(rèn)結(jié)構(gòu)是File。 TRANSFERMODE(MODE) ) 其參數(shù)是一個單獨的Telnet t字符,指明了數(shù)據(jù)傳輸模式(在Transmission nModes s一節(jié)中描述)。 傳輸模式的編碼如下: S-Stream mB-Block kC-Compressed d 默認(rèn)傳輸模式是Stream。 4.4.4.4.1.1.1.1.3.3.3.3.FFFFTTTTPPPP服務(wù)命令(FTPSERVICECOMMANDS) ) FTPservice e命令定義了文件傳輸或者用戶請求的文件系統(tǒng)功能。FTPservice e命令的參數(shù)正常情況下是一個路徑名。路徑名的語法必須符合server r的約定及控制連接的約定。默認(rèn)使用最后指定的設(shè)備、目錄或文件名,或者本地缺省值。此類命令可按任意次序執(zhí)行,例外情況:renamefrom m命令之后必須是renameto o命令,restart t命令后必須是中斷服務(wù)命令(例如STOR R或者RETR)。為響應(yīng)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)容應(yīng)不受影響。 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一樣,有一點除外:文件在當(dāng)前目錄下以唯一的名字創(chuàng)建。TransferStarted d的響應(yīng)(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可能需要此命令來預(yù)留足夠的空間,以便容納傳輸來的新文件。其參數(shù)是一個十進(jìn)制整數(shù),表示預(yù)留給新文件的存儲字節(jié)數(shù)。對于按record d或page e結(jié)構(gòu)傳輸?shù)奈募瑀ecord d或page e尺寸(以邏輯字節(jié)計)的最大值可能同樣需要,此命令的第二個參數(shù)指明了這個值(十進(jìn)制整數(shù))。參數(shù)二是可選的,與參數(shù)一通過三個Telnet t字符<SP>R<SP> >進(jìn)行分割。此命令之后應(yīng)該緊跟著一個STORe e或APPEnd d命令。對于那些不必事先聲明文件最大值的server r,或者僅對record d或page e的尺寸最大值感興趣的server,ALLO O命令被當(dāng)作一個NOOP P(無操作)命令,第二類server r將參數(shù)一視為假值并忽略它。 RESTART(REST) ) 其參數(shù)表示servermarker r,將在此處重啟文件傳輸。此命令不會啟動文件傳輸,只是定位到指定的數(shù)據(jù)檢查點。此命令之后應(yīng)該緊跟著適當(dāng)?shù)腇TPservice e命令,用于啟動文件傳輸。 RENAMEFROM(RNFR) ) 此命令指定了重命名文件的舊路徑名。該命令之后必須緊跟著一個renameto o命令,用于指定新的文件路徑名。 RENAMETO(RNTO) ) 此命令指定了重命名文件的新路徑名,與RNFR R命令一起完成文件重命名。 ABORT(ABOR) ) 此命令告知server r中止先前的FTPservice e命令以及與之相關(guān)的數(shù)據(jù)傳輸。中止命令可能需要特殊的動作(依照FTPCommands s一節(jié)中的討論)來強(qiáng)制server r做出識別。如果先前的命令已經(jīng)完成(包括數(shù)據(jù)傳輸),則不執(zhí)行任何特殊動作。Server r不關(guān)閉控制連接,但必須關(guān)閉數(shù)據(jù)連接。 Server r收到此命令時,有兩種情況:FTPservice e命令已經(jīng)完成,或者正在執(zhí) 行當(dāng)中。 在第一種情況中,server r關(guān)閉數(shù)據(jù)連接(若是打開狀態(tài)),發(fā)出應(yīng)答碼226, ,表明abort t命令成功執(zhí)行。 第二種情況,server r中止正在執(zhí)行的FTPservice e,關(guān)閉數(shù)據(jù)連接,返回應(yīng)答碼426,表明service e請求非正常結(jié)束。接著server r發(fā)送應(yīng)答碼226,表明abort t命令成功執(zhí)行。 DELETE(DELE) ) 此命令依給定的pathname e刪除server r上的文件。若要求額外的保護(hù),比如“確信要刪除嗎?”,這應(yīng)該由user-FTPprocess s提供。 REMOVEDIRECTORY(RMD) ) 此命令依給定的pathname e移除相應(yīng)的目錄,pathname e可以是絕對路徑或相對路徑。見附錄II I。 MAKEDIRECTORY(MKD) ) 此命令依給定的pathname e創(chuàng)建一個目錄,pathname e可以是絕對目錄或相對目錄。見附錄II I。 PRINTWORKINGDIRECTORY(PWD) ) 此命令將在reply y中返回當(dāng)前工作目錄的名稱。見附錄II I。 LIST(LIST) ) 此命令從server r向passiveDTP P發(fā)送一個列表。如果pathname e指定了一個目錄或其它的文件組,server r應(yīng)該傳輸指定目錄的一個文件列表。如果pathname e指定了一個文件,server r應(yīng)當(dāng)發(fā)送文件的當(dāng)前信息。若參數(shù)為null l意味著用戶的當(dāng)前工作目錄或缺省目錄。數(shù)據(jù)以ASCII I或EBCDIC C類型在數(shù)據(jù)連接上傳輸。 (用戶必須保證TYPE E是ASCII I或EBCDIC)。因為文件信息隨著系統(tǒng)的不同而不同, ,很難被程序自動使用,但對人類用戶非常有用。 NAMELIST(NLST) ) 此命令從server r向用戶發(fā)送一個目錄列表。Pathname e應(yīng)當(dāng)給出一個目錄或其它系統(tǒng)特有的文件組描述符;參數(shù)為null l是指當(dāng)前目錄。Server r將返回一個文件名稱流,而沒有其它信息。數(shù)據(jù)將按ASCII I或EBCDIC C類型通過數(shù)據(jù)連接進(jìn)行傳輸,<CRLF> >或<NL> >將這些數(shù)據(jù)分割為有效的路徑名字符串。(用戶必須保證TYPE E是正確的)。此命令返回的信息能夠被程序使用,以便進(jìn)一步自動處理這些文件,例如,用于“multipleget t”功能的實現(xiàn)。 SITEPARAMETERS(SITE) ) Server r使用此命令提供針對自身系統(tǒng)的service e,這些service e對于數(shù)據(jù)傳輸是必要的,但不具有普遍性,不能作為協(xié)議中的命令。這些service e的本性以及它們的語法規(guī)格在HELPSITE E命令的響應(yīng)中有陳述。 SYSTEM(SYST) ) 此命令用于獲取server r操作系統(tǒng)的類型。 STATUS S(STAT) ) 此命令將以應(yīng)答的形式通過控制連接發(fā)送一個狀態(tài)響應(yīng)。此命令可在一個文件傳輸過程中發(fā)送(連同TelnetIP P和同步信號一起—見FTPCommands s一節(jié)), ,此時server r將以正在執(zhí)行的操作的狀態(tài)作為回復(fù);STAT T也可在多個文件傳輸過程中發(fā)送。在后一種情況下,STAT T命令有一個參數(shù)。若此參數(shù)是一個pathname, ,STAT T與list t命令相似,只不過數(shù)據(jù)通過控制連接進(jìn)行傳輸。如果只給出了部分pathname,server r可能返回與之相關(guān)的文件名或?qū)傩粤斜?。若沒有給出參數(shù),應(yīng)當(dāng)返回serverFTPprocess s的一般狀態(tài)信息,包括所有傳輸參數(shù)的當(dāng)前值和連server接狀態(tài)。 HELP(HELP) ) 此命令請求server r通過控制連接向用戶發(fā)送有關(guān)其實現(xiàn)狀態(tài)(implementation nstatus s)的幫助信息。HELP P命令可以有一個參數(shù)(例如任何一個命令名),并且返回更多的詳細(xì)信息。應(yīng)答碼是211 1或214。建議在輸入USER R命令之前允許HELP P命令的執(zhí)行。Server r可以利用此應(yīng)答來列舉站點依賴(site-dependent t)的參數(shù),例如對HELPSITE E的響應(yīng)。 NOOP(NOOP) ) 此命令不影響任何參數(shù)或以前輸入的命令。它不執(zhí)行動作,僅server r發(fā)送一個OK K應(yīng)答。 對控制連接上的所有通信,F(xiàn)TP P遵循Telnet t協(xié)議規(guī)范。 FTP P命令是以Telnet t行結(jié)束符終止的Telnet t字符串。命令碼(commandcodes) )本身是字母字符,其后若有參數(shù)則以<SP> >分割,若無參數(shù)則以Telnet t行結(jié)束符終止。本節(jié)討論了命令碼和命令的語義;詳細(xì)的命令語法在Commands s一節(jié)中給出,應(yīng)答序列在SequencingofCommandsandReplies s一節(jié)中討論,命令的使用情景說明在TypicalFTPScenarios s一節(jié)中提供。 FTP P命令可能被劃分為幾部分,分別用于指定訪問控制標(biāo)識符,數(shù)據(jù)傳輸參數(shù),或者FTP Pservice e請求。當(dāng)數(shù)據(jù)傳輸正在進(jìn)行時,某些命令(比如ABOR,STAT,QUIT T)可能通過控制連接進(jìn)行傳輸。某些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應(yīng)該沒有不正常的影響)4.2.FTP 應(yīng)答(FTPREPLIES) FTP P命令的應(yīng)答用來保證requests s和文件傳輸過程中的動作之間的同步,也用來保證userprocess s總是能知道server r的狀態(tài)。每個命令必須至少產(chǎn)生一個應(yīng)答,也可能多個;后一種情況中,多個應(yīng)答必須很容易被識別。另外,一些命令按照有序的組出現(xiàn),例如USER,PASS S和ACCT T,或者RNFR R和RNTO。如果先前所有的命令已經(jīng)成功執(zhí)行,應(yīng)答就說明了中間狀態(tài)的存在。在這個序列中任何一點發(fā)生故障,都將迫使整個序列從頭開始重新執(zhí)行。 下面的一組狀態(tài)圖明確的說明了命令應(yīng)答序列的細(xì)節(jié)。 一個FTP P應(yīng)答由三個數(shù)字(按三個數(shù)字字符傳輸)后跟一些文本組成。數(shù)字專供自動裝置使用,來決定下一步的輸入;文本專供人類用戶使用。三個數(shù)字包含了足夠的編碼信息,user-process(theuser-PI I)不需要檢查文本,并可能丟棄它或傳給user,視情況而定。特別的,文本可能依賴于server,所以對于每個應(yīng)答碼可能有不同的文本。 一個應(yīng)答定義為包含3 3位數(shù)字,跟著空格<SP> >,跟著一行文本(有些指定了文本行長度最大值),以Telnet t行結(jié)束符終止??墒且灿幸恍┣闆r,文本行超過一行,此時必須將文本用括號括起來,這樣user-process s才能知道何時停止讀reply(也即停止處理控制連接上的輸入),轉(zhuǎn)而去做其它事情。第一行文本需要特殊的格式表明文本有多行,最后一行文本也需要特殊格式指明其為最后一行。不論何種情況,應(yīng)答必須包含合適的應(yīng)答碼以表明傳輸?shù)臓顟B(tài)。為滿足所有的情況,第一行及最后一行的code e應(yīng)當(dāng)相同。 因此多行應(yīng)答的格式為第一行以應(yīng)答碼開始,緊跟著連字符“-”(也被稱為負(fù)號),接著是文本。最后一行以相同的應(yīng)答碼開始,緊跟著空格<SP> >,然后是可選的文本,最后是行結(jié)束符。 例如: 123-第一行 第二行 234 4以數(shù)字開始的行 123 3最后一行 于是user-process s僅需要搜索相同應(yīng)答碼第二次在行首出現(xiàn),且跟著空格<SP>。找到后,user-process s將忽略所有的中間行。若中間行以一個3位數(shù)開頭, ,server r必須填充該行頭部來避免混淆。 此scheme e允許標(biāo)準(zhǔn)的系統(tǒng)程序產(chǎn)生應(yīng)答信息(比如STAT T應(yīng)答),通過添加偽造的首行和尾行。這些系統(tǒng)程序一般不會在行的開始處產(chǎn)生3個數(shù)字和一個空格,每一文本行的開始處應(yīng)當(dāng)添加一些中性的文本,像空格。此scheme e假設(shè)多行應(yīng)答不被嵌套。 應(yīng)答碼的3 3個數(shù)字都有特別的意義。User-process s可利用這3個數(shù)字來簡化復(fù)雜的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命令)。 應(yīng)答碼的第一個數(shù)字有五種取值: 1yz zPositive ePreliminary yreply y 請求的action n正在被發(fā)起;在繼續(xù)一個新命令前期待另一個應(yīng)答。(在應(yīng)答結(jié)束前,user-process s發(fā)送另一個命令將違反協(xié)議;若先前的命令正在執(zhí)行,server-FTPprocess s應(yīng)當(dāng)把此時收到的命令進(jìn)行排隊)此應(yīng)答類型表明命令已被接受,user-process s現(xiàn)在可以關(guān)注數(shù)據(jù)連接了。Server-FTPprocess s每個命令至多發(fā)送一個1yz z應(yīng)答。 2yz zPositiveCompletionreply y 請求的action n成功執(zhí)行。一個新的request t可以被發(fā)起。 3yz zPositiveIntermediatereply y 命令已被接受,但請求的action n處于暫停狀態(tài),等待收到進(jìn)一步的信息。User r應(yīng)當(dāng)發(fā)送另一個命令指定這個信息。此應(yīng)答用于命令序列組。 4yz zTransientNegativeCompletionreply y 命令沒被接受,請求的action n沒有發(fā)生,但錯誤情況是暫時的,action n可以被再次請求。User r應(yīng)當(dāng)返回命令序列的開始處,若有。很難為transient t指派一個含義,特別是兩個不同的site(server-和user-process s)都必須贊成這個解釋。4yz z類的每個應(yīng)答可能有稍微不同的time e值,但目的都是鼓勵user-process s再嘗試一次。判斷一個reply y屬于4yz z還是5yz z:若命令可被重復(fù),而無需改變命令形式或user/server r的屬性,則reply y屬于4yz z。(例如使用相同的命令及參數(shù);user r不改變文件訪問或username;server r沒有提出一個新的implementation.) ) 5yz zPermanentNegativeCompletionreply y 命令沒被接受,請求的action n沒有發(fā)生。User-process s被勸阻不要再重復(fù)執(zhí)行相同的請求(按相同序列)。實際上某些“permanent t”錯誤情況可以被改正, ,因而人類用戶可通過directaction n指揮user-process s重新發(fā)起命令序列(例如,在改變拼寫后,或user r更改了目錄狀態(tài))。 第二個數(shù)字對下列功能組進(jìn)行了編碼: x0z zSyntax x 此類應(yīng)答涉及語法錯誤,依照句法改正命令。 x1z zInformation n 對信息請求的應(yīng)答,例如status s或help。 x2z zConnections s 應(yīng)答涉及控制和數(shù)據(jù)連接。 x3z zAuthenticationandaccounting g 對登錄過程或accountingprocedures s的應(yīng)答。 x4z z尚未指明。 x5z zFile esystem m 此類應(yīng)答指出了server r文件系統(tǒng)的狀態(tài)。 在每個功能組(由第二個數(shù)字指定)中,第三個數(shù)字給出了一個好的gradation nofmeaning。下面的應(yīng)答列表將對此進(jìn)行說明。注意,建議(非強(qiáng)制)每個應(yīng)答關(guān)聯(lián)一些文本,依照與之相關(guān)的命令,這些文本可能會有所改變。另一方面,應(yīng)答碼必須嚴(yán)格遵循最后一節(jié)的規(guī)范;對于那些與此處描述稍有不同的情況,server rimplementations s不應(yīng)當(dāng)創(chuàng)造新的應(yīng)答碼,而是要適應(yīng)已定義的碼。 有些命令,如TYPE E或ALLO O,成功執(zhí)行后,不向user-process s提供任何新的信息,將返回一個200 0應(yīng)答。若一個特別的server-FTPprocess s沒有實現(xiàn)某個命令,例如TOPS20site e上的ALLO O,依然需要一個PositiveCompletionreply, ,以便簡單的user-process知道它能繼續(xù)進(jìn)行其action過程。此情況的應(yīng)答碼是202, ,應(yīng)答文本:“Nostorageallocationnecessary”。另一方面,若某個未實現(xiàn)的命令請求一個non-site-specificaction,應(yīng)答是502。對于已實現(xiàn)的命令,應(yīng)答是504,但需要一個未實現(xiàn)的參數(shù)。 4.4.4.4.2.2.2.2.1111依功能分組的應(yīng)答碼(ReplyCodesbyFunctionGroups) ) 200 0命令ok k 500 0語法錯誤,命令無法識別 可以包含錯誤比如命令行太長 501 1參數(shù)語法錯誤 202 2命令未實現(xiàn),當(dāng)前主機(jī)不需要此命令 502 2命令未實現(xiàn) 503 3錯誤的命令序列504Commandnotimplementedforthatparameter. . 110Restartmarker r應(yīng)答這里,文本是確切的,與特定的實現(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應(yīng)答212 2目錄狀態(tài)213 3文件狀態(tài)214 4幫助信息 關(guān)于server r的使用方法或特殊的非標(biāo)準(zhǔn)命令的含義。該應(yīng)答僅對人類用戶有用。 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應(yīng)答碼的數(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 所有的主機(jī)必須接受上面的內(nèi)容作為缺省標(biāo)準(zhǔn)。5.2. 連接(CONNECTIONS) Server-PI I應(yīng)當(dāng)在PortL L上偵聽。User r或user-PI I將發(fā)起全雙工控制連接。Server-和user-process s應(yīng)當(dāng)遵循Telnet t協(xié)議(詳見ARPA-Internet tProtocol lHandbook[1] ])的約定。Server r沒有義務(wù)提供命令行編輯功能,可以要求在user r主機(jī)上完成。完成所有的傳輸和應(yīng)答后,user r請求server r關(guān)閉控制連接。 User-DTP P必須在指定的數(shù)據(jù)端口上偵聽;可以是默認(rèn)的用戶端口(U)或PORT命令指定的端口。Server r應(yīng)當(dāng)從自己的默認(rèn)數(shù)據(jù)端口(L-1 1)向指定的用戶數(shù)據(jù)端口發(fā)起數(shù)據(jù)連接。傳輸?shù)姆较蚝褪褂玫亩丝谌Q于FTPservice e命令。 注意所有的FTP P必須支持使用默認(rèn)端口的數(shù)據(jù)傳輸,僅有user-PI I可以開始使用非默認(rèn)端口。 當(dāng)數(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ā)起一個連接。當(dāng)user-PI I收到PASV V命令的確認(rèn)時,其中包括serverA A和端口的標(biāo)識,user-PI I利用PORT命令把A的端口a a發(fā)送給B;B B返回一個應(yīng)答。User-PI I給A和B發(fā)送相應(yīng)的service e命令。B發(fā)起連接,開始傳輸。下面列出了命令-應(yīng)答序列,消息在垂直方向上同步,水平方向異步。 在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ù)連接,看看是否需要進(jìn)行偵聽(記住,在發(fā)送傳輸請求之前,user r必須偵聽一個已關(guān)閉的數(shù)據(jù)端口)。為避免情況紊亂,server r在關(guān)閉數(shù)據(jù)連接后發(fā)送一個226 6應(yīng)答(若連接保持打開,會發(fā)送一個文件傳輸完成應(yīng)答250,user-PI I在發(fā)出一個新的傳輸命令之前應(yīng)當(dāng)?shù)却@些應(yīng)答)。 任何時候,user r或server r發(fā)現(xiàn)連接被另一方關(guān)閉,都應(yīng)當(dāng)立即讀取連接中剩余的隊列數(shù)據(jù)并且在自己一方進(jìn)行關(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 這也可應(yīng)用于任何表示參數(shù)值的符號,例如A A或a a表示ASCIITYPE。命令碼和參數(shù)域用一個或多個空格分割。 對于NVT-ASCII I表示法,參數(shù)域由一個可變長的字符串組成,以字符序列<CRLF>(CarriageReturn,LineFeed)結(jié)尾,對于其它協(xié)商的語言可能使用不同的行結(jié)束符。應(yīng)當(dāng)注意,server r不會執(zhí)行動作直至收到行結(jié)束符。 按照NVT-ASCII I表示法,下面給出了語法。參數(shù)域中的所有字符都是ASCII I字符,包括任何ASCII I表示的十進(jìn)制整數(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. 命令和應(yīng)答序列(SEQUENCINGOFCOMMANDSANDREPLIES) User和server之間的通信是一個交互的對話。User發(fā)出一個FTP命令,server r立刻以一個應(yīng)答進(jìn)行響應(yīng)。User r在發(fā)送下一個命令前,應(yīng)當(dāng)?shù)却@個最初的成功或失敗的響應(yīng)。 某些命令需要第二個應(yīng)答,對此user r也應(yīng)當(dāng)?shù)却?。這些應(yīng)答可以報告文件傳輸?shù)倪M(jìn)度或完成,或者關(guān)閉數(shù)據(jù)連接。對于文件傳輸命令,它們是secondary yreplies。 一組重要的informationalreplies s是connectiongreetings。在正常情況下,當(dāng)連接建立后,server r將發(fā)送一個220 0應(yīng)答,“等待輸入”。User r在發(fā)送任何命令前應(yīng)當(dāng)?shù)却@個greetingmessage。若server r不能立即接受輸入,應(yīng)當(dāng)馬上發(fā)送120 0應(yīng)答,就緒后再發(fā)送220 0應(yīng)答。User r就可知道即使有延遲也不掛起。 自發(fā)應(yīng)答(SpontaneousReplies) ) 有時系統(tǒng)自發(fā)的給用戶(通常是所有用戶)發(fā)送一個消息。例如,"System mgoingdownin15minutes"。FTP P沒有規(guī)定server r向user r發(fā)送這樣的自發(fā)信息。建議將此類信息放入server-PI I的隊列,并且在下一個reply(可能構(gòu)成了一個多行應(yīng)答)中傳達(dá)給user-PI。 下面的表格列出了每個命令的可選的成功和失敗的應(yīng)答。必須嚴(yán)格遵守;server r可以替換應(yīng)答中的文本,但不能改變應(yīng)答編碼的含義以及特定命令應(yīng)答序列暗指的action。 命令應(yīng)答序列(Command-ReplySequences) ) 本節(jié)列出了命令應(yīng)答序列。每個命令連同其可能的應(yīng)答一起列出,同組的命令寫在了一起。首先列出開始的應(yīng)答(后續(xù)的應(yīng)答縮進(jìn)寫在下面),然后是positive eandnegativecompletion n,最后是序列中其余命令的應(yīng)答。這個列表是狀態(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)圖。僅使用了應(yīng)答編碼的第一個數(shù)字。對每個FTP P命令組或命令序列都給出了狀態(tài)圖。 命令分組取決于每個命令的構(gòu)造模型,用相同結(jié)構(gòu)的模型把命令聚集在一起就形成了命令組。 對每個命令或命令序列,有三種可能的結(jié)果:success(S),failure(F),error(E)。在下面的狀態(tài)圖中,我們使用符號B B表示開始,符號W W表示等待應(yīng)答。 我們首先給出的這個圖描繪了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系列的應(yīng)答是出乎意料的,因此被看作是錯誤,但第二組期望(有些命令可能需要)100 0系列的應(yīng)答。記住,每個命令至多允許一個100 0系列的應(yīng)答。 其余的圖為命令序列建模,也許其中最簡單的是rename e序列。 下圖是Restart t命令的簡單模型: 此處cmd d是APPE,STOR R或者RETR R。 我們注意到上面三個模型是相似的。Restart t和Rename e的區(qū)別僅在于第二階段對100 0系列應(yīng)答的處理,第二組期望(有些命令可能需要)100 0系列的應(yīng)答。記住,每個命令至多允許一個100 0系列的應(yīng)答。 最復(fù)雜的圖是Login n序列: 最后,我們給出了一個一般化的圖,可用來對命令和應(yīng)答的交換進(jìn)行建模: 7. 典型的FTP 場景(TYPICALFTPSCENARIO) ) 主機(jī)U U上的user r想和主機(jī)S S進(jìn)行文件傳輸(to/from): : 一般的,user r通過一個間接的user-FTPprocess s和server r通訊。下面可能是一個典型的場景。User-FTP P提示出現(xiàn)在圓括號中,‘----> >’表示命令從主機(jī)U到主機(jī)S,'<----'表示從S到U的應(yīng)答。 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(八進(jìn)制25),也即L=21。
|