FTP协议完全详解
1.介绍
一般来说,用户联网的首要目的就是实现信息共享,文件传输是信息共享非常重要的一个内容之一。Internet上早期实现传输文件,并不是一件容易的事,我们知道Internet是一个非常复杂的计算机环境,有PC,有工作站,有MAC,有大型机,而连接在Internet上的计算机有上千万台,并且这些计算机可能运行不同的操作系统,有运行Unix 的服务器,也有运行Dos、Windows的PC机和运行MacOS的苹果机等等,而各种操作系统之间的文件交流问题,需要建立一个统一的文件传输协议,这就是所谓的FTP。基于不同的操作系统有不同的FTP 应用程序,而所有这些应用程序都遵守同一种协议,这样用户就可以把自己的文件传送给别人,或者从其它的用户环境中获得文件。
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之间传送。下面就是一个例子:
协议要求数据传输在处理时打开控制连接。在完成FTP服务后由用户中止控制连接,而服务器具体操作。如果在未接收命令时关闭了控制连接,服务器也会关闭数据传输。FTP和Telnet很有联系,FTP使用Telnet协议进行控制连接,可有两种方法达到目的:用户PI或服务器PI可以在自己的过程中实现Telnet
协议的功能;第二种方法是利用系统中现有的Telnet模块。实现上,FTP对Telnet协议的依赖也不多,即使重新实现,代码量也不大。
3. 数据传输功能
数据连接只传输数据,控制连接传送命令和响应。几个命令是关于在主机间传输数据的,数据传输基本上独立于物理结构的,但是如果在压缩传输模式下流式传输与文件结构有关,文件的属性与表示类型有关。
3.1. 数据表示与保存
数据是在主机间的存储设置间传送的。因为两个系统的数据存储方式不同,因此需要对它进行转换,在传送文本时会有对ASCII表示的问题,在进行二进制传送的时候,会有不同系统对字节长度规定不同的问题,有的系统是7位,有的系统可能是32位,这也需要进行转换。需要提供数据表示与传输模型函数,但是FTP提供这方面的功能不多,超过FTP提供功能的那一部分要用户自己实现。
3.1.1. 数据类型
数据表示是由用户指定的表示类型,它可以是隐含的,也可以是用户指定的。请一定注意:逻辑字节长度与物理字节长度是不同的。
3.1.1.1. ASCII类型
这是所有FTP必须实现的默认类型,用于传送文本文件,当在主机间使用EBCDIC传送时更方便,则不使用ASCII类型。发送方将内部表示转换为NVT-ASCII格式,接收方则进行相反的过程接收数据。根据NVT标准,要在行结束处使用
3.1.1.2. EBCDIC类型
它是作为ASCII的另一种方法在主机间传送数据的数据类型。EBCDIC和ASCII很象,仅在类型的功能描述上有一些差别。行结束符使用很少。
3.1.1.3. 图象类型
在此类型下传送的数据被看作连续的位,发送方将数据打包到8位传输字节中传送。因为结构的需要要对传送数据进行填充,填充字节全部为0,填充必须在文件结构时使用,而且要标记出以便接收方过滤掉。它用于传送二进制数据和有效地传送和存储文件,因此所有FTP也必须实现。
3.1.1.
4. 本地类型
也可以以十进制指定逻辑字节大小。如果物理字节大小和逻辑字节大小不同,直接将物理数据打包为逻辑字节,不用什么填充。接收方根据逻辑字节大小进行和