艺术品评估玉商业评估:RFC959 FTP

来源:百度文库 编辑:九乡新闻网 时间:2024/04/28 21:27:34

原文参考RFC0959,源自:http://www.rfc-editor.org/ /翻译:果皮版本:v1.0 02010-7-28 8
文件传输协议
备忘录的状况
此备忘录是FTP P协议的官方规范,可无条件分发。
下列新的可选命令包含在此版本的规范中:CDUP P(Change eto oParent tDirectory), ,SMNT T(Structure eMount), ,STOU(Store eUnique), ,RMD D(Remove eDirectory),MKD(MakeDirectory),PWD(PrintDirectory),andSYST(System). .
注意此规范兼容以前的版本。1 .简介
FTP P的目标如下:
1)促进文件共享(计算机程序和数据),2)鼓励间接或隐式(通过程序)的使用远程计算机,3)使用户免受主机之间文件存储系统的变化,4)可靠高效的传输数据。尽管用户可在终端机上直接使用FTP P,但设计FTP P主要是为了在程序中使用。
此规范试图用一个简单且容易实现的协议设计来满足用户的各种需求,如大型机、小型机、个人工作站和TACs。
这篇文章假设您已熟悉TCP P和Telnet t协议,相关文档包含在ARPA A互联网协议手册中。2 .概述
本节内容讨论历史、术语和FTP P模型。本节定义的术语仅仅是那些在FTP P中有特殊意义的词语。某些术语仅针对FTP P模型;当回顾术语时,一些读者可能需要借助于本节的FTP P模型。2.1 历史
多年来,FTP P协议有一个长期的演化。附录III I是和FTP P有关的按时间排序的RFC C文档列表。这些文档包含1971 1年第一个被提议的文件传输机制,它在麻省理工学院(M.I.T.)(RFC114)的主机上实现,RFC141 1中加上了注解和讨论。
RFC172 2提供了一个面向用户级的在主机间(包括终端IMPs s)传输文件的协
议。作为修订版,RFC265 5改编了FTP,RFC281 1提议做进一步的改变。1982 2年1 1月,RFC294 4提议使用事务数据集类型(?"SetDataType" "transaction)。
RFC354 4淘汰了RFC264 4和265。FTP P现在被定义为在ARPANET T上主机之间进行文件传输的一个协议,FTP P的主要功能是在主机之间高效可靠的传输文件,并允许方便的使用远程文件存储功能。RFC385 5进一步评论了协议的错误、目的和附件,RFC414 4则提供了关于serverFTP和userFTP P工作情况的报告。1973 3年发布的RFC430 0提出关于FTP P的进一步评议。最终,一份正式的FTP P文档出版了,这就是RFC454。
1973 3年7 7月以前,FTP P的最后一个版本发生了相当大的改变,但总体结构未变。作为新的官方规范,RFC542 2的发布体现了这些变化。尽管如此,基于旧版本的许多实现未被更新。
1974 4年,RFC607 7和614 4继续对FTP P发表评论。RFC624 4提出了深层的设计更改和小的修订。1975 5年,RFC686 6,标题为"Leaving gWell lEnoughAlone" ",讨论了所有新旧FTP P版本的不同。RFC691 1提出了对RFC686 6的轻微修订,和文件打印相关。
在底层协议从NCP P转换到TCP P的推动下,基于上述所有的努力,RFC765 5详述了FTP P在TCP P上的使用。
当前版本的FTP P规范准备改正一些小的文档错误,来改善某些协议特征的解释,并增加一些新的可选命令。
特别是,下列新的可选命令包含在此版本的规范中:
:CDUP– –进入上一级目录
录SMNT T– –结构装载(?StructureMount)
)STOU U– –唯一存储(?StoreUnique)
)RMD D– –删除目录MKD D– –新建目录PWD D–打印目录SYST T-System
m
此规范兼容以前的版本。依据先前版本实现的程序应该可以自动适应此规范。2.2 术语
ASCII I
ASCII I字符集定义在ARPA互联网协议手册中。在FTP P中,ASCII I字符集定义为一个八位编码集的低半部分(例如,最高位是零)。
访问控制(accesscontrols) )
访问控制定义了用户使用系统及系统文件的权限。访问控制必须防止对文件进行非法或意外的使用。调用访问控制是server-FTPprocess s的特权。
字节大小(bytesize) )
FTP P中有两种字节大小:文件的逻辑字节大小,用于数据传输的传输字节大小。传输字节大小总是8 8位。传输字节大小不一定是数据接收方系统的字节大小, ,也不一定是逻辑字节大小(用于解释数据的结构)。
控制连接(controlconnection) )
在USER-PI I和SERVER-PI I之间交换命令和应答的通信路径。此连接遵循
Telnet t协议。
数据连接(dataconnection) )
全双工连接,在此之上,数据以一种指定的模式和类型进行传输。被传输的
数据可能是文件的一部分、整个文件或若干文件。连接可以建立在server-DTP P和user-DTP P之间,或者两个server-DTP P之间。
数据端口(dataport) )
被动DTP P在数据端口上侦听来自主动DTP P的连接,以便能够打开数据连接。
DTP(datatransferprocess) )
DTP P建立和管理数据连接。DTP P可以是被动的或主动的。
行结束符(End-of-Line) )
行结束符定义了可打印行之间的间隔。回车+换行。
文件结束符(EOF) )
文件结束符定义了在传文件的结尾。
记录终止符(EOR) )
记录终止符定义了在传记录的结尾。
错误恢复(errorrecovery) )
允许用户从某些错误中恢复,比如主机系统或DTP P的故障。在FTP P中,错误恢复可能涉及文件传输的重启(在给定的检查点)。
FTP P命令(FTPcommands) )
一个命令集,包含了从user-FTP P到server-FTP P传输的控制信息。
文件(File) )计算机数据(包括程序)的有序集合,具有任意长度,通过路径名唯一识别。模式(mode) )在数据连接上,数据以此模式传输。模式定义了传输过程中的数据格式,包
括EOR R和EOF F。FTP P中定义的传输模式在TransmissionModes s一节中讲述。
网络虚拟终端(VNT) )
网络虚拟终端同Telnet t协议中的定义相同。
网络虚拟文件系统(NVFS) )
此概念定义了一个标准的网络文件系统,具有标准的命令和路径名约定。
页(Page) )
一个文件可能被结构化为被称为页的独立部分的集合。FTP P支持不连续文件
(独立的索引页)的传输。
路径名(pathname) )
路径名是用户输入到文件系统中的一个字符串,用于标识一个文件。路径名
一般包括设备和目录名,以及文件名。FTP P尚未指定标准的路径名约定。每个用户必须遵循传输过程中所涉及文件系统的文件名约定。
协议解释器(PI) )
Theprotocolinterpreter r。协议两端的user r和server r具有不同的角色(分别在user-PI I和server-PI I中实现)。
记录(record) )
一个顺序文件可能被结构化为若干称为记录的部分。FTP P支持记录结构,但传输的文件不必非得是记录结构。
应答(reply) )
应答是server r通过控制连接向user r发送的一个确认(肯定的或否定的),它是对FTP P命令的响应。应答的一般形式是一个完成码(包括错误码)后跟一个文本串。完成码为程序所用,文本串通常为人类用户所用。
服务器数据传输进程(server-DTP) )
DTP P,以正常的主动状态,通过侦听数据端口来建立数据连接。它为传输和存储设置一些参数,并且按照来自其协议解释器(PI I)的命令传输数据。DTP P
可以设置为被动状态进行侦听,而不是在数据端口发起一个连接。
服务器FTP P进程(server-FTPprocess) )
一个process s或process s集合,它与一个user-FTPprocess s(也可能是另一个
server r)协作完成文件传输的功能。此功能包括一个协议解释器(PI I)和一个数据传输进程(DTP)。
服务器协议解释器(server-PI) )
server-PI I在端口L(PortL L)上侦听来自user-PI I的连接,并且建立一个控制通信连接。它接收来自user-PI I的标准FTP P命令,发送应答,以及管理server-DTP P。
类型(type) )
数据表示类型,用于数据传输和存储。类型意味着在数据存储和数据传输之间的某些转换。FTP P中定义的表示类型在EstablishingDataConnections s一节中讲述。
用户(user) )
想要获得文件传输服务的一个人或可代表人的process s。人类用户可以直接与server-FTPprocess s交互,但是应优先使用user-FTPprocess s,因为FTP P协议的
设计更倾向于自动装置。
用户数据传输进程(user-DTP) )
DTP P在数据端口侦听来自server-FTPprocess s的连接。如果两个server r正在
相互传输数据,那么此user-DTP P将是不活跃的。
用户FTP P进程(user-FTPprocess) )
一个功能集合,包括一个PI I、一个DTP P以及一个用户界面,与一个或多个
server-FTPprocess s协作,共同完成文件传输功能。用户界面允许在命令应答中使用本地语言与user r进行对话。
用户协议解释器(user-PI) )
用户协议解释器(userprotocolinterpreter r)发起从其端口U(portU U)到server-FTPprocess s的控制连接,发出FTP P命令,并且管理user-DTP P(若其属于
此次文件传输)。2.3FTP 模型
(THEFTPMODEL)
基于上述定义,下面的模型(图1)解释了一个FTPservice。
注意:1.数据连接可用于任何一个方向。
2.数据连接不必一直存在。
。图1--FTP P使用模型
在图1 1描述的模型中,User-PI I发起了控制连接。控制连接遵循Telnet t协议。在user r的发起时刻,标准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发送标准应答。
FTP P命令为数据连接及文件系统操作指定了若干参数,前者的参数有数据端口、传输模式、表示类型和结构,后者有存储、获取、附加、删除等等。user-DTP P或其指派(?designate)应在特定数据端口上侦听,server r按照规定的参数发起数据连接和数据传输。注意,数据端口不必在发出FTP P命令的主机上,但是user r或user-FTPprocess s必须保证在指定的数据端口上侦听。也应注意,数据连接可能同时用于收发。
另一种情况,user r可能希望在两个远程主机间传输文件。User r建立到两个server r的控制连接,接着安排server r之间的数据连接。这样,控制信息被传递给user-PI,但是数据在server-DTP P间传输。下图是这种server-server r交互的模型。
图2 2
当数据正在传输时,此协议要求控制连接处于打开状态。当FTPservice e使用完毕时,user r有责任请求关闭控制连接,尽管是server r执行关闭动作。如果控制连接在没有收到命令的情况下被关闭了,server r可能会终止数据传输。
FTP P和Telnet t的关系:
FTP P在控制连接中使用Telnet t协议。这可以通过两种方式完成:第一,user-PI I或者server-PI I可在它们自己的程序中直接实现Telnet t协议的规则;第二,user-PI I或者server-PI I可利用系统中已存在的Telnet t组件。
第二种方法适用于免实现、代码共享及模块化编程的情况。若讲求效率和自主性则选第一种方法。
事实上,FTP P只用到了很少的Telnet t协议,因此第一种方法不需要写大量的代码。3. 数据传输功能(DATATRANSFERFUNCTIONS) )
文件仅通过数据连接进行传输。控制连接用于传输命令(描述了将要执行的功能)以及这些命令的应答(见FTPReplies s小节)。一些命令涉及到主机间数据的传输,这些命令包括MODE E命令(指定了数据位如何传输)、STRUCTURE E以及TYPE E命令(定义了数据的表示方式)。传输和表示基本上是无关的,但是流传输模式取决于文件结构属性,如果使用了压缩传输模式,填充字节取决于表示类型。3.1 数据表示和存储(DATAREPRESENTATIONANDSTORAGE)
数据从发送者主机的存储设备中传输到接收者主机的存储设备中。因为这两个系统的数据存储表示法常常是不同的,所以需要执行某些数据转换。例如,在不同的系统中,NVT-ASCII I具有不同的数据存储表示法。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位字中。在不同的系统间传输文本时,适合将字符转换成标准NVT-ASCII I表示法。收发方需在标准表示法和它们的内部表示法之间执行必要的转换。
当在不同字长的主机系统间传输二进制数据时,在表示法上出现了一个问
题。并不总是能够清楚的知道发送者如何发送数据以及接收者如何存储之。例如, ,当从32 2位字长的系统向36 6位字长的系统传输32 2位字节时,在后者系统中,在36 6位字中按照右对齐来存储32 2位字节可能是合适的。在任何情况下,user r应该能够指定数据表示法和转换方法。应该注意FTP P提供的数据类型表示法非常有限,其它类型的数据转换应该由user r直接执行。
3.3.3.3.1.1.1.1.1111数据类型(DATATYPES) )
FTP依据user指定的表示类型来处理数据表示。指定的类型可能含蓄的(asin nASCIIorEBCDIC)或明确的(asinLocalbyte)定义了逻辑字节大小。注意,这与在数据连接上传输的字节大小(称为传输字节大小)没有任何关系,二者不能混淆。例如,NVT-ASCII I的逻辑字节大小为8 8位。如果类型为本地字节,那么TYPE E命令必须用第二个参数来指定逻辑字节大小。传输字节大小总是8位。3.1.1.1.ASCII 类型( ASCIITYPE)
这是所有的FTP P必须接受的默认类型,主要用于传输文本文件。如果双方主机认为使用EBCDIC C类型更方便,则不使用ASCII I类型。
发送方将数据由字符的内部表示法转换为标准的8位NVT-ASCII表示法(参见Telnet t规范)。接收方则把数据由标准表示法转换为内部表示法。
按照NVT T标准,在文本行尾应当使用 >序列。(参见Data aRepresentationandStorage e小节最后关于文件结构的讨论)
使用标准的NVT-ASCII I表示法意味着必须将8位数据看作一个字节。
ASCII I和EBCDIC C类型的格式参数将在下面讨论。3.1.1.2.EBCDIC EBCDICTYPE)
当某些主机采用EBCDIC C作为内部字符表示法时,EBCDIC C可用于此类主机间的高效数据传输。
为进行传输,数据被表示为8位EBCDIC C字符序列。EBCDIC C和ASCII I类型的唯一区别在于字符编码。
EBCDIC C类型中很少使用行结束符(end-of-line),但使用换行符。3.1.1.3. 图像IMAGETYPE)
图像类型数据被看作连续的位,这些位被打包成8位传输字节,以便进行传输。接收方须将这些数据存储为连续的位。存储系统的结构可能要求对文件或文件中的记录进行填充,使得文件或记录处于字节、字或块的边界上。填充字节全为0,仅在文件或记录的末尾用到。对于填充字节,必须有一种识别方法,在重新获取文件时可将其剔除。填充字节的转换必须实现,使得用户可以进行文件存储。
图像类型用于高效存储、文件检索以及二进制数据的传输。建议所有的FTP P都应具有处理图像类型的能力。
3.1.1.4. 本地类型(LOCALTYPE)
此类型数据以逻辑字节进行传输,字节大小由第二个参数指定。参数二的值必须是十进制整数,且没有默认值。逻辑字节不必与传输字节大小相同。若这两种字节大小不同,那么应将数据连续的包装成逻辑字节,而不考虑传输字节的边界,末尾也无需进行字节填充。
当数据到达接收方主机时,将按某种方式进行转换,这取决于逻辑字节大小和特定的主机。这种转换必须是可逆的(若使用相同参数,获取到的文件也应相同),所有的FTP P应该实现此种转换。
例如,将36 6位浮点数发送到32 2位字长的主机时,数据应当按本地类型传输,逻辑字节为36 6位。接收方主机存储这些逻辑字节以便它们能更容易被操作; ;此例将36 6位逻辑字节放入64 4位双字中就足够了。
另一个例子,两台36 6位字长的主机,彼此间使用TYPEL36 6按字传输数据。数据将按8 8位传输字节打包传输,如此,9 9个传输字节可以运载2 2个字。3.1.1.5. 格式控制FORMATCONTROL)
ASCII I和EBCDIC C类型都接受第二个可选参数,指出了与文件相关联的垂直格式控制。
向主机传输一个字符文件,目的有三个:打印,存储及以后的获取,处理。若传输的文件用于打印,接收方主机必须知道垂直格式控制是如何表示的。对于第二个目的,文件存储在主机上以后,必须能够原样取回。最后,当文件从一台主机传输到另一台后,应可以在第二台主机上顺利的处理它。单独的ASCII I或EBCDIC C格式无法满足所有的情况。因此,这些类型具有第二个参数,用来说明下列三种格式:3.1.1.5.1.NONPRINT
若省略第二个格式参数,NONPRINT T将是默认使用的参数。所有FTP P必须实现Non-print t格式。
该文件无需包含垂直格式信息。若将此文件传给了printerprocess,此process s可能采用空格和边距的标准值。
通常,NONPRINT T格式适用于仅执行处理或存储操作的文件。
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垂直格式控制,例如,,,,表示行结束。
3.1.1.5.3.CARRIAGECONTROL(ASA)
文件包含ASA(FORTRAN N)垂直格式控制字符。按照ASA A标准格式化后, ,行或记录的第一个字符不打印,此字符用于确定纸张的垂直移动,纸张移动发生在剩余内容打印之前。ASA A标准指定了下列控制字符:
字符
垂直间距
空白
将纸张向上移动一行
0
0
将纸张向上移动两行
1
1
将纸张移动到下一页的顶部
+
+
无移动,比如套印
很明显,必须有一些方法使得打printerprocess s能够辨别结构实体的末端。对于记录结构的文件不存在任何问题;在传输和存储的过程中记录将被明确的标记。若文件不是记录结构,行结束符序列用于分割printinglines s,但这些格式控制字符被ASA A控制符覆盖。
3.3.3.3.1.1.1.1.2.2.2.2.数据结构(DATASTRUCTURES) )
除了不同的表示类型外,FTP P允许指定文件的结构。FTP P定义了三种文件结构:
file-structure e没有内部结构,文件被看作是数据字节的连续序列。
record-structure e文件由若干有序记录组成。
page-structure e文件由独立的若干索引页组成。
如果STRUcture e命令未被使用,默认为file-structure,但是对于文本文件(例如ASCII I或EBCDIC C类型)来说,所有的FTP P必须实现file-structure e和record-structure。
文件的固有结构取决于存储它的主机类型。在IBM M大型机上source-code e文件以定长记录的形式存储,但在DECTOPS-20 0上以字符流存储,字符流被CRLF F分割成多行。若文件在这不同的主机之间传输,必须有一些方法使得一台主机可以识别另一台主机的文件结构。
若将某种结构的文件传输到支持另一种文件结构的主机上,可能会出现问题。如果文本文件以record-structure e传输到支持file-structure e的主机上,那么该主机应对此文件做一个内部转换。显然,此转换是有用的,同时必须可逆,以便按record-structure e重新得到原文件。
当文件以file-structure e传输到支持record-structure e的主机上时,这就出现一个问题,主机如何将文件分割成若干record。如果必须分割,FTP P应该使用end-of-line e序列,ASCII I使用,EBCDIC C使用作为定界符。如果采用这种技术,那么当以file-structure e重新获取文件时,FTP P必须支持逆变换。3.1.2.1. 文件结构(FILESTRUCTURE)
STRUcture e命令未被使用时,默认为file-structure。file-structure e不存在内部结构,此结构的文件被看作是连续的数据字节序列。
3.1.2.2. 记录结构(RECORDSTRUCTURE)
对于文本文件(例如ASCII I或EBCDIC C类型的文件)来说,所有的FTP P必须支持record-structure。具有record-structure e结构的文件由若干有序的record d组成。3.1.2.3. 页PAGESTRUCTURE)
为传输不连续的文件,FTP P定义了pagestructure。此类文件有时被叫做"randomaccessfiles"或者也称为"holeyfiles"。传输这些文件时,需要添加一些附加信息:为整个文件添加filedescriptor r,为文件的一个section n添加pageaccess scontrols s,或者两者同时添加。在FTP P中,文件的section n称为page。为提供各种page e大小和相关信息,每一page e在传输时都带有一个pageheader。Pageheader r包含下列定义域:
HeaderLength h–pageheader r的逻辑字节数(包括此字节),headerlength h最小值为4。
PageIndex x– –逻辑页编号,而非此页的传输序列号,此编号用于识别文件中的页。
DataLength h– –页中的逻辑字节数,最小值为0。
PageType e– –页类型。
。页类型定义如下:

0=LastPage e用于指明传输过程的结束。Headerlength h必须为4,data alength h必须为0。
1=SimplePage e
常规类型,用于不含页级访问控制信息的简单页文件。Headerlength h必须为4。2=DescriptorPage e
用于传输文件整体的描述信息。
3=AccessControlledPage e
对于具有页级访问控制信息的文件来说,此类型页包含一个附加的headerfield。Headerlength h必须为5。
OptionalFields s–Furtherheaderfields,可能用于提供每一页的控制信息,例
如每页的访问控制。所有的域在长度上都是一个逻辑字节。逻辑字节的大小由TYPE E命令指定。参数警告:如果想得到与初始的传输文件完全相同的文件,所需参数应同存
储文件时用到的一样。反之,若使用相同的参数来存储和获取文件,那么FTP P必须返回与原文件完全相同的文件。
3.2. 建立数据连接(ESTABLISHINGDATACONNECTIONS)
传输数据的过程包括在合适的端口建立数据连接,选择传输参数。User r和server-DTP P都有一个默认的数据端口。User-process s的默认数据端口与控制连接端口(即U)相同。Server-process s的默认数据端口与控制连接端口(即L-1 1)邻近。
传输字节大小为8 8位。传输字节大小仅和实际的数据传输有关,与主机文件系统中数据的表示无关。
被动DTP P(可能是一个user-DTP P或server-DTP P)在发送传输请求命令前,必须在数据端口上侦听。请求命令决定了数据传输的方向。依据收到的传输请求, ,server r向特定端口发起数据连接。当连接建立后,DTP P之间开始数据传输,server-PI I给user-PI I发送一个确认应答。
所有FTP P必须支持默认数据端口的使用,仅有user-PI I能修改为非默认端口。
User r可以通过PORT T命令指定一个备用数据端口。User r可能想将文件传到TAClineprinter r或者从第三方主机获取一个文件。在后一种情况中,user-PI I与两个server-PI I建立控制连接。其中一个server r(通过一个FTP P命令)被告知侦听另一个server r发起的连接。User-PI I向一个server-PI I发送PORT命令,指明另一个server r的数据端口。最后,两个server r就可以互相发送传输命令了。User-controller r和server r之间发送的命令和应答序列在FTPReplies s一节中定义。
一般来说,server r负责数据连接的发起和关闭,有一种情况例外,当user-DTP P正在发送数据时需要关闭连接来表示文件结束。遇到下列情况server r必须关闭数据连接:
1、server r已经完成数据传输,需要关闭连接以表明文件结束。
2、server r收到了来自user r的ABORT T命令。
3、默认端口被用户命令改变。
4、控制连接被关闭
5、发生了不可恢复的错误。
其它情况下,server r可选择是否关闭数据连接,server r必须向user-process s发送250 0或226 6应答。3.3. 的管理DATACONNECTIONMANAGEMENT)
默认的数据连接端口:所有FTP P必须支持默认数据连接端口的使用,仅有user-PI I可以使用非默认端口。
非默认数据端口的协商:user-PI I可通过PORT T命令指定一个非默认的user rside e数据端口。User-PI I可通过PASV V命令请求server r识别非默认serverside e数据端口。因为连接由地址对确定,仅执行PORT T和PASV V其中一个就足以获得一个不同的数据连接。但是允许这两个命令全部执行,这样可在数据连接的两端全部使用新的端口。
数据连接的重用:当使用流模式传输数据时,必须通过关闭连接来表明文件结束。由于TCP P需要将连接保持一个超时周期来保证通信的可靠,因而当一个会话中有多个文件需要传输时,会造成问题:无法立即重新打开连接。
对这个问题,有两种解决方案:协商一个非默认端口,或者使用另一种传输
模式。
关于传输模式的评论。流传输模式与生俱来是不可靠的,因为它不能确定连接是否过早的被关闭。其它传输模式(Block,Compressed)不通过关闭连接来表明文件结束,它们有足够的FTPencoding g来解析数据连接,以确定文件是否结束。因此使用这些模式就能在传输多个文件时保持数据连接的打开。3.4. 传输模式(TRANSMISSIONMODES)
传输数据还需要选择合适的传输模式。有三种模式:第一种,将数据格式化, ,允许重启程序;第二种,为高效传输而将数据压缩;第三种,传输数据时,仅做极少的或不做处理。在最后一种情况中,传输模式与数据结构共同决定了处理操作的类型。在压缩模式中,表示类型(representationtype e)决定了填充字节(filler rbyte)。
所有的数据传输在文件结束时完成,end-of-file(EOF F)可以明确地给出,或者通过关闭数据连接来表示。对于recordstructure e类型的文件,所有的end-of-record(EOR)标记都是明确给出的,包括最后一个。对于pagestructure e文件,传输结束时使用last-page e页类型。
注意:在本节其余内容里,byte e是指传输字节,除非有明确的说明。
为使传输合乎标准,发送主机将end-of-line e或end-of-record d符号的内部表示法转变为由传输模式及文件结构规定的表示法,接收主机将执行逆变换。IBM M大型机的recordcount t域可能不被其它主机识别,因此end-of-record d信息在流模式中被当作两个字节控制码传输,在Block k或Compressed d模式中被当作描述符的一个标志位。ASCII I或EBCDIC C文件不具有recordstructure,其中的end-of-line e应当分别通过来表示。对于某些系统,这些转换意味着额外的工作,同类型的系统之间传输非记录结构的文本文件时,可能希望使用二进制表示法和流传输模式。
下列传输模式定义于FTP P中:
3.3.3.3.4.4.4.4.1.1.1.1.流模式(STREAMMODE) )
数据以字节流传输。不限制表示类型,允许recordstructure。
在recordstructure e文件中,EOR R和EOF F分别用一个两字节控制码表示。控制码的第一个字节都一样,为转义字符。对于EOR R,第二个字节的低阶位(low worderbit t)为1,其余位全0;对于EOF F,第二字节的次低阶位(secondloworder rbit t)为1,其余位为0;也就是说,对于EOR R和EOF F,第二字节的值分别为1 1和2。将第二字节的最后两位置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文件中,发送主机关闭数据连接就表示EOF。所有字节都是数据字节。
3.3.3.3.4.4.4.4.2.2.2.2.块模式(BLOCKMODE) )
文件以一系列数据块传输,数据块头部加上了一个或多个headerbytes。Headerbyte e包含一个countfield d和descriptorcode。Countfield d指明了数据块的字节总数,因而也标记了下一个数据块(无填充字节)的开始位置。descriptorcode e定义了如下内容:文件的最后一个块(EOF),记录的最后一个块(EOR),restart tmarker r(见ErrorRecoveryandRestart t一节),suspectdata a(也即传输的数据不可靠,被怀疑有错误)。其中suspectdata a不是用于FTP P错误控制的。它是出于主机交换某类型数据(例如地震或天气数据)的要求:收发所有的数据而忽略本地错误(比如磁带读错误),但在传输过程中指明某些部分是不可信的。块模式允许record dstructure,可以使用任何表示类型。
Header r包含三个字节。在header r的24 4个位中,低16 6位表示bytecount,高8 8位表示descriptorcodes,如下所示。
descriptorcodes s由descriptor r字节的标志位指出,共有4 4个code,每一个code e
编号以十进制表示。
Code e
Meaning g
128 8
数据块结尾是EOR R
64 4
数据块结尾是EOF F
32 2
数据块中的可疑错误
16 6
数据块是一个restart tmarker r
依上述编码,一个块可以有多种状态。按照需要设置相应的位。restartmarker r作为一个整数(8-bitbytes s)嵌入到数据流中,marker r中的字节都是可打印字符,restartmarker r内不能使用(空格)。例如,传输一个六字符marker,下列内容将被传输:
3.3.3.3.4.4.4.4.3.3.3.3.压缩模式(COMPRESSEDMODE) )
有三种信息将被发送:常规数据,按字节串发送;压缩数据,由replications s或填充字节组成;控制信息,以两字节转义序列的方式发送。如果有n(0n个字节之前加上一个字节,该字节的最左边一位置0,右边7 7位表示数n。
n
个数据字节d(1),...,d(n),n必须是正数。为压缩传输n个重复的数据字节d,发送下面2 2个字节:
N
N
个填充字节可被压缩成一个字节,填充字节依表示类型而变化。若类型为ASCII I或EBCDIC,填充字节是(空格,ASCII I码32,EBCDIC C码64)。若类型是Image e或Local,填充字节是0。
转义序列是双字节,字节1 1是转义字节(全0),字节2包含descriptorcodes。此处descriptorcodes s与块模式中的定义相同,并应用于随后的字节串。
压缩模式有助于增加带宽,在网络传输中仅需要一点点额外的CPU U开销。它可以有效地减小printerfiles s的大小,比如由远程作业输入(RJE E)主机生成的文件。3.5. 错误恢复与重启(ERRORRECOVERYANDRESTART)
数据传输过程中无法检测位丢失和乱序;此级别的错误控制由TCP P处理。尽管如此,重启过程用于保护用户免受显而易见的系统故障(包括主机、FTP-process s或者底层网络的故障)。
重启过程仅用于块或流模式的数据传输。它要求发送者向数据流中插入一个
特殊的markercode。Marker信息仅对发送者有意义,但必须是可打印字符。Marker r可以表示一个bit-count,一个record-count,或者其它任何信息,系统利用marker r来识别一个数据检查点。若接收者支持重启过程,将在数据流中标记出此marker r的相应位置,并且向user r返回此信息。
如果系统发生故障,user r可通过识别markerpoint,利用FTPrestartprocedure e重启数据传输。下面的例子说明了restartprocedure e的使用。
发送者在数据流的某个点插入一个适当的marker r块。接收方主机在其文件系统内标记相应的数据点,并且将最后一个已知的发送者和接收者marker r信息传达给user,传达方式要么是直接的,要么通过控制连接上的一个110 0应答,这取决于谁是发送者。若发生系统故障,user r或者controllerprocess s通过发送重启命令在最后一个servermarker r点重启server r,重启命令的参数为server r的marker rcode。重启命令在控制连接上传输,紧随其后的命令如RETR、STOR R或LIST, ,这些命令在系统发生故障时执行。4. 文件传输功能(FILETRANSFERFUNCTIONS) )
从user-PI I到server-PI I的通信信道是TCP P连接。User-PI I负责发送FTP P命令及解释收到的应答;server-PI I解释命令,发送应答,指导其DTP P建立数据连接及传输数据。在被动传输过程中,一方是server-DTP,如果第二方是user-DTP, ,那么它被user-FTP P主机通过内部协议进行管理;若第二方同样是server-DTP,那么它被其PI I按照来自user-PI I的命令进行管理。FTP P应答在下一节中讨论。此节中描述的几个命令,有助于明确可能的应答。4.1.FTP 命令(FTPCOMMANDS)
4.4.4.4.1.1.1.1.1.1.1.1.
访问控制命令(ACCESSCONTROLCOMMANDS) )
下列命令指定了访问控制标识符(命令码显示在括号中)。
USERNAME(USER) )
参数域是标识user r的Telnet t串。Server r需要user r标识来访问其文件系统。当控制连接建立后(一些server r需要这样),此命令通常是user r传送的第一个命令。某些server r还需要额外的标识信息(以password d或account t命令的形式)。Server r允许在任何时候输入新的USER R命令,以改变访问控制或accounting ginformation。这会冲掉任何user、密码和accountinformation,再次启动登录过程。所有的传输参数未变,任何正在进行的文件传输按照原来的访问控制参数完成。
PASSWORD(PASS) )
参数域是一个Telnet t串,指明了用户密码。此命令必须紧跟在USER R命令之后,完成user r的识别,进行访问控制。因为密码信息非常敏感,通常应掩盖它
或禁止屏幕显示。server r没有十分安全的方法来完成此任务,因此user-FTPprocess s有责任隐藏敏感的密码信息。
ACCOUNT(ACCT) )
参数域是标识用户账户的Telnet t串。此命令与USER R命令没有必然联系,一些主机可能需要一个account t用于登录,另一些仅用于特定的访问,比如存储文件。对于后一种情况,此命令可能随时到达。
有一些应答码用于自动区分这些情况:当account t信息用于登录时,成功执行PASSword d命令的应答码为332。另一方面,若登录不需要account t信息,成功执行PASSword d命令的应答码是230;若在以后的对话中发出了一个命令,需要account t信息,server r应该返回应答码332 2或532,这取决于server r是存储(pending greceiptoftheACCounTcommand) )还是丢弃此命令。
CHANGEWORKINGDIRECTORY(CWD) )
此命令允许用户改变工作目录或dataset,进行文件存取,无须改变其登录或accounting g信息。传输参数同样不变。此命令的参数为目录路径名或其它与系统相关的文件组标志符。
CHANGETOPARENTDIRECTORY(CDUP) )
此命令是CWD D的特例,在具有不同父目录命名语法的操作系统间传输目录树时,此命令可简化程序的实现。应答码与CWD D的应答码相同。更多细节见附录II I。
STRUCTUREMOUNT(SMNT) )
此命令允许user r装载一个不同的文件系统数据结构,无须改变其登录或accounting g信息,传输参数同样未变。此命令的参数为目录的路径名或其它与系统相关的文件组标志符。
REINITIALIZE(REIN) )
此命令终止USER R,冲掉所有的I/O O和accountinformation n,但允许执行完正在进行的传输。所有的参数重置为默认值,控制连接保持打开。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关闭控制连接。若有文件正在传输,连接将保持打开直至有响应结果,此时server r将关闭连接。如果user-process s正在给若干个USER R传输文件,但不愿关闭连接然后重新打开,那
么应该使用REIN命令来取代QUIT。若控制连接意外关闭,server r将执行ABOR R和QUIT T命令。
4.4.4.4.1.1.1.1.2.2.2.2.传输参数命令(TRANSFERPARAMETERCOMMANDS) )
所有的数据传输参数都有缺省值,仅当改变缺省参数值时,才需要执行用于指定传输参数的命令,最后给定的值将被作为缺省值。若传输数据时未指定传输参数,则标准缺省值如上所述。这意味着sever r必须记住可用的缺省值。传输参数命令可按任何顺序执行,但必须在FTPservice e请求之前。下列命令指定了数据传输参数:
DATA APORT(PORT) )
其参数说明了用于数据连接的数据端口。User r和server r都有默认的数据端口,正常情况下,不需要此命令及其应答。若使用了该命令,其参数是32 2位因特网主机地址加上16 6位TCP P端口地址。地址信息被分割为多个8 8位的域,每个域的值被转换为一个十进制数(以字符串的形式表示)。所有的域以逗号隔开。PORT命令如下:
PORTh1,h2,h3,h4,p1,p2 2
其中,h1 1是因特网主机地址的高8位。
PASSIVE(PASV) )
此命令请求server-DTP P在某个数据端口(非默认端口)上侦听,等待连接, ,而不是收到传输命令时发起连接。此命令的响应包含server r正在侦听的主机和端口的地址。
REPRESENTATIONTYPE(TYPE) )
其参数指明了表示类型(DataRepresentationandStorage e一节中有描述)。某些类型需要第二个参数。参数一用一个单独的Telnet t字符表示,如同ASCII I和EBCDIC C的第二个格式参数;参数二是一个十进制整数,用于指出本地字节的大小。两个参数用分割(空格,ASCII I码32)。
类型码如下:
默认的表示类型是ASCIINon-print。如果格式参数发生改变,只是第一个参数被改变,那么格式将恢复到默认的Non-print。
FILESTRUCTURE(STRU) )
其参数是一个单独的Telent t字符,指明了文件的结构(在DataRepresentation nandStorage e一节中有描述)。
文件结构的编码如下:
F-File(norecordstructure) )R-Recordstructure eP-Pagestructure e
默认结构是File。
TRANSFERMODE(MODE) )
其参数是一个单独的Telnet t字符,指明了数据传输模式(在Transmission nModes s一节中描述)。
传输模式的编码如下:
S-Stream mB-Block kC-Compressed d
默认传输模式是Stream。
4.4.4.4.1.1.1.1.3.3.3.3.FFFFTTTTPPPP服务命令(FTPSERVICECOMMANDS) )
FTPservice e命令定义了文件传输或者用户请求的文件系统功能。FTPservice e命令的参数正常情况下是一个路径名。路径名的语法必须符合server r的约定及控制连接的约定。默认使用最后指定的设备、目录或文件名,或者本地缺省值。此类命令可按任意次序执行,例外情况:renamefrom m命令之后必须是renameto o命令,restart t命令后必须是中断服务命令(例如STOR R或者RETR)。为响应FTP Pservice e命令而传输的数据,总是通过数据连接发送,某些informativereplies s除外。下列命令说明了FTPservice e请求:
RETRIEVE(RETR) )
此命令要求server-DTP P向数据连接另一端的server-或user-DTP P传输一个由pathname e指定的文件的拷贝。Server r上原文件的状态和内容应不受影响。
STORE(STOR) )
此命令请求server-DTP P接收由数据连接传来的数据,并将这些数据以文件的形式存储在server r上。若指定的文件路径名在server r上已存在,其内容将被这些数据替换。若指定的文件路径名不存在,将在server r上创建一个新文件。
STOREUNIQUE(STOU) )
此命令同STOR R一样,有一点除外:文件在当前目录下以唯一的名字创建。TransferStarted d的响应(250)必须包含生成的文件名。
APPEND(withcreate)(APPE) )
此命令请求server-DTP P接收由数据连接传来的数据,并将这些数据以文件的形式存储在server r上。若server r上存在指定的文件路径名,数据将被附加到该文件中;否则将按指定的路径名在server r上创建一个文件。
ALLOCATE(ALLO) )
某些server r可能需要此命令来预留足够的空间,以便容纳传输来的新文件。其参数是一个十进制整数,表示预留给新文件的存储字节数。对于按record d或page e结构传输的文件,record d或page e尺寸(以逻辑字节计)的最大值可能同样需要,此命令的第二个参数指明了这个值(十进制整数)。参数二是可选的,与参数一通过三个Telnet t字符R >进行分割。此命令之后应该紧跟着一个STORe e或APPEnd d命令。对于那些不必事先声明文件最大值的server r,或者仅对record d或page e的尺寸最大值感兴趣的server,ALLO O命令被当作一个NOOP P(无操作)命令,第二类server r将参数一视为假值并忽略它。
RESTART(REST) )
其参数表示servermarker r,将在此处重启文件传输。此命令不会启动文件传输,只是定位到指定的数据检查点。此命令之后应该紧跟着适当的FTPservice e命令,用于启动文件传输。
RENAMEFROM(RNFR) )
此命令指定了重命名文件的旧路径名。该命令之后必须紧跟着一个renameto o命令,用于指定新的文件路径名。
RENAMETO(RNTO) )
此命令指定了重命名文件的新路径名,与RNFR R命令一起完成文件重命名。
ABORT(ABOR) )
此命令告知server r中止先前的FTPservice e命令以及与之相关的数据传输。中止命令可能需要特殊的动作(依照FTPCommands s一节中的讨论)来强制server r做出识别。如果先前的命令已经完成(包括数据传输),则不执行任何特殊动作。Server r不关闭控制连接,但必须关闭数据连接。
Server r收到此命令时,有两种情况:FTPservice e命令已经完成,或者正在执
行当中。
在第一种情况中,server r关闭数据连接(若是打开状态),发出应答码226, ,表明abort t命令成功执行。
第二种情况,server r中止正在执行的FTPservice e,关闭数据连接,返回应答码426,表明service e请求非正常结束。接着server r发送应答码226,表明abort t命令成功执行。
DELETE(DELE) )
此命令依给定的pathname e删除server r上的文件。若要求额外的保护,比如“确信要删除吗?”,这应该由user-FTPprocess s提供。
REMOVEDIRECTORY(RMD) )
此命令依给定的pathname e移除相应的目录,pathname e可以是绝对路径或相对路径。见附录II I。
MAKEDIRECTORY(MKD) )
此命令依给定的pathname e创建一个目录,pathname e可以是绝对目录或相对目录。见附录II I。
PRINTWORKINGDIRECTORY(PWD) )
此命令将在reply y中返回当前工作目录的名称。见附录II I。
LIST(LIST) )
此命令从server r向passiveDTP P发送一个列表。如果pathname e指定了一个目录或其它的文件组,server r应该传输指定目录的一个文件列表。如果pathname e指定了一个文件,server r应当发送文件的当前信息。若参数为null l意味着用户的当前工作目录或缺省目录。数据以ASCII I或EBCDIC C类型在数据连接上传输。
(用户必须保证TYPE E是ASCII I或EBCDIC)。因为文件信息随着系统的不同而不同, ,很难被程序自动使用,但对人类用户非常有用。
NAMELIST(NLST) )
此命令从server r向用户发送一个目录列表。Pathname e应当给出一个目录或其它系统特有的文件组描述符;参数为null l是指当前目录。Server r将返回一个文件名称流,而没有其它信息。数据将按ASCII I或EBCDIC C类型通过数据连接进行传输, >或 >将这些数据分割为有效的路径名字符串。(用户必须保证TYPE E是正确的)。此命令返回的信息能够被程序使用,以便进一步自动处理这些文件,例如,用于“multipleget t”功能的实现。
SITEPARAMETERS(SITE) )
Server r使用此命令提供针对自身系统的service e,这些service e对于数据传输是必要的,但不具有普遍性,不能作为协议中的命令。这些service e的本性以及它们的语法规格在HELPSITE E命令的响应中有陈述。
SYSTEM(SYST) )
此命令用于获取server r操作系统的类型。
STATUS S(STAT) )
此命令将以应答的形式通过控制连接发送一个状态响应。此命令可在一个文件传输过程中发送(连同TelnetIP P和同步信号一起—见FTPCommands s一节), ,此时server r将以正在执行的操作的状态作为回复;STAT T也可在多个文件传输过程中发送。在后一种情况下,STAT T命令有一个参数。若此参数是一个pathname, ,STAT T与list t命令相似,只不过数据通过控制连接进行传输。如果只给出了部分pathname,server r可能返回与之相关的文件名或属性列表。若没有给出参数,应当返回serverFTPprocess s的一般状态信息,包括所有传输参数的当前值和连server接状态。
HELP(HELP) )
此命令请求server r通过控制连接向用户发送有关其实现状态(implementation nstatus s)的帮助信息。HELP P命令可以有一个参数(例如任何一个命令名),并且返回更多的详细信息。应答码是211 1或214。建议在输入USER R命令之前允许HELP P命令的执行。Server r可以利用此应答来列举站点依赖(site-dependent t)的参数,例如对HELPSITE E的响应。
NOOP(NOOP) )
此命令不影响任何参数或以前输入的命令。它不执行动作,仅server r发送一个OK K应答。
对控制连接上的所有通信,FTP P遵循Telnet t协议规范。
FTP P命令是以Telnet t行结束符终止的Telnet t字符串。命令码(commandcodes) )本身是字母字符,其后若有参数则以 >分割,若无参数则以Telnet t行结束符终止。本节讨论了命令码和命令的语义;详细的命令语法在Commands s一节中给出,应答序列在SequencingofCommandsandReplies s一节中讨论,命令的使用情景说明在TypicalFTPScenarios s一节中提供。
FTP P命令可能被划分为几部分,分别用于指定访问控制标识符,数据传输参数,或者FTP Pservice e请求。当数据传输正在进行时,某些命令(比如ABOR,STAT,QUIT T)可能通过控制连接进行传输。某些server r可能无法同时监测控制和数据连接,此时需要一些特殊的动作来获得server r的关注。暂时推荐下列有序格式:
1、在Telnet t流中,用户系统插入Telnet t“InterruptProcess”(IP)信号。2、用户系统发送Telnet t同步信号。3、在Telnet t流中,用户系统插入命令(例如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的状态。每个命令必须至少产生一个应答,也可能多个;后一种情况中,多个应答必须很容易被识别。另外,一些命令按照有序的组出现,例如USER,PASS S和ACCT T,或者RNFR R和RNTO。如果先前所有的命令已经成功执行,应答就说明了中间状态的存在。在这个序列中任何一点发生故障,都将迫使整个序列从头开始重新执行。
下面的一组状态图明确的说明了命令应答序列的细节。
一个FTP P应答由三个数字(按三个数字字符传输)后跟一些文本组成。数字专供自动装置使用,来决定下一步的输入;文本专供人类用户使用。三个数字包含了足够的编码信息,user-process(theuser-PI I)不需要检查文本,并可能丢弃它或传给user,视情况而定。特别的,文本可能依赖于server,所以对于每个应答码可能有不同的文本。
一个应答定义为包含3 3位数字,跟着空格 >,跟着一行文本(有些指定了文本行长度最大值),以Telnet t行结束符终止。可是也有一些情况,文本行超过一行,此时必须将文本用括号括起来,这样user-process s才能知道何时停止读reply(也即停止处理控制连接上的输入),转而去做其它事情。第一行文本需要特殊的格式表明文本有多行,最后一行文本也需要特殊格式指明其为最后一行。不论何种情况,应答必须包含合适的应答码以表明传输的状态。为满足所有的情况,第一行及最后一行的code e应当相同。
因此多行应答的格式为第一行以应答码开始,紧跟着连字符“-”(也被称为负号),接着是文本。最后一行以相同的应答码开始,紧跟着空格 >,然后是可选的文本,最后是行结束符。
例如:
123-第一行
第二行
234 4以数字开始的行
123 3最后一行
于是user-process s仅需要搜索相同应答码第二次在行首出现,且跟着空格。找到后,user-process s将忽略所有的中间行。若中间行以一个3位数开头, ,server r必须填充该行头部来避免混淆。
此scheme e允许标准的系统程序产生应答信息(比如STAT T应答),通过添加伪造的首行和尾行。这些系统程序一般不会在行的开始处产生3个数字和一个空格,每一文本行的开始处应当添加一些中性的文本,像空格。此scheme e假设多行应答不被嵌套。
应答码的3 3个数字都有特别的意义。User-process s可利用这3个数字来简化复杂的response e。第一个数字表示response e是好的,坏的或不完整的。(参阅状态图),user-process s通过简单的检查第一个数字就能决定下一步的动作(按计划继续执行,重做,retrench h,等等)。若User-process s想知道发生了何种错误(例如文件系统错误,命令语法错误),可以检查第二个数字,保留第三个数字用于信息分级(例如RNTO O命令先前没有执行RNFR R命令)。
应答码的第一个数字有五种取值:
1yz zPositive ePreliminary yreply y
请求的action n正在被发起;在继续一个新命令前期待另一个应答。(在应答结束前,user-process s发送另一个命令将违反协议;若先前的命令正在执行,server-FTPprocess s应当把此时收到的命令进行排队)此应答类型表明命令已被接受,user-process s现在可以关注数据连接了。Server-FTPprocess s每个命令至多发送一个1yz z应答。
2yz zPositiveCompletionreply y
请求的action n成功执行。一个新的request t可以被发起。
3yz zPositiveIntermediatereply y
命令已被接受,但请求的action n处于暂停状态,等待收到进一步的信息。User r应当发送另一个命令指定这个信息。此应答用于命令序列组。
4yz zTransientNegativeCompletionreply y
命令没被接受,请求的action n没有发生,但错误情况是暂时的,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。(例如使用相同的命令及参数;user r不改变文件访问或username;server r没有提出一个新的implementation.) )
5yz zPermanentNegativeCompletionreply y
命令没被接受,请求的action n没有发生。User-process s被劝阻不要再重复执行相同的请求(按相同序列)。实际上某些“permanent t”错误情况可以被改正, ,因而人类用户可通过directaction n指挥user-process s重新发起命令序列(例如,在改变拼写后,或user r更改了目录状态)。
第二个数字对下列功能组进行了编码:
x0z zSyntax x
此类应答涉及语法错误,依照句法改正命令。
x1z zInformation n
对信息请求的应答,例如status s或help。
x2z zConnections s
应答涉及控制和数据连接。
x3z zAuthenticationandaccounting g
对登录过程或accountingprocedures s的应答。
x4z z尚未指明。
x5z zFile esystem m
此类应答指出了server r文件系统的状态。
在每个功能组(由第二个数字指定)中,第三个数字给出了一个好的gradation nofmeaning。下面的应答列表将对此进行说明。注意,建议(非强制)每个应答关联一些文本,依照与之相关的命令,这些文本可能会有所改变。另一方面,应答码必须严格遵循最后一节的规范;对于那些与此处描述稍有不同的情况,server rimplementations s不应当创造新的应答码,而是要适应已定义的码。
有些命令,如TYPE E或ALLO O,成功执行后,不向user-process s提供任何新的信息,将返回一个200 0应答。若一个特别的server-FTPprocess s没有实现某个命令,例如TOPS20site e上的ALLO O,依然需要一个PositiveCompletionreply, ,以便简单的user-process知道它能继续进行其action过程。此情况的应答码是202, ,应答文本:“Nostorageallocationnecessary”。另一方面,若某个未实现的命令请求一个non-site-specificaction,应答是502。对于已实现的命令,应答是504,但需要一个未实现的参数。
4.4.4.4.2.2.2.2.1111依功能分组的应答码(ReplyCodesbyFunctionGroups) )
200 0命令ok k
500 0语法错误,命令无法识别
可以包含错误比如命令行太长
501 1参数语法错误
202 2命令未实现,当前主机不需要此命令
502 2命令未实现
503 3错误的命令序列504Commandnotimplementedforthatparameter. .
110Restartmarker r应答这里,文本是确切的,与特定的实现无关;
MARK Kyyyy y=
=此处yyyy y是user-process s数mmmm据流marker,mmmm m是server r的对等

marker r(注意marker r和“=”间的空格)211 1系统状态,或systemhelp p应答212 2目录状态213 3文件状态214 4帮助信息
关于server r的使用方法或特殊的非标准命令的含义。该应答仅对人类用户有用。
215NAMEsystemtype. .
此处NAME E是一个官方系统名(来自号码分配文档)。120 0在nnn n分钟内serviceready y。220 0对于新用户serviceready y。221service e关闭控制连接。
退出登录(若支持logout) )
421service e不可用,关闭控制连接。Thismaybeareplytoanycommand dif ftheserviceknowsit tmustshutdown. .
125 5数据连接已打开,传输开始225 5数据连接已打开,无数据传输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应答码的数值序列表(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. 规范说明(DECLARATIVESPECIFICATIONS) )5.1. 最小实现(MINIMUMIMPLEMENTATION)
为了使FTP P能工作,而没有多余的错误消息,所有的server r必须完成下面
的最小实现:
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. .
传输参数的缺省值:
TYPE E-ASCIINon-print t
MODE E-Stream m
STRU U-File e
所有的主机必须接受上面的内容作为缺省标准。5.2. 连接(CONNECTIONS)
Server-PI I应当在PortL L上侦听。User r或user-PI I将发起全双工控制连接。Server-和user-process s应当遵循Telnet t协议(详见ARPA-Internet tProtocol lHandbook[1] ])的约定。Server r没有义务提供命令行编辑功能,可以要求在user r主机上完成。完成所有的传输和应答后,user r请求server r关闭控制连接。
User-DTP P必须在指定的数据端口上侦听;可以是默认的用户端口(U)或PORT命令指定的端口。Server r应当从自己的默认数据端口(L-1 1)向指定的用户数据端口发起数据连接。传输的方向和使用的端口取决于FTPservice e命令。
注意所有的FTP P必须支持使用默认端口的数据传输,仅有user-PI I可以开始使用非默认端口。
当数据在两个server r之间传输时,A A和B(参考图2),user-PI,C,同两个server-PI I建立控制连接。user-PI I向serverA A发送一个PASV V命令告知它在其数据端口上侦听,而不是发起一个连接。当user-PI I收到PASV V命令的确认时,其中包括serverA A和端口的标识,user-PI I利用PORT命令把A的端口a a发送给B;B B返回一个应答。User-PI I给A和B发送相应的service e命令。B发起连接,开始传输。下面列出了命令-应答序列,消息在垂直方向上同步,水平方向异步。
在EstablishingDataConnections s一节描述的情况下,server r将关闭数据连接。如果数据连接要关闭时,接着有一个数据传输,此时不需要指明文件结束,server r
必须立即关闭连接。等待直至一个新的传输命令被拒绝,因为user-process s已经测试了数据连接,看看是否需要进行侦听(记住,在发送传输请求之前,user r必须侦听一个已关闭的数据端口)。为避免情况紊乱,server r在关闭数据连接后发送一个226 6应答(若连接保持打开,会发送一个文件传输完成应答250,user-PI I在发出一个新的传输命令之前应当等待这些应答)。
任何时候,user r或server r发现连接被另一方关闭,都应当立即读取连接中剩余的队列数据并且在自己一方进行关闭。5.3. COMMANDS
命令是在控制连接上传输的Telnet t字符串,如同在FTPCommands s一节中描述的那样。命令的功能和语义在AccessControlCommands,TransferParameter rCommands,FTPServiceCommands,andMiscellaneousCommands s节中描述。命令语法在此说明。
命令以命令码开始,跟着一个参数域。命令码是4 4个或更少的字母字符。不区分大小写。因此,下列任何一个都可表示获取命令:
RETR RRetr rretr rReTr rrETr r
这也可应用于任何表示参数值的符号,例如A A或a a表示ASCIITYPE。命令码和参数域用一个或多个空格分割。
对于NVT-ASCII I表示法,参数域由一个可变长的字符串组成,以字符序列(CarriageReturn,LineFeed)结尾,对于其它协商的语言可能使用不同的行结束符。应当注意,server r不会执行动作直至收到行结束符。
按照NVT-ASCII I表示法,下面给出了语法。参数域中的所有字符都是ASCII I字符,包括任何ASCII I表示的十进制整数。方括号表示一个可选的参数域。若没有给出可选项,意味着使用缺省值。
5.5.5.5.3.3.3.3.1.1.1.1.FFFFTTTTPPPP命令(FTPCOMMANDS) )
下面是FTP P命令:
:USER
>PASS
>ACCT
>CWD
>CDUP
>SMNT
>QUIT
>REIN
>PORT
>PASV
>TYPE
>STRU
>MODE
>RETR
>
STOR >
STOU >
APPE >
ALLO >
[R] >
REST >
RNFR >
RNTO >
ABOR >
DELE >
RMD D >
MKD D >
PWD D >
LIST[] >
NLST[] >
SITE >
SYST >
STAT T[] >
HELP[] >
NOOP >
5.5.5.5.3.3.3.3.2.2.2.2.FFFFTTTTPPPP命令参数(FTPCOMMANDARGUMENTS) )
上述参数域(使用BNF F记号法)的语法是:
::= = >
::= = >
::= = >
::= =| >
::= =anyofthe128ASCIIcharactersexceptand d
>
::= = >
::= =| >
::= =printablecharacters,any y
ASCIIcode33through126 6
::= = >
::= =, >
::= =,,, >
::= =, >
::= =anydecimalinteger1through255 5
::= =N|T|C C
::=A[] ]
|E[] ]
|I I
|L >
::= =F|R|P P::= =S|B|C C::= = >::= =anydecimalinteger r5.4. 命令和应答序列(SEQUENCINGOFCOMMANDSANDREPLIES)
User和server之间的通信是一个交互的对话。User发出一个FTP命令,server r立刻以一个应答进行响应。User r在发送下一个命令前,应当等待这个最初的成功或失败的响应。
某些命令需要第二个应答,对此user r也应当等待。这些应答可以报告文件传输的进度或完成,或者关闭数据连接。对于文件传输命令,它们是secondary yreplies。
一组重要的informationalreplies s是connectiongreetings。在正常情况下,当连接建立后,server r将发送一个220 0应答,“等待输入”。User r在发送任何命令前应当等待这个greetingmessage。若server r不能立即接受输入,应当马上发送120 0应答,就绪后再发送220 0应答。User r就可知道即使有延迟也不挂起。
自发应答(SpontaneousReplies) )
有时系统自发的给用户(通常是所有用户)发送一个消息。例如,"System mgoingdownin15minutes"。FTP P没有规定server r向user r发送这样的自发信息。建议将此类信息放入server-PI I的队列,并且在下一个reply(可能构成了一个多行应答)中传达给user-PI。
下面的表格列出了每个命令的可选的成功和失败的应答。必须严格遵守;server r可以替换应答中的文本,但不能改变应答编码的含义以及特定命令应答序列暗指的action。
命令应答序列(Command-ReplySequences) )
本节列出了命令应答序列。每个命令连同其可能的应答一起列出,同组的命令写在了一起。首先列出开始的应答(后续的应答缩进写在下面),然后是positive eandnegativecompletion n,最后是序列中其余命令的应答。这个列表是状态图的基础,状态图将单独给出。
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. 状态图(STATEDIAGRAMS) )
在此我们介绍一个简单FTP P实现的状态图。仅使用了应答编码的第一个数字。对每个FTP P命令组或命令序列都给出了状态图。
命令分组取决于每个命令的构造模型,用相同结构的模型把命令聚集在一起就形成了命令组。
对每个命令或命令序列,有三种可能的结果:success(S),failure(F),error(E)。在下面的状态图中,我们使用符号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. .
注意第二个模型也能用来描绘第一组命令,仅有的区别在于,第一组中100 0系列的应答是出乎意料的,因此被看作是错误,但第二组期望(有些命令可能需要)100 0系列的应答。记住,每个命令至多允许一个100 0系列的应答。
其余的图为命令序列建模,也许其中最简单的是rename e序列。
下图是Restart t命令的简单模型:
此处cmd d是APPE,STOR R或者RETR R。
我们注意到上面三个模型是相似的。Restart t和Rename e的区别仅在于第二阶段对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提示出现在圆括号中,‘----> >’表示命令从主机U到主机S,'<----'表示从S到U的应答。
LOCALCOMMANDSBYUSER RACTIONINVOLVED D
ftp(host)multics >
usernameDoe >
passwordmumble >
retrieve(localtype)ASCII >(localpathname)test1 >(for.pathname)test.pl1 >
ConnecttohostS,portL, ,
establishingcontrolconnections. .
<----220Serviceready. .
USERDoe----> >
<----331Usernameok, ,
needpassword. .PASSmumble----> ><----230Userloggedin. .
User-FTPopenslocalfileinASCII. .
RETRtest.pl1 >----> >
<----150Filestatusokay; ;
abouttoopendata a
connection. .
Servermakesdataconnection n
toportU. .
<----226Closingdataconnection, ,
filetransfersuccessful. .typeImage >TYPEI >----> >
<----200CommandOK >store(localtype)image >(localpathname)filedump >User-FTPopenslocalfileinImage. .(for.pathname)>udd>cn>fd >STOR>udd>cn>fd >----> >
<----550Accessdenied >
terminate eQUIT >---->
>Serverclosesall
lconnections.
.8. 连接建立(CONNECTIONESTABLISHMENT) )
FTPcontrolconnection n通过TCP P在user-process s端口U U和serverprocess s端口L L之间建立。此协议被分配了serviceport21(八进制25),也即L=21。