第五节 文件传输与访问

几种常见的设计:
单个集中的文件服务器为一些没有本地硬盘的终端提供辅存,各终端通过高速无线网与文件服务器通信;
用户使用带本地存储设备的常规计算机,并定期通过网络把文件备份(或整个盘的副本)发送到一个保管数据的设备,在避免数据的偶然丢失;
重点加强在多个程序、多个用户或多个网点之间共享数据的能力,例如把一个联机数据库供所有工作组共享。
7.5.1 联机共享式访问
文件共享的两种不同形式:
联机共享访问(on line access):允许多个程序同时访问一个文件。
特点:对文件的改动迅速生效,并在所有访问文件的程序中都可获得改动信息。
整文件复制(whole file copying):程序无论何时想访问一个文件,都必须获得一个本地文件副本。
特点:通常用于只读数据,如果必须修改文件,程序对本地副本进行修改,并将修改后的文件传回到原网点。
(一)联机访问方式
文件共享比数据库系统更先进且更容易使用:操作系统提供对远程共享文件的访问,用户可使用远程文件进行输入和输出来运行任何应用程序,如同对本地文件的访问一样,整个文件系统提供对共享文件的透明访问。
透明访问的优点:远程文件访问不需对应用程序进行明显改动,用户可对本地和远程文件进行访问,允许这些文件对共享数据进行任意计算。
透明访问的缺点:使用本地和远程文件的应用程序不太可靠。
——若网络或远程机器出现故障、超负载或者网络拥塞,即使用户的机器仍在运行,应用程序也不能正常工作、运行缓慢或引起通信协议向用户报告出现超时。
实现一体化的、透明的文件访问比较困难!
可能存在的几个问题:
在异构环境中,一台机器上可用的文件名可能无法映射到另一台机器的文件名空间;
一个远程文件访问机制必须处理计算机系统中所有权、访问授权和访问保护的关系;
由于文件表示和允许的操作在不同机器间各不相同,在所有文件上实现全部操作可能很难或不太可能。
二)文件传输共享(整文件复制)
——用传输机制访问远程数据,取代一体化的透明联机访问的方案
特点:用户首先获得一个文件的本地副本,然后对副本进行操作;大多数传输机制在本地文件系统之外运作(即未实现一体化)。
实现:

用户必须调用一个特殊的客户程序传输文件,并同时指明一个远程机器
|
该远程机器上有用户所需的文件以及获得访问所需的授权(如一个账号或口令)
|
客户与远程机器上的服务器联系,并请求一个文件的副本
|
传输结束,用户终止客户,并使用本地机器上的应用程序读取或修改本地副本

优点:操作的高效性,一旦程序获得远程文件的一个副本,就可以高效地处理文件副本,许多计算用整文件复制比用远程文件访问运行得快。
缺点:异构机器间实现较难,客户和服务器必须就访问授权、文件所有者和访问保护的观念以及数据格式达成一致。
由于异构机器间,各种表示之间、以及处理各种表示的技术之间有详细的区别,可能使得反向转换无法进行,因此整文件复制尤其重要!
例如:两台浮点数表示和文本文件表示都不同的机器A和B间的文件复制。
不可能将一台机器的浮点格式不丧失精确度地转换为另一台机器上的格式;
对于文本文件,假设系统A存储文件允许各行长度可变,而系统B要求必须将文本行填充为定长的;从系统A把文件传输到系统B时需要填充每行文本,从而使得最终的副本与原文件不同;然而,在从B传回A时,又要从每一行末尾自动去掉填充字符,这也会使副本与原先每行有填充字符的文件不同。
几点注意:
以上各种详细区别与计算机系统有关;
不是所有的表示差异都是可适应的,数据从一种表示转换为另一种表示时可能有丢失现象;
TCP/IP是为异构环境设计的,牢记这一点将有助于解释TCP/IP文件传输协议的一些特征。
7.5.2 文件传输协议FTP(File Transfer Protocol)
文件传输是最常用的TCP/IP应用之一,它的使用导致了大量的网络通信量。
起源:由早期的ARPANET中的标准文件传输协议版本发展而成。
FTP提供的、超出自身传输功能的设施:
交互访问,大多数实现提供了一个交互接口,使得用户更容易与远程系统交互。
例如,一个用户可能请求列出远程机器上某个目录中的所有文件,或通过显示可调用命令的有关用户信息,来响应用户输入的“help”。
格式(表示)规范,允许客户指定存储数据的类型和格式。
例如,用户可指明一个文件是包含文本还是二进制整数,以及文本文件是使用ASCII字符集还是EBCDIC字符集。
鉴别控制(Authentication Control),需要客户在请求文件传输前把登录名和口令发送给服务器,以获得访问许可。
大多数FTP服务器实现允许多个客户的并发访问!
客户和服务器通常创建一个单独的进程来处理数据传输!

客户使用TCP边接到服务器
|
一个主服务器进程等待连接
|
主服务器进程为处理每个连接建立各个从进程(slave process)
|
从进程不完成所有心要的计算,只接受和处理来自客户的控制连接
|
(控制连接也使用TCP作为传输协议,传输所有数据)
|
服务器使用一个或多个额外进程处理单独的数据传输连接
|
(数据传输连接也使用TCP作为传输协议,传输所有数据)

FTP的几个特点:
客户与服务器的控制进程使用一个TCP连接,数据传输进程使用单独的TCP连接;
控制连接在整个会话期间保持不变,只要FTP会话保持运行,控制进程和控制连接就一直存在,一旦控制连接消失会话即终止,两端软件将终止所有的数据传输进程;
数据传输进程和数据传输连接可在需要时动态创建,每次为文件传输建立一个新的数据传输连接,许多实现在服务器需要把信息发送到客户时,就创建一对新的数据传输进程以及一个新的TCP数据传输连接。
对于操作系统不支持多进程的机器,只使用一个应用进程完成数据传输和控制功能,但是仍需要使用多个TCP连接,一个用于控制,其它的用于数据传输,牺牲了通用性。
客户最初连接到服务器时,使用一个任意分配的本地协议端口号,与服务器的一个熟知端口(2l)联系!
只使用一个协议端口的服务器可接受多个客户的连接!因为TCP用连接两端来识别一个连接。
控制进程何时为数据传输建立一个新的TCP数据连接,使用什么协议端口?
控制进程何时为数据传输建立一个新的TCP数据连接,使用什么协议端口?
客户获取本地上未用的端口,并使用该端口、以及服务器上用于FTP数据传输的熟知端口(20)与服务器机器上的数据传输进程联系。
为保证服务器机器上的数据传输进程正确连接到客户机器上的数据传输进程,服务器端必须不能从任意进程接受连接!而是当服务器发出TCP被动打开请求时,指明客户机器上将使用的端口(远程端口)和本地端口。
FTP在控制连接上传递数据使用什么格式?
允许使用TELNET网络虚拟终端协议,但不允许选项协商,而是使用基本的NVT定义。
采用BSD接口使各产品保持相似性!
FTP的BSD接口共支持50多条命令。
许多厂商支持BSD接口的一个变种。
两个原因:
首先,BSD接口包含一些几乎不会执行的选项(例如,允许与两个远程节点同时进行通信的proxy命令);
其次,该接口提供了一些选项来处理已过时的细节,其中一些已经不再适用了。
7.5.3 FTP应用举例
用户建立连接和获取文件通常只需执行几个FTP命令。
例如,假设某人将一个文本的联机副本放到机器ftp.cs.purdue.edu的子目录pub/comer中的文件tcpbook.tar里,用户从另一个网点作为usera登录,即可通过执行下列命令获得文件的副本:
% ftp ftp.cs.purdue.edu
Connected to lucan.cs.purdue.edu
220 lucan.cs.purdue.edu FTP server Version wu-2.4.2-VR16(1)ready.
Name(ftp.cs.purdue.edu:usera):anonymous
331 Guest login ok,send e-mail address as password.
Password:guest
230 Guest login ok,access restrictions apply.
ftp> get pub/comer/tcpbook.tar bookfile
200 PORT command okay.
150 Opening ASCII mode data connection for tcpbook.tar(9895469 bytes).
226 Transfer complete.
9895469 bytes received in 22.76 seconds(4.3e+02Kbytes/s)
ftp> close
221 Goodbye.
ftp> quit
% ftp ftp.cs.purdue.edu ——用户指定机器名ftp.cs.purdue.edu作为FTP命令的一个参数
Connected to lucan.cs.purdue.edu
220 lucan.cs.purdue.edu FTP server Version wu-2.4.2-VR16(1)ready.
Name(ftp.cs.purdue.edu:usera):anonymous ——登录名
331 Guest login ok,send e-mail address as password.
Password:guest ——口令
230 Guest login ok,access restrictions apply.
ftp> get pub/comer/tcpbook.tar bookfile ——使用get命令获取一个文件的副本
200 PORT command okay. 指定远程文件名、本地副本的名字
150 Opening ASCII mode data connection for tcpbook.tar(9895469 bytes).
226 Transfer complete. ——FTP客户和服务器间的控制报文、差错报文和信息报文总是由3个数字9895469 bytes received in 22.76 seconds(4.3e+02Kbytes/s) 开始,后跟文本。
ftp> close
221 Goodbye.
ftp> quit ——传输结束后,两端的数据传输进程各自关闭连接。
FTP对编程而言是复杂和困难的,许多应用既不需要FTP提供的全部功能,也不能应付FTP的复杂性!
例如,FTP需要客户和服务器管理多个并发的TCP连接,这对于没有先进操作系统的个人计算机而言有些困难,或者根本不可能实现。
7.5.4 简单文件传输协议TFTP(Trivial File Transfer Protocol)
——TCP/IP协议族的第二个文件传输协议
特点:是为客户和服务器间不需要复杂交互的应用程序而设计的,提供并不复杂、开销不大的服务,只限于简单文件传输操作,不提供访问授权,除了传输所需的功能外几乎没有其他功能,TFTP软件比FTP小得多。
程序小对于许多应用而言是很重要的!
例如,无盘设备的生产厂商可将TFTP编码到只读存储器(ROM)中,并使用它在机器开机时获取一个内存映像。
系统自举(bootstrap):ROM中的程序。
使用TFTP的优点:允许自举代码执行时使用的底层TCP/IP协议与操作系统使用的相同,因此一台计算机可以从另一个物理网络中的服务器自举。
简单文件传输协议TFTP:不需要可靠数据流交付服务,运行在UDP或其他任何不可靠分组传输系统上,使用超时和重传保证数据的到达,发送端用固定大小(5l2字节)的块传输文件,并在发送下一块前等待对每个块的确认,接收端每收到一块后都加以确认。
TFTP的规则:
发送的第一个分组(初始分组)请求文件传输,并建立客户与服务器间的交互,初始分组指明了文件名,并指定是要读文件(使用操作码1,传给客户)还是要写文件(使用操作码2,传给服务器);
文件块从l开始连续编号,每个数据分组包括一个首部,指明传输块的数目,并且每个确认包含被确认的块数,少于5l2字节的块标志文件尾;
可以在数据或确认的位置上发送差错报文,差错将终止文件传输。
五个TFTP分组类型的格式
前两个八位组的操作码识别报文格式一旦发出了读或写请求,服务器使用客户的IP地址和UDP协议端口号识别后续操作

TFTP重传:由于对称性,通信双方各自实现超时和重传。
如果发送端超时,它将重传丢失的数据块;
如果负责确认的一端超时,它将重传丢失的确认。
对称重传的好处:保证了健壮性,有助于保证在丢失单个分组时传输不会失败。
Sorcerer’s Apprentice Bug问题:对称重传可能导致过量重传。
发生条件:
在数据分组k的一个确认有时延但并没丢失时会出现此问题。
现象:发送端将重传此数据分组,然后接收端再进行确认,两个确认最终又到达了发送端,每个确认又将引起数据分组k+l的传输,接收端将确认两个数据分组k+l,并且发出的两个确认中的每一个又将分别引起发送端发送数据分组k+2……
如果底层的互朕网复制了分组,则Sorcerer’s Apprentice Bug也会出现,每个数据分组被传输正好两次的循环将无限制地持续下去。
优点:支持多种文件类型;可与电子邮件集成,客户可指明服务器发送的文件应当作邮件处理,其文件名字段指定服务器用于交付这个报文的邮箱名字。
7.5.5 网络文件系统NFS(Network File System)
——最初由Sun Microsystems公司开发
网络文件系统NFS:提供透明、一体化的联机共享文件访问,许多TCP/IP网点使用NFS互联其计算机文件系统。
从用户的角度看,NFS几乎不可见:用户可执行一个任意的应用程序并使用任意文件作为输入或输出,文件名本身无法表示文件是本地的还是远程的。
NFS是嵌人到操作系统中的。

应用程序调用操作系统打开文件、存储文件或检索文件中的数据
|
文件访问机制接受请求并自动将请求传给本地文件系统软件或NFS客户(这与文件是位于本地磁盘还是远程机器有关)
|
NFS客户软件收到请求后使用NFS协议联系远程机器上的服务器,完成请求操作
|
远程服务器做出响应后,客户软件将结果返回给应用程序

7.5.6 远程过程调用RPC(Remote Procedure Call)
NFS协议分为三个独立的部分:NFS协议本身、通用的远程过程调用RPC机制、通用的外部数据表示XDR(eXternal Data Representation)。
RPC和XDR都是为编程人员提供构造分布式程序的机制!
分开设计的目的:为了其他软件(包括应用程序和其他协议)也可使用RPC和XDR。
(一)远程过程调用RPC:
RPC机制隐藏了协议细节,使得编程者不需了解底层通信协议就可编写分布式程序!
例如:编程人员可将程序分成客户端和服务器端,他们使用NFS作为主要通信机制。

在客户端,编程者指明远程过程,迫使编译器将RPC代码合并到远程过程中
|
在服务器端,编程者实现所需的过程,并用其他RPC设施将过程声明为服务器的一部分
|
当客户程序调用一个远程过程时,RPC自动收集参数值,形成一个报文
|
再将报文送到远程服务器,然后等待响应
|
最后在指定参数中存储返回值。

(二)通用的外部数据表示XDR(eXternal Data Representation)
作用:为编程者提供了一种在异构机器间传递数据的方式,不需编程者书写转换硬件数据表示的过程!
例如:不是所有的计算机都用相同格式表示32位二进制整数,一些格式在最高内存地址存放最高位字节,而其他一些格式在最高地址存放最低位字节。
如果编程者只使用网络在不同机器间移动一个整数的各字节,并且对它们不进行重排,整数值就可能会改变。
解决:通过定义一种与机器无关的表示来解决此问题!
实现:
在通信信道的一端,发送程序调用XDR过程将本地硬件表示转换为与机器无关的表示!-数据传到通信信道的另一端,接收程序调用XDR过程将与机器无关的表示转换为机器的本地表示!
优点:将许多数据转换任务自动化,编程者不需人工键入XDR过程调用,只需让程序给XDR编译器提供需要转换数据的说明,编译器自动产生需要XDR库调用的程序。