我们必须分清文件传送(file transfer) 和文件存取(file access)之间的区别,前者是FTP提供的,后者是如NFS(sun 的网络文件系统)等应用系统提供的。由FTP提供的文件传是将一个文件从一个系统复制到另一个系统中。
FTP支持有限数量的文件类型(ASCII, 二进制,等等)和文件结构(面积字节流或记录).
FTP控制连接使用的IP服务类型(TOS)是最小延迟,而数据连接使用的IP服务类型则是最大吞吐。
FTP最早的设计是用于两台不同的主机,这两台主机可能运行在不同的操作系统中,使用不同的文件结构,并可以使用不同的字符集。因此FTP协议规范了控制文件传送与存储的多种选择。它们有以下四个方面:
通常由Unix实现的FTP客户和服务器把我们的选择限制如下:
1.文件类型:ASCII或图像(也称为二进制文件类型)。
2.格式控制:只允许非打印。
3.结构:只允许文件结构。
4.传输方式:只允许流方式。
这就限制我们只能取一、两种方式:ASCII或图像(二进制)。
FTP命令和应答在客户和服务器的控制连接上以NVT ASCII码形式传送。这就要求在每行结尾都要返回CR、LF对(也就是每个命令或每个应答)。
FTP命令:
这些命令都是3或4个字节的大写ASCII字符,其中一些带选项参数。从客户端向服务器发送的FTP命令超过30种。在用户交互类型和控制连接上传送的FTP命令之间有时是一对一的。但也有一些操作,一个用户命令产生控制连接上多个FTP命令。
ABOR:放弃先前的FTP命令和数据传输
LIST filename:列表显示文件或目录
PASS passworkd:服务器上的口令
PORT n1,n2,n3,n4,n5,n6:客户端IP地址(n1,n2,n3,n4)和端口(n5*256 + n6)
QUIT:从服务器注销
RETR filename:检索(取)一个文件
STOR filename:存储(放)一个文件
SYST:服务器返回系统类型
TYPE type:说明文件类型,A表示ASCII码,I表示图像
USER username:服务器上的用户名
FTP应答:
应答都是ASCII码形式的3位数字,并跟有报文选项。其原因是软件系统需要根据数字代码来决定如何应答,而选项串是面向人工处理的。
应答3位码中每一位数字都有不同的含义(SMTP使用相同的命令和应答的约定)。
125:数据连接已经打开,传输开始
200:就绪命令
214:帮助报文(面向用户)
331:用户名就绪,要求输入口令
425:不能打开数据连接
452:错写文件
500:语法错误
501:语法错误(无效参数)
502:未实现的MODE(方式命令)类型
通常每个FTP命令都产生一行回答。例如,QUIT命令可能产生如下应答:
221:Goodbye
如果需要产生一条多行应答,第1行在3位数字应答代码之后包含一个连字号,而不是空格,最后一行包含相同的3位数字应答代码,后跟一个空格符。例如,初次连接一个FTP服务器可以产生以下输出:
220- FTP site powerd by BigFollCat FTP Server 1.0.
220- Welcome to my ftp server
220
连接管理:
控制连接一直保持客户-服务器连接的全过程,但数据连接可以根据需要随时来,随时走。那么需要怎样为数据连接选端口号,以及谁来负责主动打开和被动打开?
首先,我们前面说过通用传输方式(Unix 环境下唯一的传输方式)是流方式,并且文件结尾是以关闭数据连接为标志。这意味着对第一个文件传输或目录列表来说都要建立一个全新的数据连接。其一般过程如下 :
1.正由于是客户发出命令要求建立数据连接,所以数据连接是在客户的控制下建立的。
2.客户通常在客户端主机上为所在数据连接端选择一个临时端口号,客户从该端口发布一个被动的撕开。
3.客户使用PORT命令从控制连接上把端口号发向服务器。
4.服务器在控制连接上接收端口号,并向客户端主机上的端口发布一个主动的打开。服务器的数据连接端一直使用端口20.
默认数据端口:
在不发出port命令的FTP客户端上,如果服务器试图再次连接客户端先前用过的数据连接的端口,则可能出现插口对正在使用的错误而被TCP实现禁止发出syn包。这时服务器仍然使用20端口而客户端被假定还用以前的端口号,这时需要等待2MSL超时才能重新连接。
Host Requirements RFC建议使用PORT命令的原因是在两个相继使用数据连接之间避免出现这个2MSL,通过不停地改变某一端的端口号,我们所看到的在两次List服务器目录时中间需要等待2MSL时间的问题就不会出现。
文本文件传输:
当前大多数客户端在进行传输之前会试图确定是否是相同类型的系统,一旦相同,就可以用二进制码(图像文件类型)来传输文件,而不是ASCII码。这可以获得两个方面的好处:
1.发方和收方不必查看每一字节(很大的节约)
2.如果该机操作系统使用比2字节的NVT ASCII码序列更少的字节来作行尾,就是传输更少的字节数(很小的节约)。比如,使用ASCII 码时UNIX下的每一新行符(\n)被服务器转换成NVT ASCII码的2字节行结尾序列(\r\n)来传输,然后再由客户转换成原先形式来存储。
另外 ,如果服务器文件是压缩文件,则必须用二进制来进行传输。
注册到服务器后,客户FTP自动发出SYST命令,服务器将用自己的系统类型来响应。如果应答起自字符串“215 UNIX Type:L8", 并且如果客户在每字节为8bit的unix系统上运行,那么二进制方式(图像)将被所有文件传输所使用,除非被用户改变。
当我们取文件hello.c时,客户自动发出命令TYPE I把文件类型规定成图像。这样在数据连接上只有38字节被传输。
Host Requirements RFC指出一个FTP服务器必须支持SYST命令。
异常终止一个文件的传输:
异常终止从客户端传向服务器的文件很容易--只要客户停止在数据连接上发送数据,并发出ABOR命令到控制连接上的服务器即可。而异常终止接收就复杂得多了。这是因为客户要告知服务器立即停止发送数据。客户端通过发送带有紧急指针的报文段,并且使用telnet同步信号来通知服务器终止发送。当收到紧急指针数据时,它读取下一个FTP命令,寻找ABOR或STAT,忽略嵌入的telnet命令。
匿名FTP可以使用anonymous作为登录名,有些匿名FTP会要求客户端能够通过IP地址反向解析到其域名。