10.3.1 概述文件传送协议 FTP(File Transfer Protocol)是 Internet 上使用得最广泛的文件传送协议。FTP 提供交互式的访问,允许客户指明文件的类型与格式(如指明是否使用 ASCII 码),并允许文件具有存取权限(如访问文件的用户必须经过授权,并输人有效的口令)。FTP 屏蔽了各计算机系统的细节,因而适合于在异构网络中任意计算机之间传送文件「RFC 959」。 在 Internet 发展的早期阶段,用 FTP 传送文件约占整个 Internet 的通信量的三分之一,而由电子邮件和域名系统所产生的通信量还要小于 FTP 所产生的通信量。只是到了 1995 年,WWW 的通信量才首次超过了 FTP。 本节介绍基于 TCP 的 FTP 和基于 UDP 的 TFTP,它们都是文件共享协议中的一大类,即复制整个文件,其特点是:若要存取一个文件,就必须先获得一个本地的文件副本。如果要修改文件,只能对文件 的副本进行修改,然后再将修改后的文件副本传回到原结点。 文件共享协议中的另一大类是联机访问(on-line access)。联机访问意味着允许多个程序同时对一个文件进行存取。和数据库系统不同之处是用户不需要调用一个特殊的客户进程,而是由操作系统提供对远 地共享文件进行访问的服务,就如同对本地文件的访问一样。这就使得用户可以使用远地文件作为输入和输出来运行任何应用程序,而操作系统中的文件系统则提供 对共享文件的透明存取。透明存取的优点是:将原来用于处理本地文件的应用程序用来处理远地文件时,不需要对该应用程序作明显的改动。属于文件共享协议的有 网络文件系统 NFS(Network File System),这将在本节的最后一部分进行介绍。 10.3.2 FTP的主要工作原理在网络环境中的一项基本应用就是将文件从一台计算机中复制到另一台计算机中(它们可能相距很远)。但这往往是很困难的。原因是由于众多的计算机厂商研制出的文件系统多达数百种,且差别很大。经常遇到的问题是:
文件传送协议 FTP 只提供文件传送的一些基本的服务,它使用 TCP 可靠的运输服务。FTP 的主要功能是减少或消除在不同操作系统下处理文件的不兼容性。 FTP 使用客户服务器模式。一个 FTP 服务器进程可同时为多个客户进程提供服务。FTP 的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。 主进程的工作步骤如下:
FTP 的工作情况如 图10-7 所示。图中的圆圈表示在系统中运行的进程。为简单起见,服务器中的主进程没有画上。 在进行文件传输时,FTP 的客户和服务器之间要建立两个连接:“控制连接”和“数据连接”。图中的控制进程就是上述的“从属进程”。在创建该进程时,控制连接随之创建并连接到控制进程上。控制连接在整个会话期间一直保持打开,FTP 客户所发出的传送请求通过控制连接发送给控制进程,但控制连接并不用来传送文件,实际用于传输文件的是“数据连接”。控制进程在接收到 FTP 客户发送来的文件传输请求后就创建一个“数据传送进程”和一个“数据连接”,并将数据连接连接到“数据传送进程”,数据传送进程实际完成文件的传送,在传送完毕后关闭“数据传送连接”并结束运行。在 图10-7 中,控制连接的箭头是从客户指向服务器,表示客户发起控制连接。但数据连接则按相反的方向形成,即服务器发起数据连接。这时 FTP 服务器作为客户,而 FTP 客户则作为服务器。 当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口(21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口(20)与客户进程所提供的端口号码建立数据传送连接。由于 FTP 使用了两个不同的端口号,所以数据连接与控制连接不会发生混乱。 使用两个独立的连接的主要好处是使协议更加简单和更容易实现,同时在传输文件时还可以利用控制连接(例如,客户发送请求终止传输)。 FTP 一般都是交互式地工作。作为例子,图10-8 给出了用户机器上显示出的信息。但最左边的编号 [01]-[15] 并不是屏幕信息而是作者增加的,目的是便于在后面加上相应的说明。图中的黑体字是用户键入的字符。在用户键入完毕后还要键入回车键。 图中的各行信息的解释如下: [01] 用户要用 FTP 和远地主机(网络信息中心 NIC 上的主机)建立连接。 10.3.3 简单文件传送协议TFTP简单文件传送协议 TFTP(Trivial File Transfer Protocol)是一个很小且易于实现的文件传送协议「RFC 1350,783」。虽然 TFTP 也使用客户服务器模式,但它使用 UDP 数据报,因此 TFTP 要有自己的差错改正措施。TFTP 只支持文件传输而不支持交互,且没有一个庞大的命令集。TFTP 没有列目录的功能,也不能对用户进行身份鉴别。 TFTP 的优点是:第一,TFTP 可用于 UDP 环境。例如,当需要将程序或文件同时向许多机器下载时就往往需要使用 TFTP。第二,TFTP 代码所占的内存较小。这对较小的计算机或某些特殊用途的设备是很重要的。这些设备不需要硬盘,只需要固化了 TFTP、UDP 和 IP 的小容量只读存储器即可。当接通电源后,设备执行只读存储器中的代码,在网络上广播一个 TFTP 请求。网络上的 TFTP 服务器就发送响应,其中包括可执行二进制程序。设备收到此文件后将其放入内存,然后开始运行程序。这种方式增加了灵活性,也减少了开销。 TFTP 的主要特点是: (1)每次传送的数据 PDU 中有 512 字节的数据,但最后一次可不足 512 字节。 TFTP 的工作很像停止等待协议。发送完一个文件块后就等待对方的确认,确认时应指明所确认的块编号。发完数据后在规定时间内收不到确认就要重发数据 PDU。发送确认 PDU 的一方若在规定时间内收不到下一个文件块,也要重发确认 PDU。这样就可保证文件的传送不致因某一个数据报的丢失而告失败。 在一开始工作时。TFTP 客户进程发送一个读请求 PDU 或写请求 PDU 给 TFTP 服务器进程,其熟知端口号码为 69。TFTP 服务器进程要选择一个新的端口和 TFTP 客户进程进行通信。若文件长度恰好为 512 字节的整数倍,则在文件传送完毕后,还必须在最后发送一个只含首部而无数据的数据 PDU。若文件长度不是 512 字节的整数倍,则最后传送数据 PDU 的数据字段一定不满 512 字节,这正好可作为文件结束的标志。 TFTP 共有五种协议数据单元 PDU,即:读请求 PDU、写请求 PDU、数据 PDU、确认 PDU和差错 PDU。图10-9 是这五种 PDU 的格式。 每种 PDU 的第一个字段是操作码字段,分别填入 1 至 5 。读或写 PDU 中的方式字段用来区分不同类型的文件(如 ASCII 文件或二进制文件等)。在出现差错时就结束文件的传送。 10.3.4 网络文件系统 NFS1.NFS 的主要特点 网络文件系统 NFS 最初是在 UNIX 操作系统环境下实现文件和目录的共享。NFS 可使本地计算机共享远地的资源,就像这些资源在本地一样。由于 NFS 原先是 SUN 公司在 TCP/IP 网络上创建的,因此目前 NFS 主要应用在 TCP/IP 网络上。然而现在 NFS 也可在 OS/2、MS-Windows、NetWare 等操作系统上运行。关于 NFS 的标准可参考 [RFC 1094]。 FTP 并非对所有的数据传输都是最佳的。例如,计算机 A 上运行的应用程序要在远地计算机 B 的一个很大的文件末尾添加一行信息。若使用 FTP,则应先将此文件从计算机 B 传送到计算机 A。添加上这一行信息后,再用 FTP 将此文件传送到计算机 B。来回传送这样大的文件很花时间。但这种传送是不必要的,因为计算机 A 并没有使用该文件的内容。 网络文件系统 NFS 则采用另一种思路。NFS 允许应用进程打开一个远地文件,并能够在该文件的某一个特定的位置上开始读写数据。这样 NFS 可使用户只复制一个大文件中的一个很小的片段,而不需要复制整个大文件。对于上述例子,计算机 A 中的 NFS 客户软件,将要添加的数据和在文件后面写数据的请求一起发送到远地的计算机 B 中的 NFS 服务器。NFS 服务器更新文件后返回应答信息。在网络上传送的只是少量的修改数据。 实际上,在计算机 B 上的文件可以被多个客户存取。NFS 允许客户对文件进行加锁。当一个客户完成修改后就对文件解锁,从而使别的客户能够进行存取。 NFS 的界面与 FTP 的不同。从用户的观点看 NFS 几乎是不可见的,它被集成在操作系统的文件系统中,用普通的系统调用即可访问 NFS 文件。通过对 NFS 的配置,可使计算机的文件系统创建一个特殊的目录与远地计算机相关联(图10-10),所有在该目录中的文件都被认为是远程文件。每当一个应用程序请求一 个文件操作时,计算机的文件系统根据被操作文件所在目录就知道应将此请求传递给本地文件系统或 NFS 客户软件。若属于后一种情况,NFS 客户软件就利用网络对远地计算机文件系统进行操作。因此,只要安装和配置了 NFS,计算机的文件系统就包含了相当于远地文件系统的目录。显然,这种方案是相当灵活的,因为应用程序所执行标准的文件操作使得任何一个应用程序都可使 用远地文件。 2.远程过程调用 RPC NFS 由三个独立的部分组成,即 NFS 协议本身,通用的远程过程调用 RPC(Remote Procedure Call)①,以及通用的外部数据表示 XDR(eXternal Data Representation)。这样做的好处是为了使其他软件也可使用 RPC 和 XDR (见 [RFC-1057,1014] )。 NFS 本身并未提供新的系统调用。一旦配置了 NFS,应用程序存取远程文件的操作就如同使用本地文件一样。但是,RPC 和 XDR 都提供让编程人员构造分布式程序的机制。 RPC 也是采用客户服务器模式。当本地计算机的客户进程调用一个远程过程时,RPC 就自动收集参数值,形成一个报文,并将此报文发送到远程计算机的服务器,然后等待响应,最后在指定的一些参数中存储返回值。实际上,与远程服务器的通信只是作为远程过程调用的副产品而自动发生的。RPC 机制屏蔽了所有的协议细节,使得编程人员几乎不需要了解下层通信协议就可编写分布式程序。 3.外部数据表示 XDR 外部数据表示 XDR 为编程人员提供了一种在异构机器间传递数据的方式,而不再要求编程人员编写用于转换数据表示的程序。例如,不是所有的计算机都用相同的格式表示 32 位的整数。有些格式在最高内存地址存放该数的最高位字节,而另一些格式则在最高地址存放最低位字节。因此,当编程人员仅仅使用网络所提供传输服务,在不同机器之间依次传送一个整数的各字节而不加以重排,则该整数的值就可能会改变。XDR 通过定义一种与机器无关的表示来解决此问题。在某个计算机中的一个进程可调用 XDR 过程,把数据的本地表示转换为与机器无关的表示。当数据传送到另一台机器后,接收程序就调用 XDR 过程把这个与机器无关的表示再转换为本结点上的本地表示。 XDR 的主要优点是它把许多数据转换任务自动化。编程人员不需要人工键入 XDR 过程调用。他们只需要让程序给 XDR 编译程序提供需要转换数据的说明,编译程序就能自动产生具有所需 XDR 库调用的程序。 ①. 这里的 Remote 和 Local(本地)是相对的,因此名词“远地”和“远程”都可以用。 |