FTP整理

 

FTP协议

一、概述

F T P采用两个T C P连接来传输一个文件:

1)        控制连接以通常的客户服务器方式建立。服务器以被动方式打开众所周知的用于FTP的端口(21),等待客户的连接。客户则以主动方式打开TCP端口21,来建立连接。控制连接始终等待客户与服务器之间的通信。该连接将命令从客户传给服务器,并传回服务器的应答。由于命令通常是由用户键入的,所以IP对控制连接的服务类型就是“最大限度地减小迟延”。

2)        每当一个文件在客户与服务器之间传输时,就创建一个数据连接。(其他时间也可以创建,后面我们将说到)。由于该连接用于传输目的,所以IP对数据连接的服务特点就是“最大限度提高吞吐量”。

二、数据表示

FTP协议规范提供了控制文件传送与存储的多种选择。在以下四个方面中每一个方面都必

须作出一个选择。

1.文件类型

(a)ASCII码文件类型(默认选择)文本文件以NVT ASCII码形式在数据连接中传输。这要求发方将本地文本文件转换成NVT ASCII码形式,而收方则将NVT ASCII码再还原成本地文本文件。其中,用NVT ASCII码传输的每行都带有一个回车,而后是一个换行。这意味着收方必须扫描每个字节,查找CR、LF对。

(b)EBCDIC文件类型该文本文件传输方式要求两端都是EBCDIC系统。

(c)图像文件类型(也称为二进制文件类型)数据发送呈现为一个连续的比特流。通常用于传输二进制文件。

(d)本地文件类型该方式在具有不同字节大小的主机间传输二进制文件。每一字节的比特数由发方规定。对使用8 bit字节的系统来说,本地文件以8 bit字节传输就等同于图像文件传输。

2.格式控制

该选项只对ASCII和EBCDIC文件类型有效。

(a)  非打印(默认选择)文件中不含有垂直格式信息。

(b)  远程登录格式控制文件含有向打印机解释的远程登录垂直格式控制。

(c)  Fortran 回车控制每行首字符是Fortran格式控制符。

3. 结构

(a)  文件结构(默认选择)文件被认为是一个连续的字节流。不存在内部的文件结构。

(b)  记录结构该结构只用于文本文件(ASCII或EBCDIC)。

(c)  页结构每页都带有页号发送,以便收方能随机地存储各页。该结构由TOPS-20操作系统提供(主机需求RFC不提倡采用该结构)。

4. 传输方式

它规定文件在数据连接中如何传输。

(a)  流方式(默认选择)文件以字节流的形式传输。对于文件结构,发方在文件尾提示关闭数据连接。对于记录结构,有专用的两字节序列码标志记录结束和文件结束。

(b)  块方式文件以一系列块来传输,每块前面都带有一个或多个首部字节。

(c)  压缩方式一个简单的全长编码压缩方法,压缩连续出现的相同字节。在文本文件中常用来压缩空白串,在二进制文件中常用来压缩0字节(这种方式很少使用,也不受支持。

现在有一些更好的文件压缩方法来支持FTP)。

如果算一下所有这些选择的排列组合数,那么对传输和存储一个文件来说就有72种不同

的方式。幸运的是,其中很多选择不是废弃了,就是不为多数实现环境所支持,所以我们可

以忽略掉它们。

通常由Unix实现的FTP 客户和服务器把我们的选择限制如下:

• 类型:ASCII或图像。

• 格式控制:只允许非打印。

• 结构:只允许文件结构。

• 传输方式:只允许流方式。

这就限制我们只能取一、两种方式: ASCII或图像(二进制)。

该实现满足主机需求RFC的最小需求(该RFC也要求能支持记录结构,但只有操作系统

支持它才行,而Unix不行)。

很多非Unix的实现提供了处理它们自己文件格式的FTP功能。主机需求RFC指出“FTP协议有很多特征,虽然其中一些通常不实现,但对FTP中的每一个特征来说,都存在着至少一种实现”。

5. 连接管理

数据连接有以下三大用途:

1) 从客户向服务器发送一个文件。

2) 从服务器向客户发送一个文件。

3) 从服务器向客户发送文件或目录列表。

FTP服务器把文件列表从数据连接上发回,而不是控制连接上的多行应答。这就避免了行

的有限性对目录大小的限制,而且更易于客户将目录列表以文件形式保存,而不是把列表显

示在终端上。

我们已说过,控制连接一直保持到客户-服务器连接的全过程,但数据连接可以根据需要

随时来,随时走。那么需要怎样为数据连接选端口号,以及谁来负责主动打开和被动打开?

首先,我们前面说过通用传输方式(Unix环境下唯一的传输方式)是流方式,并且文件

结尾是以关闭数据连接为标志。这意味着对每一个文件传输或目录列表来说都要建立一个全

新的数据连接。其一般过程如下:

1) 正由于是客户发出命令要求建立数据连接,所以数据连接是在客户的控制下建立的。

2) 客户通常在客户端主机上为所在数据连接端选择一个临时端口号。客户从该端口发布

一个被动的打开。

3) 客户使用PORT命令从控制连接上把端口号发向服务器。

4) 服务器在控制连接上接收端口号,并向客户端主机上的端口发布一个主动的打开。服

务器的数据连接端一直使用端口20。

 

服务器总是执行数据连接的主动打开。通常服务器也执行数据连接的主动关闭,除非当

客户向服务器发送流形式的文件时,需要客户来关闭连接(它给服务器一个文件结束的通

知)。

客户也有可能不发出PORT命令,而由服务器向正被客户使用的同一个端口号发出主动打

开,来结束控制连接。这是可行的,因为服务器面向这两个连接的端口号是不同的:一个是

20,另一个是21。

6. 命令与应答

本节主要讨论命令格式。命令对大小写不敏感。命令通常由命令码和相应的参数组成。中间由一个或几个空格分开。参数域由<CRLF>结束,服务器在未接收到行结束符时不会采取任何动作。下面描述的格式是以NVT-ASCII以准的,方括号代表可选的参数域,如果未选择可选的参数域则采用默认值。

  6.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>

 

6.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)。

 

6.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 - 压缩

 

6.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命令。

 

  6.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> ::= 任何十进制整数

 

  6.3   FTP应答

应答都是ASCII码形式的3位数字,并跟有报文选项。其原因是软件系统需要根据数字代码来决定如何应答,而选项串是面向人工处理的。由于客户通常都要输出数字应答和报文串,一个可交互的用户可以通过阅读报文串(而不必记忆所有数字回答代码的含义)来确定应答的含义。应答3位码中每一位数字都有不同的含义。

给出了应答代码第1位和第2位的含义。

应答说明

1yz 肯定预备应答。它仅仅是在发送另一个命令前期待另一个应答时启动

2yz 肯定完成应答。一个新命令可以发送

3yz 肯定中介应答。该命令已被接受,但另一个命令必须被发送

4yz 暂态否定完成应答。请求的动作没有发生,但差错状态是暂时的,所以命令可以过后再发

5yz 永久性否定完成应答。命令不被接受,并且不再重试

x0z 语法错误

x1z 信息

x2z 连接。应答指控制或数据连接

x3z 鉴别和记帐。应答用于注册或记帐命令

x4z 未指明

x5z 文件系统状态

第3位数字给出差错报文的附加含义。例如,这里是一些典型的应答,都带有一个可能的

报文串。

• 125 数据连接已经打开;传输开始。

• 200 就绪命令。

• 214 帮助报文(面向用户)。

• 331 用户名就绪,要求输入口令。

• 425 不能打开数据连接。

• 452 错写文件。

• 500 语法错误(未认可的命令)。

• 501 语法错误(无效参数)。

• 502 未实现的MODE (方式命令)类型。

通常每个FTP命令都产生一行回答。例如, QUIT命令可以产生如下应答:

221 Goodbye.

如果需要产生一条多行应答,第1行在3位数字应答代码之后包含一个连字号,而不是空格,

最后一行包含相同的3位数字应答代码,后跟一个空格符。

 

三、NAT中FTP流程

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章