1. 介绍数组
FTP的目标是提升文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。虽然咱们也能够手工使用它,可是它的主要做用是供程序使用的。在阅读本文以前最好可以阅读TCP协议标准规范和Telnet协议标准规范。安全
2. 概览服务器
在本节中咱们将讨论一些表面上的问题,有些名词的定义请参阅TCP和Telnet 参考文献。咱们先介绍一下(1)字节大小,在FTP中字节大小有两个:逻辑字节大小和用于传输的字节大小。后者一般是8位,而前者可不必定是多少了。传输 字节没必要等于逻辑字节大小,也没必要对数据结构进行解释。(2)控制链接是创建在USER-PIT和SERVER-PI之间用于交换命令与应答的通讯链 路。(3)数据链接是传输数据的全双工链接。传输数据能够发生在服务器DTP和用户DTP之间也能够发生在两个服务器DTP之间。(4)DTP:数据传输 过程(DTP)创建和管理数据链接,DTP能够是主动的也能够是被动的。(5)EOR表明记录尾。(6)NTV表明网络虚拟终端,它的定义与在 Telnet协议中的定义一致。(7)NVFS表明网络虚拟文件系统。(8)FTP能够传输非连续的文件,这些文件的一部分称为页。(9)PI表明协议解 释器。(10)服务器DTP表明一种传输过程,它一般处于“主动”状态,它和侦听端口创建数据链接,它还能够为传输和存储设置参数,并根据PI的指令传输 数据。固然,DTP也能够转入“被动”状态。(11)服务器FTP进程,它是和用户FTP进程一块儿工做的,它由PI和DTP组成。至于用户FTP进程则是 由PI,DTP和用户接口组成的。下图是FTP服务示意图:网络
注意:数据链接是双向的,它不用整个时间都存在。上图中用户PI开始控制链接,控 制链接与Telnet协议很象。在开始阶段,标准FTP命令由用户PI产生并经过控制链接传送到服务器进程。服务器PI向用户PI返回标准应答。FTP命 令指定数据链接参数和文件系统操做。用户DTP在特定数据端口侦听,服务器开始数据链接并以指定的参数开始数据传输。数据端口没必要在开始FTP命令的机器 上,但用户或用户FTP进程必须肯定它在指定的数据端口上侦听。这个数据链接是全双工的。数据结构
在另一种状况下,用户或许但愿在两个主机间传送文件,不是两个本地主机。用户在两台主机间创建控制链接,而后规划数据链接。用这种方式,控制信息由用户PI得到,可是数据在服务器DTP之间传送。下面就是一个例子:tcp
协议要求数据传输在处理时打开控制链接。在完成FTP服务后由用户停止控制链接, 而服务器具体操做。若是在未接收命令时关闭了控制链接,服务器也会关闭数据传输。FTP和Telnet颇有联系,FTP使用Telnet协议进行控制连 接,可有两种方法达到目的:用户PI或服务器PI能够在本身的过程当中实现Telnet协议的功能;第二种方法是利用系统中现有的Telnet模块。实现 上,FTP对Telnet协议的依赖也很少,即便从新实现,代码量也不大。函数
3. 数据传输功能编码
数据链接只传输数据,控制链接传送命令和响应。几个命令是关于在主机间传输数据的,数据传输基本上独立于物理结构的,可是若是在压缩传输模式下流式传输与文件结构有关,文件的属性与表示类型有关。spa
3.1. 数据表示与保存操作系统
数据是在主机间的存储设置间传送的。由于两个系统的数据存储方式不一样,所以须要对 它进行转换,在传送文本时会有对ASCII表示的问题,在进行二进制传送的时候,会有不一样系统对字节长度规定不一样的问题,有的系统是7位,有的系统多是 32位,这也须要进行转换。须要提供数据表示与传输模型函数,可是FTP提供这方面的功能很少,超过FTP提供功能的那一部分要用户本身实现。
3.1.1. 数据类型
数据表示是由用户指定的表示类型,它能够是隐含的,也能够是用户指定的。请必定注意:逻辑字节长度与物理字节长度是不一样的。
3.1.1.1. ASCII类型
这是全部FTP必须实现的默认类型,用于传送文本文件,当在主机间使用 EBCDIC传送时更方便,则不使用ASCII类型。发送方将内部表示转换为NVT-ASCII格式,接收方则进行相反的过程接收数据。根据NVT标准, 要在行结束处使用<CRLF>序列。NVT-ASCII是8位的。ASCII和EBCDIC的格式参数在下面讨论。
3.1.1.2. EBCDIC类型
它是做为ASCII的另外一种方法在主机间传送数据的数据类型。EBCDIC和ASCII很象,仅在类型的功能描述上有一些差异。行结束符使用不多。
3.1.1.3. 图象类型
在此类型下传送的数据被看做连续的位,发送方将数据打包到8位传输字节中传送。由于结构的须要要对传送数据进行填充,填充字节所有为0,填充必须在文件结构时使用,并且要标记出以便接收方过滤掉。它用于传送二进制数据和有效地传送和存储文件,所以全部FTP也必须实现。
3.1.1.4. 本地类型
也能够以十进制指定逻辑字节大小。若是物理字节大小和逻辑字节大小不一样,直接将物理数据打包为逻辑字节,不用什么填充。接收方根据逻辑字节大小进行和本机的存储特色进行转换。传输必须是可重复的,也就是说,相同的文件相同的参数,那内容必须是同样的。
3.1.1.5. 格式控制
ASCII和EBCDIC有一个可选参数,它说明文件垂直格式控制,下面的数据表 示类型在FTP中有定义。字符文件可能有三种用途,打印,存储或留待之后处理。若是是用于打印,那主机必须知道垂直格式控制的表示,若是存储或等之后处 理,也须要保留文件格式。若是在远程主机上处理完后传输回本地主机,要保证远程主机处理时没有麻烦。这都须要在ASCII和EBCDIC格式上加入新的参 数。
3.1.1.5.1. NON PRINT
未指定第二个参数是它是默认值。它必须为全部FTP接受。若是传输的文件是用于打印的,则使用边界和间隔的默认值。一般它不用于打印目的,而用于保存文件或执行文件。
3.1.1.5.2. TELNET格式控制
文件包括ASCII/EBCDIC垂直格式控制,这些控制字符可使打印正常进行。
3.1.1.5.3. CARRIAGE CONTROL (ASA)
文件包含ASA (FORTRAN)垂直格式控制字符。在以ASA标准造成的行中,第一个字符不打印,它用于决定打印前的走纸量。下面是定义了的ASA字符:
blank: 向下移动1行;0:向下移动2行;1:移动至下一页;+:不移动
打印机必须可以决定结构体的结束。若是文件自己有记录结构就没有问题,若是没有,<CRLF>用于区别打印行,但这些格式标记已经由ASA控制字符使用了。
3.1.2. 数据结构
除了有不一样的数据类型外,FTP还容许有不一样的文件结构,下面是三种文件结构:文件式结构:文件中没有内部结构,文件被看做是二进制流;记录结构:文件是由一系列记录组成的;页结构:文件是由不一样的索引页组成的。
若是未使用STRU命令,文件结构是默认值。文件的结构会影响传输模型,存储和数 据表示。文件原本的属性和保存它的主机有关,不一样的机器会以本身的方式保存文件。在不一样主机间传送文件时必须使主机可以识别相互的表示。有些主机上的文件 是面向字节的,有些是面向记录的,在传送时就会出现问题。那就要在接收方进行内部转换。在进行转换的时候,须要区别记录的边界,在ASCII中使 用<CRLF>,在EBCDIC中使用<NL>做为分隔符。采用这种实现方法的必须保证转换是可逆的。
3.1.2.1. 文件结构
若是未使用STRU命令,文件结构是默认值。文件结构中没有默认值,文件被看做是连续的字节串。
3.1.2.2. 记录结构
对于文本文件,记录结构必须是全部FTP实现必须有的。记录结构文件是由连续的记录构成的。
3.1.2.3. 页结构
文件是非连续时使用页结构。这种文件称为随机访问文件。这些文件中有时会的和文件总体或部分相关的信息出现。在FTP中,文件的一个部分称为页。为了提供不一样的页大小和相关信息,每页都带页头发送。页头中有以下域:
头长度 |
包括此字节的页头长度,单位为字节,最小长度为4 |
页索引 |
指出此部分在原文件中的位置,它和传输编号不是一回事 |
数据长度 |
页数据中的逻辑字节数,最小值为0 |
页类型 |
页的类型有如下几种:0=未页,指示传输结构,包头必须为4,数据长度必须为0;1=一般页,没有控制信息的一般页文件的普通类型;2=描述子页,用于传送总体文件的描述信息;3=访问控制页,包括页级访问控制信息的页文件头域,包头长度必须为5 |
可选域 |
提供每页的控制信息 |
描述子 8位 |
字节计数 16位 |
描述子代码由在描述子字节中的位标记说明,下面是已经指定的四种代码及其意义:
代码 |
意义 |
128 |
数据块结束是EOR |
64 |
数据块结束是EOF |
32 |
数据块内有怀疑错误 |
16 |
数据块是从新开始标记 |
以这种编码,对于特定块可能存在多个描述子编码条件,所须要的位必须所有设置。从新开始标记包括在数据流中,它做为8位整数表明在控制链接上使用语言的可打印字节,但<SP>不得出如今其中。例如要传送6字节标记,下面就是例子:
Descrptr code = 16 |
Byte count = 6 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
Marker 8位 |
3.4.3. 压缩模式
有三种信息须要传送:常规数据以字节串传送;压缩数据,包括复本和过滤器;控制信息,以两个转义字符传送。若是有N(>0但小于127)个常规数据传送,在数据前一位加上一个字节,这个字节最高位为0,其它位表示的数值等于N。以下图:
若要压缩一个数据位D的N复本字符串,用两个字节传送,以下图,它表示的是压缩的字节:
一串N过虑器字节能够压缩为一个字节,而过滤器字节根据表示法不一样而不一样。若是类型是ASCII或EBCDIC,过滤器字节是<SP>,若是是图象或本地类型,则是0。下面就是过滤器字节:
转义序列是双字节,头一个全0,后一个内是定义于块模式下的描述子代码。描述子代码与块模式中的意义相同,它做用于其后串中的字节。而压缩模式对于增长带宽有好处(由于数据是压缩过的)。
3.5. 差错恢复和从新开始
位丢失和数据错误是这一层的差错控制由TCP负责。而从新开始则是给用户一个处理 系统(包括操做系统,网络等)失败的方法。从新开始过程仅适用于块和压缩模式,它要求发送者在数据流中加入特定标记,标记仅对传送者有意义,但其中的内容 是控制链接使用的语言。标记能够表明一个位记数,记录记数或能够标记数据数目的任何点。若是接收方也支持从新开始,将会在接收系统中保存这一标记。在系统 失败从新启动后,用户能够根据原来的标记从新开始数据传送,也就是咱们一般熟悉的断点续传过程。接收方接收到一段数据,而后记下一点,若是发送方失败了, 就从这一点之后再传送相应的数据。具体的这里很少说了。
4. 文件传输功能
从用户PI到服务器的信道是创建在用户到标记服务器端口间的。用户协议解释器负责 发送命令和解释接收的应答;服务器PI解释命令,发送应答,指导DTP创建数据链接并传送数据。若是数据传输的第二方是用户DTP,经过用户FTP主机的 内部协议对它进行控制;若是第二方是服务器DTP,它由用户PI发来的命令通过本身的PI控制。
4.1. FTP命令
4.1.1. 访问控制命令
下列命令指定访问控制标记(命令码在括号内):
用户名(USER)
参数是标记用户的Telnet串。用户标记是访问服务器必须的,此命令一般是控制 链接后第一个发出的命令,有些主机还会要求口令和账户。服务器能够在任什么时候间接收新的USER命令以改变访问控制和(或)账户信息。这能够从新开始登陆过 程,因此传输参数不变,在进行中的文件传输在过去的访问控制参数下完成。
口令(PASS)
参数是标记用户口令的Telnet串。此命令紧跟USER命令,在某些站点它是完成访问控制不可缺乏的一步。所以口令是个重要的东西,所以不能显示出来,服务器方没有办法隐藏口令,因此这一任务得由用户FTP进程完成。
ACCOUNT (ACCT)
参数是标记用户账户的Telnet串。此命令不须要与USER相关,一些站点可能 须要账户用于登陆,另外一些能够限制账户的权限,在后一种状况下,此命令可在任什么时候候发送。应答的不一样能够区别不一样的状况:当登陆须要账户信息时,对 PASS命令的响应是332。另外,若是不须要账户信息,对PASS的响应是230,若是须要账户信息在之后须要,服务器会返回332或532,这要看它 是保存此命令仍是拒绝此命令了。
改变工做目录(CWD)
此命令使用户能够在不一样的目录或数据集下工做而不用改变它的登陆或账户信息。传输参数也不变。参数通常是目录名或与系统相关的文件集合。
回到上一层目录(CDUP)
此命令要求系统实现目录树结构,它的响应和CWD的相同。
结构加载(SMNT)
此命令使用户在不改变登陆或账户信息的状况下加载另外一个文件系统数据结构。传输参数也不变。参数是文件目录或与系统相关的文件集合。
从新初始化(REIN)
此命令终止USER,将全部I/O和账户信息写入,但不准进行中的数据传输完成。重置全部参数,控制链接打开,能够再次开始USER命令。
退出登陆(QUIT)
此命令终止USER,若是没有数据传输,服务器关闭控制链接;若是有数据传输,在 获得传输响应后服务器关闭控制链接。若是用户进程正在向不一样的USER传输数据,不但愿对每一个USER关闭而后再打开,可使用REIN。对控制链接的意 外关闭,能够致使服务器运行停止(ABOR)和退出登陆(QUIT)。
4.1.2. 传输参数命令
全部数据传输参数有默认值。服务器必须记录下默认值,在FTP服务请求后,能够以任何顺序发送。下面命令传送参数:
数据端口(PORT)
参数是要使用的数据链接端口,一般状况下对此不须要命令响应。若是使用此命令时,要发送32位的IP地址和16位的TCP端口号。上面的信息以8位为一组,逗号间隔十进制传输,以下例:
PORT h1,h2,h3,h4,p1,p2
其中h1是IP地址的最高8位。
被动(PASV)
此命令要求服务器DTP在指定的数据端口侦听,进入被动接收请求的状态,参数是主机和端口地址。
表示类型(TYPE)
参数指定表示类型。有些类型须要第二个参数,第一个参数由单个Telnet字符定义,第二个参数是十进制整数指定字节大小,参数间以<SP>分隔。下面是格式:
默认表示类型是ASCII非打印字符,若是参数未改变,之后只改变了第一个参数,则使用默认值。
文件结构(STRU)
参数是一个Telnet字符代码指定文件结构。下面是代码及其意义:
F - 文件(非记录结构),它是默认值
R - 记录结构
P - 页结构
传输模式(MODE)
参数是一个Telnet字符代码指定传输模式。下面是代码及其意义:
S - 流(默认值)
B - 块
C - 压缩
4.1.3. FTP服务命令
FTP服务命令定义用户请求的文件传输或文件系统功能。此命令的参数一般是路径 名,其语法要和服务器的规范一致。推荐的默认值是最近指定的设备目录或目录。命令顺序一般没有限制,只有"rename from"命令后面必须是"rename to",从新启动命令后面必须是中断服务命令。服务命令的响应一般在数据链接上传输。下面是具体的命令:
得到文件(RETR)
此命令使服务器DTP传送指定路径内的文件复本到服务器或用户DTP。这边服务器上文件的状态和内容不受影响。
保存(STOR)
此命令使服务器DTP接收数据链接上传送过来的数据,并将数据保存在服务器的文件中。若是文件已存在,原文件将被覆盖。若是文件不存在,则新建文件。
惟一保存(STOU)
此命令和STOR差很少,此命令要求在此目录下的文件名是惟一的,对此命令的响应必须包括产生的用户名。
附加(APPE)
它和STOR的功能差很少,可是若是文件在指定路径内已存在,则把数据附加到原文件尾部,若是不存在则新建文件。
分配(ALLO)
此命令用于在一些主机上为新传送的文件分配足够的存储空间。参数是十进制的逻辑字 节数。若是是记录或页结构,页或记录的最大大小也须要,这在第二个参数内以十进制指定。第二个参数是可选的,若是有它,它和第一个参数以Telnet字 符<SP> R <SP>分隔。此命令在STOR或APPE命令后,对于不须要分配存储空间的机器,它的做用等于NOOP。
从新开始(REST)
参数域表明服务器要从新开始的那一点,此命令并不传送文件,而是略过指定点后的数据,此命令后应该跟其它要求文件传输的FTP命令。
重命名(RNFR)
这个命令和咱们在其它操做系统中使用的同样,只不事后面要跟"rename to"指定新的文件名。
重命名为(RNTO)
此命令和上面的命令共同完成对文件的重命名。
放弃(ABOR)
此命令通知服务停止之前的FTP命令和与之相关的数据传送。若是先前的操做已经完成,则没有动做,返回226。若是没有完成,返回426,而后再返回226。关闭控制链接,数据链接不关闭。
删除(DELE)
此命令删除指定路径下的文件。用户进程负责对删除的提示。
删除目录(RMD)
此命令删除目录。
建立目录(MKD)
此命令在指定路径下建立新目录。
打印工做目录(PWD)
在响应是返回当前工做目录。
列表(LIST)
服务器传送列表到被动DTP,若是路径指定一个目录或许多文件,返回指定路径下的 文件列表。若是路径名指定一个文件,服务器返回文件的当前信息,参数为空表示用户当前的工做目录或默认目录。数据传输在ASCII或EBCDIC下进行, 用户必须确认这一点。由于文件信息因系统不一样而不一样,因此不可能被程序自动利用,可是人类用户却很须要。
名字列表(NLST)
服务器传送目录表名到用户,路径名应指定目录或其它系统指定的文件群描述子;空参数指当前目录。服务器返回文件名数据流,以ASCII或EBCDIC形式传送,并以<CRLF>或<NL>分隔。这里返回的信息有时能够供程序进行进一步处理。
站点参数(SITE)
服务器用来提供服务器系统信息,信息因系统不一样而不一样,格式在HELP SITE命令应答中给出。
系统(SYST)
用于肯定服务器上运行的操做系统。
状态(STAT)
此命令返回控制链接状态,它能够在文件传送过程当中发送,服务器返回操做进行的状 态。也能够在文件传送之间发送,这时命令有参数,参数是路径名,此命令的功能除了数据在控制链接上传送之外和列表命令类似。若是指定部分路径,服务器以文 件名或与说明相关的属性返回;如没有参数,服务器返回服务器FTP进程的状态信息,包括传输参数的当前值和链接状态。
帮助(HELP)
这条命令咱们在日常系统中获得的帮助没有什么区别,响应类型是211或214。建议在使用USER命令前使用此命令。
等待(NOOP)
此命令不产生什么实际动做,它仅使服务器返回OK。
FTP在控制链接上使用Telnet通讯,所以有机会你们能够看看相关的协议说 明。对下文的理解会颇有好处。下面内容将对命令的应答和关于命令的详细信息做以说明。FTP命令可分为访问控制标记,数据传输参数或FTP服务请求,特定 的命令(如ABOR,STAT)能够在数据传输过程当中在控制链接上传输。有些服务器不能同时监视数据和控制链路,那就要另外采起措施了。请注意下面的几点 建议:
1. 用户系统将Telnet的"Interrupt Process"(IP)信息插入Telnet流;
2. 用户系统发送Telnet的"Synch"信号;
3. 用户系统将命令(如ABOR)插入Telnet流;
4. 服务器PI在接收到IP后,在Telnet流中寻找仅有一个的FTP命令。
4.2. FTP应答
FTP命令的响应是为了对数据传输请求和过程进行同步,也是为了让用户了解服务器 的状态。每一个命令必须有最少一个响应,若是是多个,它们要易于区别。有些命令是有顺序性的,所以其中任何一个命令的失败会致使从头开始。FTP响应由三个 数字构成,后面是一些文本。数字带有足够的信息命名用户PI不用检查文本就知道发生了什么。文本信息与服务器相关,用户可能获得不一样的文本信息。文本和数 字以<SP>间隔,文本后以Telnet行结束符结束。文本可能多于一行,这时文本必须在括号内,第一行内要有信息表示文本多于一行,最后一 行也要有所标记。若是是多行,能够在数字代码后加上"-",最后一行以数字开始,后面是<SP>,再加上Telnet的行结束符就能够了。下 面是一个例子:
123-第一行
第二行
234 以数字开始的一行
123 最后一行
三位数字每位都有必定的意义,第一位肯定响应是好的,坏的仍是不彻底的,经过检查第一位,用户进程一般就可以知道大体要采起什么行动了。若是用户程序但愿了解出了什么问题,能够检查第二位,第三位留表示其它信息。第一位有五个值:
1yz 肯定预备应答
请求的操做正在被初始化;在进入下一个命令前等待另外的应答。这类响应用于说明命令被接受,在实现中如何同步监视有困难,用户进程如今能够关注数据链接了。服务器FTP进程对第个命令几乎都返回1yz响应。
2yz 肯定完成应答
要求的操做已经完成,能够执行新命令。
3yz 肯定中间应答
命令已接受,但要求的操做被中止,中止接收更新的信息。
4yz 暂时拒绝完成应答
未接受命令,要求的操做未执行,但错误是临时的,过一下子能够再次发送消息。用户应该返回命令序列的开始。这个暂时但是很差肯定,此命令的意思就是让用户进程再次尝试使用此命令。
5yz 永远拒绝完成应答
它与暂时拒绝完成应答的区别就在于错误条件是一时半会不会消失。
下面咱们来看看第二位所表明的意义:
x0z 格式错误;
x1z 此类应答是为了请求信息的;
x2z 此类应答是关于控制和数据链接的;
x3z 关于认证和账户登陆过程;
x4z 未使用;
x5z 此类应答是关于文件系统的;
第三个数字是在第二个数字的基础上对应答内容的进一步细化。通常来讲,数字代码后要有文本信息。实现时应该尽可能使用现有的代码,而不要随便添加新的意义不大的代码。
有些命令如TYPE或ALLO,它们的成功不为用户进程提供任务新信息,因此不会 有200应答返回。若是有些命令对于服务器来讲不支持,也要返回肯定完成应答,这样用户进程才有可能进行下面的命令。若是要求的不是可选实现的命令,而这 个命令确实没有实现,那就要返回代码502。下面咱们根据数字顺序列出各个应答码及其意义:
110 |
从新启动标记应答。在这种状况下文本是肯定的,它必须是:MARK yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。 |
|
120 |
服务在nnn分钟内准备好 |
|
125 |
数据链接已打开,准备传送 |
|
150 |
文件状态良好,打开数据链接 |
|
200 |
命令成功 |
|
202 |
命令未实现 |
|
211 |
系统状态或系统帮助响应 |
|
212 |
目录状态 |
|
213 |
文件状态 |
|
214 |
帮助信息,信息仅对人类用户有用 |
|
215 |
名字系统类型 |
|
220 |
对新用户服务准备好 |
|
221 |
服务关闭控制链接,能够退出登陆 |
|
225 |
数据链接打开,无传输正在进行 |
|
226 |
关闭数据链接,请求的文件操做成功 |
|
227 |
进入被动模式 |
|
230 |
用户登陆 |
|
250 |
请求的文件操做完成 |
|
257 |
建立 "PATHNAME" |
|
331 |
用户名正确,须要口令 |
|
332 |
登陆时须要账户信息 |
|
350 |
请求的文件操做须要进一步命令 |
|
421 |
不能提供服务,关闭控制链接 |
|
425 |
不能打开数据链接 |
|
426 |
关闭链接,停止传输 |
|
450 |
请求的文件操做未执行 |
|
451 |
停止请求的操做:有本地错误 |
|
452 |
未执行请求的操做:系统存储空间不足 |
|
500 |
格式错误,命令不可识别 |
|
501 |
参数语法错误 |
|
502 |
命令未实现 |
|
503 |
命令顺序错误 |
|
504 |
此参数下的命令功能未实现 |
|
530 |
未登陆 |
|
532 |
存储文件须要账户信息 |
|
550 |
未执行请求的操做 |
|
551 |
请求操做停止:页类型未知 |
|
552 |
请求的文件操做停止,存储分配溢出 |
|
553 |
未执行请求的操做:文件名不合法 |
5. 说明
5.1. 最小实现
下面是FTP服务器的最小实现:
类型 - ASCII Non-print
模式 - Stream
结构 - File, Record
命令 - USER, QUIT, PORT,TYPE, MODE, STRU,RETR, STOR,NOOP.
传输的默认参数为:
类型 - ASCII Non-print
模式 - Stream
结构 - File
全部主机都将上面的值做为默认值。
5.2. 链接
服务器协议解释器会在端口L侦听,用户或用户协议解释器初始化全双工控制链接,服 务器和用户进程应该遵照Telnet协议的说明进行。服务器不提供对命令行的编辑功能,应该由用户负责这一切。在所有传送和应答结束后,在用户的请求下服 务器关闭控制链接。用户DTP必须在指定的数据端口上侦听,它能够是默认端口U或由PORT命令指定的端口。服务器的默认数据端口为L-1。传输方向和端 口都可由FTP命令决定。只有用户PI能够改变默认端口。当数据在服务器A和B之间传送时,用户PI,C,在两个服务器PI之间创建控制链接。其中一个服 务器A,在接收到传输服务命令时接收PASV命令初始化链接,用户PI接收到PASV命令的确认时(确认内包括主机标识和端口),将端口以PORT命令发 送到B。在接收到确认后,用户PI能够发送相应的命令给A和B了,B初始链接和传输进程,命令应答序列以下面所示,请根据位置注意时差:
在任什么时候间,服务器和用户只要有一方关闭链接,另外一方就要赶快读取缓冲中的数据,而后也关闭本方的链接。
5.3. 命令
本节主要讨论命令格式。命令对大小写不敏感。命令一般由命令码和相应的参数组成。 中间由一个或几个空格分开。参数域由<CRLF>结束,服务器在未接收到行结束符时不会采起任何动做。下面描述的格式是以NVT-ASCII 以准的,方括号表明可选的参数域,若是未选择可选的参数域则采用默认值。
5.3.1. FTP命令
下面是FTP命令,其中username表明用户名,password表明口 令,pathname表明路径名,host-port表明主机端口,account-information表明账户信息,typecode表明类型代 码,decimal-integer表明十进制整数,marker表明标记,string表明字符串:
USER <SP> <username> <CRLF>
PASS <SP> <password> <CRLF>
ACCT <SP> <account-information> <CRLF>
CWD <SP> <pathname> <CRLF>
CDUP <CRLF>
SMNT <SP> <pathname> <CRLF>
QUIT <CRLF>
REIN <CRLF>
PORT <SP> <host-port> <CRLF>
PASV <CRLF>
TYPE <SP> <type-code> <CRLF>
STRU <SP> <structure-code> <CRLF>
MODE <SP> <mode-code> <CRLF>
RETR <SP> <pathname> <CRLF>
STOR <SP> <pathname> <CRLF>
STOU <CRLF>
APPE <SP> <pathname> <CRLF>
ALLO <SP> <decimal-integer>
[<SP> R <SP> <decimal-integer>] <CRLF>
REST <SP> <marker> <CRLF>
RNFR <SP> <pathname> <CRLF>
RNTO <SP> <pathname> <CRLF>
ABOR <CRLF>
DELE <SP> <pathname> <CRLF>
RMD <SP> <pathname> <CRLF>
MKD <SP> <pathname> <CRLF>
PWD <CRLF>
LIST [<SP> <pathname>] <CRLF>
NLST [<SP> <pathname>] <CRLF>
SITE <SP> <string> <CRLF>
SYST <CRLF>
STAT [<SP> <pathname>] <CRLF>
HELP [<SP> <string>] <CRLF>
NOOP <CRLF>
5.3.2. FTP命令参数
下面是用BNF范式表示的参数格式:
<username> ::= <string>
<password> ::= <string>
<account-information> ::= <string>
<string> ::= <char> | <char><string>
<char> ::= 除<CR>和<LF>外的全部ASCII字符
<marker> ::= <pr-string>
<pr-string> ::= <pr-char> | <pr-char><pr-string>
<pr-char> ::= 可打印ASCII字符,从33到126
<byte-size> ::= <number>
<host-port> ::= <host-number>,<port-number>
<host-number> ::= <number>,<number>,<number>,<number>
<port-number> ::= <number>,<number>
<number> ::= 从1到255的十进制整数
<form-code> ::= N | T | C
<type-code> ::= A [<sp> <form-code>]| E [<sp> <form-code>]| I| L <sp> <byte-size>
<structure-code> ::= F | R | P
<mode-code> ::= S | B | C
<pathname> ::= <string>
<decimal-integer> ::= 任何十进制整数
5.4. 命令和响应序列
服务器和用户之间的通讯是对话的过程,用户发送FTP命令,而后等待服务器的一个(或多个)响应,根据响应再发送新命令。
链接时的响应带有许多信息,一般状况下,服务器会返回220应答,等待输入,用户 在接收到此响应后才发送新命令,若是服务器不能当即接收输入,会在220后面返回120。有些信息如服务器将在15分钟后中止工做是要服务器发向用户的, 可是服务器却不能直接发向用户,处理的方法是将消息缓冲,在下一个响应中返回给用户。下面列出命令的应答,第一个是预备应答,第二个是肯定完成,第三个是 拒绝完成,最后是中间应答。这些应答是构成状态图的基础,状态图会在下节中给出:
创建链接 120
220
220
421
登陆
USER
230
530
500, 501, 421
331, 332
PASS
230
202
530
500, 501, 503, 421
332
ACCT
230
202
530
500, 501, 503, 421
CWD
250
500, 501, 502, 421, 530, 550
CDUP
200
500, 501, 502, 421, 530, 550
SMNT
202, 250
500, 501, 502, 421, 530, 550
退出登陆
REIN
120
220
220
421
500, 502
QUIT
221
500
传输参数
PORT
200
500, 501, 421, 530
PASV
227
500, 501, 502, 421, 530
MODE
200
500, 501, 504, 421, 530
TYPE
200
500, 501, 504, 421, 530
STRU
200
500, 501, 504, 421, 530
文件操做命令
ALLO
200
202
500, 501, 504, 421, 530
REST
500, 501, 502, 421, 530
350
STOR
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 452, 553
500, 501, 421, 530
STOU
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 452, 553
500, 501, 421, 530
RETR
125, 150
(110)
226, 250
425, 426, 451
450, 550
500, 501, 421, 530
LIST
125, 150
226, 250
425, 426, 451
450
500, 501, 502, 421, 530
NLST
125, 150
226, 250
425, 426, 451
450
500, 501, 502, 421, 530
APPE
125, 150
(110)
226, 250
425, 426, 451, 551, 552
532, 450, 550, 452, 553
500, 501, 502, 421, 530
RNFR
450, 550
500, 501, 502, 421, 530
350
RNTO
250
532, 553
500, 501, 502, 503, 421, 530
DELE
250
450, 550
500, 501, 502, 421, 530
RMD
250
500, 501, 502, 421, 530, 550
MKD
257
500, 501, 502, 421, 530, 550
PWD
257
500, 501, 502, 421, 550
ABOR
225, 226
500, 501, 502, 421
得到信息命令
SYST
215
500, 501, 502, 421
STAT
211, 212, 213
450
500, 501, 502, 421, 530
HELP
211, 214
500, 501, 502, 421
其它命令
SITE
200
202
500, 501, 530
NOOP
200
500 421
6. 状态图
下面是一个简单实现的FTP的状态图,只用到响应码的首位。对于全部命令或命令序列有三种可能性:成功(S),失败(F)或错误(E)。在状态图中B表明开始,W表明等待响应。下面咱们给出一个总图,总图能够包括的命令有:
ABOR,ALLO,DELE,CWD,CDUP,SMNT,HELP,MODE,NOOP,PASV,QUIT,SITE,PORT,SYST,STAT,RMD,MKD,PWD,STRU和TYPE
而下图能够包括的命令有:APPE,LIST,NLST,REIN,RETR,STOR和STOU。
第一幅图和第二幅图差异不大,第一幅图中若是出现了100系列响应会是错误,而在第二幅图中不会。下面是重命名过程:
下面是从新启动命令,其中cmd表明APPE,STOR或RETR。
下图表明登陆过程:
7. 典型FTP过程
假设位于U的用户但愿从S上(下)传文件,一般用户须要使用用户FTP进程和服务器通讯,下面就是一个例子:
用户发出的本地命令 |
解释 |
ftp (host) multics<CR> |
链接到 S 的端口 L ,创建控制链接 <---- 220 Service ready <CRLF>. |
用户名 Doe <CR> need password<CRLF>. |
USER Doe<CRLF>----> <---- 331 用户名正确 |
口令 <CR> |
PASS 口令 <CRLF>----> <---- 230 User logged in<CRLF>. |
retrieve (local type) ASCII<CR> (local pathname) test 1 <CR> (for. pathname) test.pl1<CR> |
User-FTP opens local file in ASCII. RETR test.pl1<CRLF> ----> <---- 150 文件状态正常,将打开数据链接 <CRLF> 服务器于端口 U 创建数据链接 |
文件传输中 |
|
|
<---- 226 关闭数据链接,文件传输正确 <CRLF> |
type Image<CR> |
TYPE I<CRLF> ----> <---- 200 Command OK<CRLF> |
store (local type) image<CR> (local pathname) file dump<CR> (for.pathname) >udd>cn>fd<CR> |
User-FTP opens local file in Image. STOR >udd>cn>fd<CRLF> ----> <---- 550 访问拒绝 <CRLF> |
停止 |
QUIT <CRLF> ----> |
服务器关闭全部链接 |
FTP控制链接经过用户进程端口U和服务器端口L创建,这里默认的L=21。
全部域均以1个逻辑字节长度为大小,逻辑字节长度由TYPE命令指定。若是读取版本与和开始版本号一致,文件访问时必须以相同的参数进行。若是参数相同,FTP实现要保证取得的文件内容是相同的。
3.2. 创建数据链接
传送数据机制包括创建链接选择数据参数。用户和服务器DTP有默认数据端口。用户 进程默认数据端口和控制链接端口相同。服务器进程默认数据端口和控制链接端口相邻。传输字节大小是8位字节。此字节是实际传输字节,但不表明主机内的数据 表示。被动数据传输进程在数据端口接收数据,FTP请求命令决定数据传输的方向。服务器在接收到请求之后,将初始化端口的数据链接。当链接创建后,传输在 DTP之间传送,服务器PI对用户PI返回应答。FTP实现运行一个默认数据端口,用户PI才能改变默认端口。
经过PORT命令可能改变端口,用户可能但愿数据在第三方主机上进行其它操做,用 户PI须要在两个服务器PI上创建链接。一个服务器被告知侦听另外一服务器的请求。用户PI经过PORT命令通知另外一服务器的数据端口。最后双方发送相应的 传送命令。一般,服务器负责支持数据链接,初始化并关闭它,除非用户DTP在传输模式下要求关闭链接。服务器在下面状况下关闭数据链接:
1. 服务器结束发送数据,经过EOF要求停止传送;
2. 用户发送ABORT命令;
3. 用户改变端口;
4. 控制链接关闭;
5. 发生不可恢复错误。
3.3. 数据链接管理
默认数据链接端口:全部FTP必须支持默认数据链接,只有用户PI可以初始化非默认端口的使用。
肯定非默认数据端口:用户PI可使用PORT命令指定非默认端口,它要求服务器方以PASV肯定非默认数据端口。链接是由双方地址肯定的,所以改变一方地址就改变了链接。
数据链接的重用:在使用流式数据传输模型时,文件结束经过关闭链接指示。若是要传 送多个文件时就会出麻烦,解决的方法有两个,一个是肯定非默认端口,另外一个是使用另外一种传输模式。就传输模式而言,流传输模式是不安全的,所以没法肯定连 接是暂时仍是永久关闭。其它传输模式不经过关闭链接表示文件结构,它们能够经过FTP命令决定传送结构。所以使用这些传输模式能够在保持链接的状况下传送 多个文件。
3.4. 传输模式
有三种传输模式:一种将数据格式化并考虑从新开始过程;一种压缩数据;一种是不经 过处理(少许处理)传送。全部数据传输必须以一个EOF结束,它能够显式给出,也能够经过关闭链接隐式给出。对于记录文件,全部EOR是显式的,包括最后 一个记录。对于以页结构传送的文件,使用“最后一页”表示结束。从这里开始,下文中咱们提到的字节指的是“传输字节”。
为了进行标准化传送,传送主机必须把行结束或记录结束的内部表示转化为传输模式和 文件结构指定的形式传送,接收方则进行相反的工做。IBM大型机的记录计数域可能不能为其它主机识别,因此记录结束标记在流模式下以双字节控制码传送,在 块或压缩模式下以标记位传送。而ASCII或EBCDIC的行结束则则<CRLF>或<NL>指示。这样的转换须要时间,因此相 同的系统在传送文本文件时采用二进制或流表示比较合适。下面是FTP定义的传输模式:
3.4.1. 流模式
数据以字节流的形式传送。使用的表示类型没有限制,容许记录结构。在记录结构文件 EOR和EOF表示为双字节控制码。第一字节全为0,后一字节为转义字符。当第二位值为1时表示EOR,为2时表示EOF,若是要同时表示EOR和 EOF,值为3。全1字节做为数据发送时必须使用双字节传送,其中数据保存在第二个字节内。若是是文件结构,经过发送方关闭链接表示EOF,接收到的全部 数据就是文件内容。
3.4.2. 块模式
文件以块形式传送,块带有本身的头部分。头字节包括计数域和描述子代码。计数域说 明了数据块的字节数,描述子代码定义了如下内容:EOF,EOR从新开始标记或怀疑错误数据。怀疑错误数据不是为了进行差错控制,它是为了站点间交换特定 数据,传送时无论本地错误(如硬盘错误)而只管传送,可是传送时可要指出,这个数据可能有错。在此模式下可使用记录结构,也可使用相应的数据表示。头 字节的结构以下图所示: