TCP/IP基本原理 第九章 文件传输
本章学习要求: 掌握:FTP的概念 掌握:FTP的两种文件传输的数据格式 掌握:FTP的两种工作模式及其工作原理 掌握:FTP的连接 了解:TFTP协议的基本概念及其分组结构
9.1 FTP FTP的概念 FTP 是 TCP/IP 协议组中的协议之一,是File Transfer Protocol 的缩写。该协议是Internet文件传送的基础,它由一系列规格说明文档组成,目标是提高文件的共享性,提供非直接使用远程计算机,使存储介质对用户透明和可靠高效地传送数据。简单的说,FTP就是完成两台计算机之间的拷贝,从远程计算机拷贝文件至自己的计算机上,称之为“下载(download)”文件。若将文件从自己计算机中拷贝至远程计算机上,则称之为“上载(upload)”文件。在TCP/IP协议中,FTP标准命令TCP端口号为21,Port方式数据端口为20。 FTP服务器和客户端 同大多数Internet服务一样,FTP也是一个客户/服务器系统。用户通过一个客户机程序连接至在远程计算机上运行的服务器程序。依照 FTP 协议提供服务,进行文件传送的计算机就是 FTP 服务器,而连接FTP服务器,遵循FTP协议与服务器传送文件的电脑就是FTP客户端。用户要连上 FTP 服务器,就要用到 FPT 的客户端软件,通常 Windows自带“ftp”命令,这是一个命令行的 FTP 客户程序,另外常用的 FTP 客户程序还有 CuteFTP、Ws_FTP、Flashfxp、LeapFTP、流星雨-猫眼等。
FTP用户授权 用户授权:要连上 FTP 服务器(即“登录”),只有在有了一个用户标识和一个口令后才能登陆FTP服务器,享受FTP服务器提供的服务。 FTP地址格式: ftp://用户名:密码@FTP服务器IP或域名...路径/文件名 上面的参数除FTP服务器IP或域名为必要项外,其他都不是必须的。如以下地址都是有效FTP地址: ftp://foolish.6600.org ftp://list:list@foolish.6600.org ftp://list:list@foolish.6600.org:2003 ftp://list:list@foolish.6600.org:2003/soft/list.txt 匿名FTP:互连网中有很大一部分 FTP 服务器被称为“匿名” (Anonymous) FTP 服务器。它不要求用户事先在该服务器进行登记注册,也不用取得FTP服务器的授权。Anonymous(匿名文件传输)能够使用户与远程主机建立连接并以匿名身份从远程主机上拷贝文件,而不必是该远程主机的注册用户。用户使用特殊的用户名“anonymous”登录FTP服务,就可访问远程主机上公开的文件。虽然目前使用WWW环境已取代匿名FTP成为最主要的信息查询方式,但是匿名FTP仍是 Internet上传输分发软件的一种基本方法。
9.1.1 FTP文件传输的数据格式 假设两台计算机通过ftp协议对话,并且能访问Internet,就可以用ftp命令来传输文件。每种操作系统使用上有某一些细微差别,但是每种协议基本的命令结构是相同的。FTP的文件传输有两种数据格式:ASCII传输格式和二进制数据传输格式。 ASCII传输格式:用于传输ASCII码文本,如果在远程机器上运行的不是UNIX,当文件传输时ftp通常会自动地调整文件的内容以便于把文件解释成另外那台计算机存储文本文件的格式。 如果用户传输的文件不是文本文件,在拷贝任何非文本文件之前,用binary 命令告诉ftp逐字拷贝,不要对这些文件进行处理,这也是下面要讲的二进制传输。 二进制传输格式:在二进制传输中,保存文件的位序,以便原始和拷贝的是逐位一 一 对应的。即使目的地机器上包含位序列的文件是没意义的。 如果你在ASCII方式下传输二进制文件,即使不需要也仍会转译。这会使传输稍微变慢 ,也会损坏数据,使文件变得不能用。(在大多数计算机上,ASCII方式一般假设每一字符的第一有效位无意义,因为ASCII字符组合不使用它。
9.1.2 FTP的工作方式 FTP支持两种模式,一种方式叫做Standard (也就是 PORT方式,主动方式),一种是 Passive (也就是PASV,被动方式)。 Standard模式 FTP的客户端发送 PORT 命令到FTP服务器。Passive模式FTP的客户端发送 PASV命令到 FTP Server。下面介绍一个这两种方式的工作原理: Port模式FTP 客户端首先和FTP服务器的TCP 21端口建立连接,通过这个通道发送命令,客户端需要接收数据的时候在这个通道上发送PORT命令。 PORT命令包含了客户端用什么端口接收数据。在传送数据的时候,服务器端通过自己的TCP 20端口连接至客户端的指定端口发送数据。 FTP server必须和客户端建立一个新的连接用来传送数据。 Passive模式在建立控制通道的时候和Standard模式类似,但建立连接后发送的不是Port命令,而是Pasv命令。FTP服务器收到Pasv命令后,随机打开一个高端端口(端口号大于1024)并且通知客户端在这个端口上传送数据的请求,客户端连接FTP服务器此端口,然后FTP服务器将通过这个端口进行数据的传送,这个时候FTP server不再需要建立一个新的和客户端之间的连接。
9.1.3 FTP服务命令 FTP服务命令定义用户请求的文件传输或文件系统功能。此命令的参数通常是路径名,其语法要和服务器的规范一致。推荐的默认值是最近指定的设备目录或目录。命令顺序通常没有限制,只有“rename from”命令后面必须是“rename to”,重新启动命令后面必须是中断服务命令。服务命令的响应通常在数据连接上传输。下面是具体的命令: 获得文件(RETR) :使服务器DTP传送指定路径内的文件复制到服务器或用户DTP。服务器上文件的状态和内容不受影响。 保存(STOR) :使服务器DTP接收数据连接上传送过来的数据,并将数据保存在服务器的文件中。如果文件已存在,原文件将被覆盖。如果文件不存在,则新建文件。 唯一保存(STOU) :此命令和STOR差不多,要求在此目录下的文件名是唯一的,对此命令的响应必须包括产生的用户名。 附加(APPE) :它和STOR的功能差不多,但是如果文件在指定路径内已存在,则把数据附加到原文件尾部,如果不存在则新建文件。
分配(ALLO) :此命令用于在主机上为新传送的文件分配足够的存储空间。参数是十进制的逻辑字节数。如果是记录或页结构,页或记录的最大大小也需要,这在第二个参数内以十进制指定。第二个参数是可选的,如果有它,它和第一个参数以Telnet字符 R 分隔。此命令在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形式传送,并以或分隔。这里返回的信息有时可以供程序进行进一步处理。 站点参数(SITE):服务器用来提供服务器系统信息,信息因系统不同而不同,格式在HELP SITE命令应答中给出。 系统(SYST) :用于确定服务器上运行的操作系统。
帮助(HELP):这条命令我们在平常系统中得到的帮助没有什么区别,响应类型是211或214。建议在使用USER命令前使用此命令。 状态(STAT) :此命令返回控制连接状态,它可以在文件传送过程中发送,服务器返回操作进行的状态。也可以在文件传送之间发送,这时命令有参数,参数是路径名,此命令的功能除了数据在控制连接上传送以外和列表命令相似。如果指定部分路径,服务器以文件名或与说明相关的属性返回;如没有参数,服务器返回服务器FTP进程的状态信息,包括传输参数的当前值和连接状态。 帮助(HELP):这条命令我们在平常系统中得到的帮助没有什么区别,响应类型是211或214。建议在使用USER命令前使用此命令。 等待(NOOP):此命令不产生什么实际动作,它仅使服务器返回OK。 FTP在控制连接上使用Telnet通信,FTP命令可分为访问控制标记,数据传输参数或FTP服务请求,特定的命令(如ABOR,STAT)可以在数据传输过程中在控制连接上传输。有些服务器不能同时监视数据和控制链路,那就要另外采取措施了。请注意下面的几点建议: 用户系统将Telnet的“Interrupt Process”(IP)信息插入Telnet流; 用户系统发送Telnet的“Synch”信号; 用户系统将命令(如ABOR)插入Telnet流; 服务器PI在接收到IP后,在Telnet流中寻找仅有一个的FTP命令。
9.1.4 FTP客户和服务器连接 我们以标准的FTP端口号为例,介绍 FTP客户和服务器连接过程。 首先,FTP并不像HTTP协议那样,只需要一个端口作为连接(HTTP的默认端口是80,FTP的默认端口是21),FTP需要2个端口,一个端口是作为控制连接端口,也就是21这个端口,用于发送指令给服务器以及等待服务器响应;另一个端口是数据传输端口,端口号为20(仅PORT模式),是用来建立数据传输通道的,主要有3个作用: 从客户向服务器发送一个文件。 从服务器向客户发送一个文件。 从服务器向客户发送文件或目录列表。 其次,FTP的连接模式有两种,PORT和PASV。PORT模式是一个主动模式,PASV是被动模式,这里都是相对于服务器而言的。为了让大家清楚的认识这两种模式,分别举例说明。
图1:FTP客户使用FTP命令建立于服务器的连接 图2:用netstat命令查看,控制信道被建立在客户机的6015和服务器的20端口 PORT模式 当FTP客户以PORT模式连接服务器时,他动态的选择一个端口号(本次试验是6015)连接服务器的21端口,注意这个端口号一定是1024以上的,因为1024以前的端口都已经预先被定义好,被一些典型的服务使用,当然有的还没使用,保留给以后会用到这些端口的资源服务。当经过TCP的三次握手后,连接(控制信道)被建立(如图1和图2)。 图1:FTP客户使用FTP命令建立于服务器的连接 图2:用netstat命令查看,控制信道被建立在客户机的6015和服务器的20端口
图3:ls命令是一个交互命令,它会首先与服务器建立一个数据 现在用户要列出服务器上的目录结构(使用ls或dir命令),那么首先就要建立一个数据通道,因为只有数据通道才能传输目录和文件列表,此时用户会发出PORT指令告诉服务器连接自己的什么端口来建立一条数据通道(这个命令由控制信道发送给服务器),当服务器接到这一指令时,服务器会使用20端口连接用户在PORT指令中指定的端口号,用以发送目录的列表(如图3)。 图3:ls命令是一个交互命令,它会首先与服务器建立一个数据 传输通道。经验证本次试验客户机使用6044端口
图4:使用netstat命令验证上一次使用ls命令建立的数据传输通道已经关闭 当完成这一操作时,FTP客户也许要下载一个文件,那么就会发出get指令,请注意,这时客户会再次发送PORT指令,告诉服务器连接他的哪个"新"端口,你可以先用netstat -na这个命令验证,上一次使用的6044已经处于TIME_WAIT状态(如图4)。 图4:使用netstat命令验证上一次使用ls命令建立的数据传输通道已经关闭 当这个新的数据传输通道建立后(在微软的系统中,客户端通常会使用连续的端口,也就是说这一次客户端会用6045这个端口),就开始了文件传输的工作。
PASV模式 在初始化连接服务器这个过程和PORT模式是一样的,不同的是,当FTP客户发送ls、dir、get等这些要求数据返回的命令时,他不向服务器发送PORT指令而是发送PASV指令,在这个指令中,用户告诉服务器自己要连接服务器的某一个端口,如果这个服务器上的这个端口是空闲的可用的,服务器会返回ACK的确认信息,之后数据传输通道被建立并返回用户所要的信息(根据用户发送的指令,如ls、dir、get等);如果服务器的这个端口被另一个资源所使用,那么服务器返回UNACK的信息,那么这时,FTP客户会再次发送PASV命令,这也就是所谓的连接建立的协商过程。为了验证这个过程我们不得不借助CuteFTP Pro这个常用FTP客户端软件,因为微软自带的FTP命令客户端,不支持PASV模式。虽然你可以使用QUOTE PASV这个命令强制使用PASV模式,但是当你用ls命令列出服务器目录列表,你会发现它还是使用PORT方式来连接服务器的。现在我们使用CUTEFTP Pro以PASV模式连接服务器。请注意连接LOG里这几句话: COMMAND:> PASV 227 Entering Passive Mode (127,0,0,1,26,108) COMMAND:> LIST STATUS:> Connecting ftp data socket 127.0.0.1: 6764... 125 Data connection already open; Transfer starting. 226 Transfer complete.
其中,227 Entering Passive Mode (127,0,0,1,26,80) 其中,227 Entering Passive Mode (127,0,0,1,26,80). 代表客户机使用PASV模式连接服务器的26x256+108=6764端口。(当然服务器要支持这种模式)125 Data connection already open; Transfer starting.说明服务器的这个端口可用,返回ACK信息。 再让我们看看用CUTEFTP Pro以PORT模式连接服务器的情况。其中在LOG里有这样的记录: 其中: PORT 127,0,0,1,28,37告诉服务器当收到这个PORT指令后,连接FTP客户的28x256+37=7205这个端口。 Accepting connection: 127.0.0.1:20表示服务器接到指令后用20端口连接7205端口,而且被FTP客户接受 COMMAND:> PORT 127,0,0,1,28,37 200 PORT command successful. COMMAND:> LIST 150 Opening ASCII mode dataconnection for /bin/ls. STATUS:> Accepting connection: 127.0.0.1:20. 226 Transfer complete. STATUS:> Transfer complete.
9.1.6 FTP应答 FTP命令的响应是为了对数据传输请求和过程进行同步,也是为了让用户了解服务器的状态。每个命令必须有最少一个响应,如果是多个,它们要易于区别。有些命令是有顺序性的,因此其中任何一个命令的失败会导致从头开始。 FTP响应由三个数字构成,后面是一些文本。数字带有足够的信息命名用户PI不用检查文本就知道发生了什么。文本信息与服务器相关,用户可能得到不同的文本信息。文本和数字以间隔,文本后以Telnet行结束符结束。
三位数字每位都有一定的意义,第一位确定响应是好的,坏的还是不完全的,通过检查第一位,用户进程通常就能够知道大致要采取什么行动了。如果用户程序希望了解出了什么问题,可以检查第二位,第三位留表示其它信息。第一位有五个值: 1. 确定预备应答 请求的操作正在被初始化;在进入下一个命令前等待另外的应答。这类响应用于说明命令被接受,在实现中如何同步监视有困难,用户进程现在可以关注数据连接了。服务器FTP进程对第个命令几乎都返回1yz响应。 2. 确定完成应答 要求的操作已经完成,可以执行新命令。 3. 确定中间应答 命令已接受,但要求的操作被停止,停止接收更新的信息。 4. 暂时拒绝完成应答 未接受命令,要求的操作未执行,但错误是临时的,过一会儿可以再次发送消息。用户应该返回命令序列的开始。这个暂时可是不好确定,此命令的意思就是让用户进程再次尝试使用此命令。
5. 永远拒绝完成应答 它与暂时拒绝完成应答的区别就在于错误条件是一时半会不会消失。下面我们来看看第二位所代表的意义: 0. 格式错误; 1. 此类应答是为了请求信息的; 2. 此类应答是关于控制和数据连接的; 3. 关于认证和帐户登录过程; 4. 未使用; 5. 此类应答是关于文件系统的; 第三个数字是在第二个数字的基础上对应答内容的进一步细化。一般来说,数字代码后要有文本信息。实现时应该尽量使用现有的代码,而不要随便添加新的意义不大的代码。 下面我们根据数字顺序列出各个应答码及其意义:
226 关闭数据连接,请求的文件操作成功 227 进入被动模式 应答码 具体含义 110 重新启动标记应答。在这种情况下文本是确定的,它必须是:MARK yyyy=mmmm,其中yyyy是用户进程数据流标记,mmmm是服务器标记。 120 服务在nnn分钟内准备好 125 数据连接已打开,准备传送 150 文件状态良好,打开数据连接 200 命令成功 202 命令未实现 211 系统状态或系统帮助响应 212 目录状态 213 文件状态 214 帮助信息,信息仅对人类用户有用 215 名字系统类型 220 对新用户服务准备好 221 服务关闭控制连接,可以退出登录 225 数据连接打开,无传输正在进行 226 关闭数据连接,请求的文件操作成功 227 进入被动模式
426 450 451 452 应答码 具体含义 230 用户登录 500 格式错误,命令不可识别 250 请求的文件操作完成 501 参数语法错误 257 创建"PATHNAME" 502 命令未实现 331 用户名正确,需要口令 503 命令顺序错误 332 登录时需要帐户信息 504 此参数下的命令功能未实现 350 请求的文件操作需要进一步命令 530 未登录 421 不能提供服务,关闭控制连接 532 存储文件需要帐户信息 425 不能打开数据连接 550 未执行请求的操作 426 关闭连接,中止传输 551 请求操作中止:页类型未知 450 请求的文件操作未执行 552 请求的文件操作中止,存储分配溢出 451 中止请求的操作:有本地错误 553 未执行请求的操作:文件名不合法 452 未执行请求的操作:系统存储空间不足
9.2 普通文件传输协议TFTP TFTP是网络应用程序,它比FTP简单也比FTP功能少。它在不需要用户权限或目录可见的情况下使用。它使用UDP协议而不是TCP协议,TFTP在RFC 1350内得到详细说明 。计算机、网络设备或外围设备,可能需要在不使用FTP建立控制或数据连接时情况下传输小文件。例如打印机、集线器或交换机等硬件设备在启动时可能需要从服务器上下载固件信息,无盘计算机可能需要从服务器上下载自举系统文件。在这些情况下,在无连接UDP协议上实现的普通文件传输协议是最好的选择。普通文件传输协议(TFTP:Trivial File Transfer Protocol )提供了这样的简单文件传输机制。 9.2.1 TFTP的分组结构 我们先了解TFTP分组的结构,它是该协议中的基本数据传输单元。TFTP分组按照结构的不同有5种分类方法。前两种类型是读请求分组和写请求分组。读请求分组或写请求分组是在连续分组流中发送的初始分组。当客户端需要从服务器下载文件时,就向服务器发送一个读请求分组。当客户端需要向服务器传输文件时,就向服务器发送一个写请求分组。第三种分组类型被称为数据分组,它携带着客户端计算机或设备所需的实际数据。连接在一起的设备还交换确认分组,即第四种分组类型。为了表示错误的发生,可以在设备间交换第5种分组类型,即错误分组。
Mode:数据模式。协议传输的文件数据格式。可以是 NetASCII,也可以是标准 ASCII,八位二进制数据或邮件标准 ASCII。 基本 TFTP 协议头结构 16 bits String 16bits Opcode Filename Mode Filename:传送的字段名称。 Mode:数据模式。协议传输的文件数据格式。可以是 NetASCII,也可以是标准 ASCII,八位二进制数据或邮件标准 ASCII。 Opcode对应的 TFTP 命令 opcode 命令 描述 1 Read RequestRequest to read a file 2 Write Request Request to write to a file 3 File Data Transfer Transfer of file data 4 Data Acknowledge Acknowledgement of file data 5 Error Error indication
所有分组类型都有一个操作码(Opcode)字段,里面包含一个表示该分组性质的数字值。 数据分组包含了一个被称为块号门lock Number)的附加字段,该字段通过指定一个块号来惟一标识分组。除了块号字段外,数据分组还包含存储了传输所需数据的数据字段。确认分组也包含块号字段,以表示有着相同块号的特定数据分组已经被确认了。确认分组中的操作码字段表示该分组的性质。错误分组除了包含操作码字段,还包括一个错误码(Error code)字段和一个错误报文(Error Message)字段。 在TFTP中实现的文件传输过程非常简单。首先,客户端设备向服务器发送一个读或写请求分组,以表示客户端需要读或者写一个特定的文件。接着,实际的传输过程通过交换数据分组而实现。各个分组一经收到就被确认。如果分组的确认没有在指定的时间内到达,服务器和客户端上的定时器将控制数据分组的重传。如果在传输过程中出现了错误,就通过错误报文分组来通告错误报文。
9.2.2与其它协议的联系 因为TFTP使用UDP,而UDP使用IP,IP可以还使用其它本地通信方法。因此一个TFTP包中会有以下几段:本地媒介头,IP头,数据报头,TFTP头,剩下的就是TFTP数据了。TFTP在IP头中不指定任何数据,但是它使用UDP中的源和目标端口以及包长度域。由TFTP使用的包标记(TID)在这里被用做端口,因此TID必须介于0到65,535之间。对它的初始化我们在后面讨论。TFTP头中包括两上字节的操作码,这个码指出了包的类型下面我们看看大体上的TFTP包格式,相关的内容我们在后面的章节中进行讨论。 ------------------------------------------------------------ | Local Medium | Internet | Datagram | TFTP | ------------------------------------------------------------ 包头次序
9.3 网络文件访问 NFS在运行不同操作系统的计算机间提供了一种访问文件的无缝环境规范。这个协议的正式规范在RFC 1094中可以找到。RFC 1813中提出了NFS第三版,旨在实现基于Web的文件访问机制。 NFS最初是为了在运行UNIX操作系统,或Windows这样的操作系统的计算机之间建立连接而设计的。NFS由一些子协议组成,比如 NFS核心协议、外部数据表示(XDR) 则和远程过程调用(RPC)。 当计算机访问另一台机器上的文件时,它使用NFS客户端以RPC数据分组的形式来发送请求,其中这些RPC分组包含在KP段或UDP数据报中。RPC分组是NFS应用提供给传输层协议的数据单元。在将请求打包成RPC分组之前,客户端通过向服务器发送一个请求来获取一个与远程计算机通信的端口。接着,该请求的数据格式被XDR标准化成与传输兼容的格式。 在服务器端实现的过程与前面的相反。请求被重新格式化成与服务器兼容的数据格式。接着NFS服务器在服务器硬盘上找出被请求文件的位置,并向服务器的文件系统返回一个文件句柄。客户端用这个文件句柄来访问服务器上的文件。当用户试图访问运行着不同操作系统的远程计算机上的文件时,底层的NFS实现过程是不可见的,并且用户能像访问本地硬盘一样访问和使用远程文件。
9.3.1 NFS核心协议 在提供文件访问的过程中,Mount协议和其他NFS组件一起扮演了一个非常重要的角色,这些组件包括端口映射器(Port Mapping)和文件句柄。Mount协议实际上就是一个管理机制,它使用端口映射器和文件句柄去访问远程计算机文件系统。端口映射器是一个端口注册机制,用来让服务器注册自己的暂态端口。这个注册过程对于从客户端计算机上访问服务器文件系统来说必不可少。 文件句柄可以描述成一个客户端访问远程服务器文件系统的指针。句柄代表了客户端计算机上的服务器文件系统。客户端计算机上的Mount协议通过获取服务器端口号和服务器句柄来访问服务器文件系统。这是一个简单的使用LJDP的事务实现过程。 服务器上的端口映射器在服务器上注册一个文件访问必须用的端口。当客户端计算机上的用户需要访问远程计算机上的文件时,NFS的Mount协议向服务器请求一个端口号,以获取服务器上注册的端口号。服务器通过向客户端发送端口号来做出回应。紧接着客户端Mount协议请求一个文件句柄,用它来表示服务器文件系统。当服务器返回了文件句柄时,客户端就可以使用该句柄来通过端口访问文件了。下图说明了 Mount协议如何利用端口映射器和文件句柄来访问远程文件。
在开始真正的文件传输过程之前,需要考虑连接计算机的数据格式。为了管理各种数据格式,NFS提供了XDR以转换在计算机间交换的数据。在网络上传输数据前,XDR首先将数据转换成标准的格式。接收端计算机上的XDR确保将传人的数据转换成与本地文件系统兼容的格式。 Mount 文件句柄 端口映射器 启动时注册端口 客户机 服务器
本章习题 参见教师网页:http://staff.ustc.edu.cn/~leeyi