NFS各个版本之间的比较

        NFS是一种网络文件系统,从1985年推出至今,共发布了3个版本:NFSv2、NFSv3、NFSv4,NFSv4包含两个次版本NFSv4.0和NFSv4.1。经过20多年发展,NFS发生了非常大的变化,最大的变化就是推动者从Sun变成了NetApp,NFSv2和NFSv3基本上是Sun起草的,NetApp从NFSv4.0参与进来,并且主导了NFSv4.1标准的制定过程,而Sun已经被Oracle收购了。

编号版本RFC时间页数
1NFSv2rfc10941989年3月27页
2NFSv3rfc18131995年6月126页
3NFSv4.0rfc35302003年4月275页
4NFSv4.1rfc56612010年1月617页

1. NFSv2

NFSv2是第一个以RFC形式发布的版本,实现了基本的功能。


2. NFSv3

NFSv3是1995年发布的,这时NFSv2已经发布了6年了,NFSv3修正了NFSv2的一些bug。两者有如下一些差别,但是感觉没有本质的差别。

(1) NFSv2对每次读写操作中传输数据的最大长度进行了限制,上限值为8192字节,NFSv3取消了这个限制。

(2) NFSv3对文件名称长度进行了限制,上限值为255字节,NFSv3取消了这个限制。

(3) NFSv2对文件长度进行了限制,上限值为0x7FFFFFFF,NFSv3取消了这个限制。

(4) NFSv2中文件句柄长度固定为32字节,NFSv3中文件句柄长度可变,上限值是64字节。

(5) NFSv2只支持同步写,如果客户端向服务器端写入数据,服务器必须将数据写入磁盘中才能发送应答消息。NFSv3支持异步写操作,服务器只需要将数据写入缓存中就可以发送应答信息了。NFSv3增加了COMMIT请求,COMMIT请求可以将服务器缓存中的数据刷新到磁盘中。

(6) NFSv3增加了ACCESS请求,ACCESS用来检查用户的访问权限。因为服务器端可能进行uid映射,因此客户端的uid和gid不能正确反映用户的访问权限。NFSv2的处理方法是不管访问权限,直接返送请求,如果没有访问权限就出错。NFSv3中增加了ACCESS请求,客户端可以检查是否有访问权限。

(7) 一些请求调整了参数和返回信息,毕竟NFSv3和NFSv2发布的间隔有6年,经过长期运行可能觉得NFSv2某些请求参数和返回信息需要改进。


3. NFSv4.0

相比NFSv3,NFSv4发生了比较大的变化,最大的变化是NFSv4有状态了。NFSv2和NFSv3都是无状态协议,服务区端不需要维护客户端的状态信息。无状态协议的一个优点在于灾难恢复,当服务器出现问题后,客户端只需要重复发送失败请求就可以了,直到收到服务器的响应信息。但是某些操作必须需要状态,如文件锁。如果客户端申请了文件锁,但是服务器重启了,由于NFSv3无状态,客户端再执行锁操作可能就会出错了。NFSv3需要NLM协助才能实现文件锁功能,但是有的时候两者配合不够协调。NFSv4设计成了一种有状态的协议,自身实现了文件锁功能,就不需要NLM协议了。NFSv4和NFSv3的差别如下:

(1) NFSv4设计成了一种有状态的协议,自身实现了文件锁功能和获取文件系统根节点功能,不需要NLM和MOUNT协议协助了。

(2) NFSv4增加了安全性,支持RPCSEC-GSS身份认证。

(3) NFSv4只提供了两个请求NULL和COMPOUND,所有的操作都整合进了COMPOUND中,客户端可以根据实际请求将多个操作封装到一个COMPOUND请求中,增加了灵活性。

(4) NFSv4文件系统的命令空间发生了变化,服务器端必须设置一个根文件系统(fsid=0),其他文件系统挂载在根文件系统上导出。

(5) NFSv4支持delegation。由于多个客户端可以挂载同一个文件系统,为了保持文件同步,NFSv3中客户端需要经常向服务器发起请求,请求文件属性信息,判断其他客户端是否修改了文件。如果文件系统是只读的,或者客户端对文件的修改不频繁,频繁向服务器请求文件属性信息会降低系统性能。NFSv4可以依靠delegation实现文件同步。当客户端A打开一个文件时,服务器会分配给客户端A一个delegation。只要客户端A具有delegation,就可以认为与服务器保持了一致。如果另外一个客户端B访问同一个文件,则服务器会暂缓客户端B的访问请求,向客户端A发送RECALL请求。当客户端A接收到RECALL请求时将本地缓存刷新到服务器中,然后将delegation返回服务器,这时服务器开始处理客户端B的请求。

(6) NFSv4修改了文件属性的表示方法。由于NFS是Sun开发的一套文件系统,设计之出NFS文件属性参考了UNIX中的文件属性,可能Windows中不具备某些属性,因此NFS对操作系统的兼容性不太好。NFSv4将文件属性划分成了三类:

        Mandatory Attributes: 这是文件的基本属性,所有的操作系统必须支持这些属性。

        Recommended Attributes: 这是NFS建议的属性,如果可能操作系统尽量实现这些属性。

        Named Attributes: 这是操作系统可以自己实现的一些文件属性。


4. NFSv4.1

        与NFSv4.0相比,NFSv4.1最大的变化是支持并行存储了。在以前的协议中,客户端直接与服务器连接,客户端直接将数据传输到服务器中。当客户端数量较少时这种方式没有问题,但是如果大量的客户端要访问数据时,NFS服务器很快就会成为一个瓶颈,抑制了系统的性能。NFSv4.1支持并行存储,服务器由一台元数据服务器(MDS)和多台数据服务器(DS)构成,元数据服务器只管理文件在磁盘中的布局,数据传输在客户端和数据服务器之间直接进行。由于系统中包含多台数据服务器,因此数据可以以并行方式访问,系统吞吐量迅速提升。

  • 10
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
CruiseYoung提供的带有详细书签的电子书籍目录 http://blog.csdn.net/fksec/article/details/7888251 该资料《TCP/IP网络互联技术(卷3):客户-服务器编程与应用(Windows套接字版)》的源代码见: http://download.csdn.net/detail/fksec/4639930 TCP/IP网络互联技术(卷3):客户-服务器编程与应用(Windows套接字版) 基本信息 原书名: Internetworking with TCP/IP Vol III:Client-Server Programming and Applications Windows Sockets Version 原出版社: Prentice Hall/Pearson 作者: (美)Douglas E.Comer,David L.Stevens 译者: 张卫 王能 丛书名: 国外经典教材·计算机科学与技术 出版社:清华大学出版社 ISBN:7302093792 上架时间:2004-11-10 出版日期:2004 年9月 开本:185×260 页码:446 版次:1-1 内容简介    本书介绍了在Windows操作系统平台上如何使用Windows套接字应用程序接口(Windows Socket APl)编写TCP/IP通信程序。重点放在客户—服务器机制上,介绍了客户-服务器机制和应用程序用于网络通信的套接字接口,分析了分布式程序的客户端和服务器两部分的算法,讨论了客户端和服务器的设计及遵循的模式。本书在并发处理上也花费了相当大的篇幅,描述了并发线程以及相关的创建线程的操作系统函数。本书给出了能说明每个设计思想的实现方法,讨论了包括应用层网关和管道在内的各种技术,回顾了几个标准应用协议,并使用它们说明一些算法和实现技术。本书包含的一些例子程序显示了每个设计实际上如何操作,大多数的例子实现了标准因特网应用协议。    本书适合于大学高年级学生或研究生的网络编程入门课程,也可作为程序员的参考书。    作译者 作者:Douglas E.Comer    Douglas Comer博博士是Purdue Univ的教授,讲授操作系统和计算机网络的课程,早在20世纪70午代后期。他就参与了TCP/IP和互联网的研究,并成为世界公认的权威,由他设计实现了X25NET和CYpress网络.以及Xinu操作系统。David Stevens是普渡大学计算中心的程序员。TCP/IP的世界经典教材就是他们所著,他们的著作已誉满全球,我国多家出版社也引进了其多部著作的版权。他们的TCP/IP网络互联技术卷1、卷2、卷3在我国都有影印版本。    Douglas E.Comer博士从20世纪70年代开始从事互联网的研究和开发工作,他曾是互联网体系结构委员会的成员,该委员会是确定互联网发展标准的权威机构;他也曾任美国计算机网CSTNET技术委员会的主席,该网络是美国早期互联网建设中最重要的网络之一。他现在是美国普渡大学计算机科学系的教授,从事计算机网络和操作系统方面的教学和科研工作。 目录 封面 -26 扉页 -25 版权 -24 国外经典教材.计算机科学与技术 编审委员会 -23 出版说明 -22 译者的话 -21 序一 -20 序二 -19 目录 -17 第1章 概述 1 1.1 TCP/IP的应用 1 1.2 分布式环境下应用程序的设计 1 1.3 标准和非标准的应用协议 2 1.4 使用标准应用协议的例子 2 1.5 telnet连接的例子 3 1.6 用TELNET访问其他服务 3 1.7 应用协议和软件的灵活性 4 1.8 从提供者的角度看服务 5 1.9 本书的其余部分 6 1.10 小结 6 进一步的研究 6 习题 6 第2章 客户.服务器模型和软件的设计 8 2.1 简介 8 2.2 动机 8 2.3 术语和概念 9 2.3.1 客户端和服务器 9 2.3.2 特权和复杂性 9 2.3.3 标准和非标准的客户端软件 10 2.3.4 客户端的参数化 10 2.3.5 无连接的与面向连接的服务 11 2.3.6 无状态与有状态的服务器 12 2.3.7 有状态的文件服务器例子 12 2.3.8 无状态是一个协议问题 14 2.3.9 充当客户端的服务器 15 2.4 小结 15 进一步的研究 16 习题 16 第3章 客户.服务器软件的并发处理 17 3.1 引言 17 3.2 网络中的并发 17 3.3 服务器中的并发 18 3.4 术语和概念 19 3.4.1 进程的概念 19 3.4.2 线程 20 3.4.3 程序和线程 21 3.4.4 过程调用 21 3.5 一个创建并发线程的例子 22 3.5.1 一个顺序执行的C的示例 22 3.5.2 程序的并发版本 23 3.5.3 时间片 25 3.6 分离的线程 26 3.7 上下文切换和协议软件设计 27 3.8 并发和异步I/O 27 3.9 UNIX下的并发 28 3.10 执行一个单独编译的程序 29 3.11 小结 30 进一步的研究 30 习题 30 第4章 协议的程序接口 32 4.1 引言 32 4.2 宽松定义的协议软件接口 32 4.3 接口功能 33 4.4 概念性接口的规范 33 4.5 API的实现 34 4.6 网络通信的两种基本方法 36 4.7 ANSI C中提供的基本I/O函数 36 4.8 UNIX套接字API的历史 37 4.9 小结 38 进一步的研究 38 习题 38 第5章 套接字API 40 5.1 简介 40 5.2 套接字的历史 40 5.3 一个协议接口的制订 41 5.4 套接字的抽象 41 5.4.1 套接字描述符 41 5.4.2 套接字的系统数据结构 42 5.4.3 使用套接字 43 5.5 指定端点地址 43 5.6 通用地址结构 44 5.7 套接字API中的函数 45 5.7.1 WSAStartup函数 46 5.7.2 WSACleanup函数 46 5.7.3 Socket函数 46 5.7.4 connect函数 46 5.7.5 send函数 46 5.7.6 recv函数 47 5.7.7 closesocket函数 47 5.7.8 bind函数 47 5.7.9 listen函数 48 5.7.10 accept调用 48 5.7.11 TCP套接字调用小结 48 5.8 用于整数转换的实用例程 49 5.9 程序中使用套接字调用 49 5.10 用作套接字调用参数的符号常量 50 5.11 小结 51 进一步的研究 51 习题 51 第6章 客户软件设计中的算法和问题 53 6.1 引言 53 6.2 学习算法而不研究细节 53 6.3 客户体系结构 54 6.4 标识服务器的地址 54 6.5 分析地址参数 55 6.6 查找域名 56 6.7 由名字查找熟知端口 57 6.8 端口号和网络字节顺序 58 6.9 由名字查找协议 58 6.10 TCP客户算法 59 6.11 分配套接字 59 6.12 选择本地协议端口号 60 6.13 选择本地IP地址的一个基本问题 60 6.14 将TCP套接字连接到服务器 61 6.15 使用TCP和服务器通信 61 6.16 从TCP连接上读取响应 62 6.17 关闭TCP连接 63 6.17.1 需要部分关闭 63 6.17.2 部分关闭的操作 63 6.18 UDP客户端的编程 64 6.19 面向连接的和无连接的UDP套接字 64 6.20 对UDP使用connect 65 6.21 使用UDP和服务器通信 65 6.22 关闭使用UDP的套接字 65 6.23 对UDP的部分关闭 65 6.24 关于UDP不可靠性的警告 66 6.25 小结 66 进一步的研究 67 习题 67 第7章 客户软件举例 68 7.1 引言 68 7.2 小例子的重要性 68 7.3 隐藏细节 68 7.4 客户程序的过程库例子 69 7.5 ConTCP的实现 70 7.6 ConUPD的实现 70 7.7 用来建立连接的过程 71 7.8 使用例子库 74 7.9 DAYTIME服务 74 7.10 DAYTIME的TCP客户实现 75 7.11 从TCP连接上读取数据 76 7.12 TIME服务 77 7.13 访问TIME服务 77 7.14 精确的时间和网络时延 78 7.15 TIME服务的UDP客户 78 7.16 ECHO服务 80 7.17 ECH0服务的TCP客户 81 7.18 ECHO服务的UDP客户 83 7.19 小结 85 进一步的研究 85 习题 86 第8章 服务器软件设计的算法和问题 87 8.1 引言 87 8.2 概念性的服务器算法 87 8.3 并发服务器和循环服务器 87 8.4 面向连接的访问和无连接的访问 88 8.5 面向连接的服务器 88 8.6 无连接的服务器 89 8.7 故障、可靠性和无状态 90 8.8 优化无状态服务器 90 8.9 四种基本类型的服务器 92 8.10 请求处理时间 93 8.11 循环服务器的算法 94 8.12 循环的、面向连接的服务器算法 94 8.13 用INADDR_ANY绑定熟知地址 94 8.14 将套接字设置为被动模式 95 8.15 接受连接并使用这些连接 95 8.16 循环的、无连接的服务器算法 95 8.17 在无连接的服务器上构造响应地址 96 8.18 并发服务器的算法 97 8.19 主线程和子线程 97 8.20 并发的、无连接的服务器的算法 98 8.21 并发的、面向连接的服务器算法 98 8.22 用分离的程序作为子进程 99 8.23 使用单个线程实现表面上的并发性 99 8.24 各服务器类型的使用场合 100 8.25 服务类型小结 101 8.25.1 循环的、无连接的服务器 101 8.25.2 循环的、面向连接的服务器 101 8.25.3 并发的、无连接的服务器 101 8.25.4 并发的、面向连接的服务器 101 8.26 重要的服务器死锁的问题 102 8.27 其他的实现方法 103 8.28 小结 103 进一步的研究 103 习题 104 第9章 循环无连接服务器(UDP) 105 9.1 引言 105 9.2 创建被动套接字 105 9.3 线程结构 108 9.4 TIME服务器举例 109 9.5 小结 111 进一步的研究 111 习题 111 第10章 循环的、面向连接的服务器(TCP) 112 10.1 引言 112 10.2 分配被动的TCP套接字 112 10.3 实现DAYTIME服务的服务器 113 10.4 线程结构 113 10.5 DAYTIME服务器举例 114 10.6 关闭连接 116 10.7 连接终止和服务器的脆弱性 117 10.8 小结 117 进一步的研究 118 习题 118 第11章 并发的、面向连接的服务器(TCP) 119 11.1 引言 119 11.2 并发ECH0 119 11.3 循环的实现和并发的实现的比较 120 11.4 线程结构 120 11.5 并发的ECH0服务器举例 121 11.6 小结 124 进一步的研究 124 习题 124 第12章 单线程、并发服务器(TCP) 125 12.1 引言 125 12.2 服务器中的数据驱动处理 125 12.3 单线程的数据驱动处理 126 12.4 单线程服务器的线程结构 126 12.5 单线程ECH0服务器举例 127 12.6 小结 130 进一步的研究 130 习题 130 第13章 多协议服务器(TCP,UDP) 132 13.1 引言 132 13.2 减少服务器数量的动机 132 13.3 多协议服务器的设计 133 13.4 线程结构 133 13.5 多协议DAYTIME服务器举例 134 13.6 共享代码的概念 137 13.7 并发的多协议服务器 137 13.8 小结 138 进一步的研究 138 习题 138 第14章 多服务服务器(TCP,UDP) 139 14.1 引言 139 14.2 服务器程序的合并 139 14.3 无连接的、多服务服务器的设计 140 14.4 面向连接的、多服务服务器的设计 140 14.5 并发的、面向连接的、多服务服务器 141 14.6 单线程多服务服务器的实现 142 14.7 多服务服务器对其他单独程序的调用 143 14.8 多服务、多协议设计 144 14.9 一个多服务服务器的例子 144 14.10 静态的和动态的服务器配置 150 14.11 一个超级服务器的例子,Inetd 151 14.12 小结 153 进一步的研究 153 习题 153 第15章 服务器并发性的统一高效管理 155 15.1 引言 155 15.2 在循环设计和并发设计之间做出选择 155 15.3 并发等级 156 15.4 需求驱动的并发 156 15.5 并发的代价 157 15.6 额外开销和时延 157 15.7 小时延会出问题 157 15.8 线程预分配 159 15.8.1 预分配技术 159 15.8.2 面向连接的服务器的预分配 160 15.8.3 无连接服务器的预分配 161 15.8.4 预分配、突发通信量和NFS 161 15.8.5 多处理器上的预分配 162 15.9 延迟的线程分配 162 15.10 两种技术统一的基础 163 15.11 两种技术的结合 164 15.12 小结 164 进一步的研究 165 习题 165 第16章 客户端的并发 166 16.1 引言 166 16.2 并发的优点 166 16.3 运行控制的动机 167 16.4 与多个服务器的并发联系 167 16.5 实现并发的客户端 168 16.6 单线程实现 169 16.7 使用ECHO的并发客户端例子 170 16.8 并发客户端的执行 175 16.9 计时器的管理 176 16.10 输出举例 176 16.11 例子代码中的并发性 177 16.12 小结 177 习题 177 第17章 传输层和应用层的隧道技术 179 17.1 引言 179 17.2 多协议环境 179 17.3 混合各种网络技术 180 17.4 动态电路分配 181 17.5 封装和隧道技术 182 17.6 通过IP瓦联网的隧道技术 183 17.7 客户端和服务器之间的应用层隧道技术 183 17.8 隧道技术、封装以及拨号电话线 184 17.9 小结 185 进一步的研究 185 习题 186 第18章 应用层网关 187 18.1 引言 187 18.2 受限环境中的客户端与服务器 187 18.2.1 多重技术的现实 187 18.2.2 功能有限的计算机 188 18.2.3 安全性引发的连通性约束 188 18.3 使用应用网关 188 18.4 通过邮件网关的交互 189 18.5 邮件网关的实现 190 18.6 应用网关和隧道技术的比较 190 18.7 应用网关和功能受限的系统 192 18.8 为了安全性使用的应用网关 193 18.9 应用网关和额外跳问题 194 18.10 一个应用网关的例子 195 18.11 基于Web的应用网关的细节 196 18.12 调用CGI程序 197 18.13 RFC应用网关的URL 198 18.14 通用的应用网关 198 18.15 SLIRP的运行 199 18.16 SLIRP如何处理连接 199 18.17 IP寻址与SLlRP 200 18.18 小结 201 进一步的研究 201 习题 202 第19章 外部数据表示(XDR) 203 19.1 引言 203 19.2 计算机中数据的表示 203 19.3 N平方转换问题 204 19.4 网络标准字节序 205 19.5 外部数据表示事实上的标准 206 19.6 XDR数据类型 206 19.7 隐含类型 207 19.8 使用XDR的软件支持 207 19.9 XDR库例行程序 207 19.10 一次一部分地构建报文 208 19.11 XDR库的转换例行程序 209 19.12 XDR流、I/0和TCP 210 19.13 记录、记录边界和数据报I/O 211 19.14 小结 211 进一步的研究 212 习题 212 第20章 远程过程调用(RPC)的概念 213 20.1 引言 213 20.2 远程过程调用模型 213 20.3 构建分布式程序的两种模式 213 20.4 常规过程调用的概念模型 214 20.5 过程模型的扩充 215 20.6 常规过程调用的执行和返回 215 20.7 分布式系统中的过程模型 216 20.8 客户一服务器和RPC的相似性 217 20.9 作为程序的分布式计算 218 20.10 Sun Microsystems的远程过程调用定义 218 20.11 远程程序和过程 219 20.12 减少参数的数量 219 20.13 标记远程程序和过程 220 20.14 适应远程程序的多个版本 221 20.15 远程程序中的过程互斥 222 20.16 通信语义 222 20.17 至少一次语义 222 20.18 RPC重传 223 20.19 把远程程序映射到协议端口 224 20.20 动态端口映射 224 20.21 RPC端口映射器算法 225 20.22 RPC消息格式 226 20.23 为远程过程排列参数 227 20.24 身份认证 228 20.25 RPC消息表示的例子 229 20.26 认证字段的例子 229 20.27 小结 230 进一步的研究 231 习题 231 第21章 分布式程序的生成(Rpcgen概念) 232 21.1 引言 232 21.2 用使用远程过程调用 232 21.3 支持RPC的编程机制 233 21.4 将程序分割成本地过程和远程过程 234 21.5 为RPC增加代码 235 21.6 桩(stub)过程 235 21.7 多个远程过程和分发 236 21.8 客户端的桩过程名称 236 21.9 使用Rpcgen生成分布式程序 237 21.10 Rpcgen输出和接口过程 238 21.11 Rpcgen的输入和输出 239 21.12 使用Rpcgen构建客户端和服务器 239 21.13 小结 240 进一步的研究 240 习题 241 第22章 分布式程序的生成(Rpcgen的例子) 242 22.1 引言 242 22.2 举例说明Rpcgen 242 22.3 查询字典 242 22.4 建立分布式程序的八个步骤 243 22.5 步骤1:建立常规应用程序 244 22.6 步骤2:将程序分割成两部分 248 22.7 步骤3:创建Rpcgen规范 254 22.8 步骤4:运行Rpcgen 255 22.9 Rpcgen生成的.h文件 256 22.10 Rpcgen生成的XDR转换文件 257 22.11 Rpcgen生成的客户端代码 258 22.12 Rpcgen生成的服务器代码 260 22.13 步骤5:编写桩接口过程 263 22.13.1 客户端接口例程 263 22.13.2 客户端接口例程 265 22.14 步骤6:编译链接客户端程序 267 22.15 步骤7:编译链接服务器程序 270 22.16 步骤8:启动服务器和运行客户端 272 22.17 小结 272 进一步的研究 273 习题 273 第23章 网络文件系统(NFS)的概念 274 23.1 引言 274 23.2 远程文件访问与文件传输 274 23.3 对远程文件的操作 275 23.4 异构计算机之间的文件访问 275 23.5 无状态的服务器 275 23.6 NFS和UNIX文件语义 276 23.7 UNIX文件系统概述 276 23.7.1 基本定义 276 23.7.2 无记录边界的字节序列 276 23.7.3 文件的拥有者和组标识符 277 23.7.4 保护和访问 277 23.7.5 UNIX中的打开一读一写一关闭范例 278 23.7.6 UNIX中的数据传输 278 23.7.7 搜索目录的权限 279 23.7.8 UNIX中的随机访问 279 23.7.9 搜索超过UNIX文件结尾 280 23.7.10 UNIX文件位置和并发访问 280 23.7.11 并发访问时的写操作的语义 281 23.7.12 UNIX中的文件名和路径 281 23.7.13 UNIX索引节点:存储在文件中的信息 282 23.7.14 UNIX中的Stat操作 283 23.7.15 UNIX的文件命名机制 284 23.7.16 装配UNIX文件系统 284 23.7.17 UNIX文件名解析 286 23.7.18 UNIX符号链接 286 23.8 NFS下的文件 287 23.9 NFS文件类型 287 23.10 NFS文件模式 288 23.11 NFS文件属性 289 23.12 NFS的客户端和服务器 289 23.13 NFS客户端的操作 291 23.14 NFS的客户端和UNIX 291 23.15 NFS的装配(Mounts) 292 23.16 文件句柄 293 23.17 NFS句柄取代路径名 293 23.18 Windows下的NFS客户端 294 23.19 无状态服务器的文件定位 295 23.20 对目录的操作 295 23.21 无状态地读目录 296 23.22 NFS服务器中的多个分层结构 296 23.23 装配协议 297 23.24 小结 297 进一步的研究 298 习题 298 第24章 网络文件系统协议(NFS,Mount) 300 24.1 引言 300 24.2 用RPC定义协议 300 24.3 用数据结构和过程定义协议 301 24.4 NFS的常量、类型和数据声明 301 24.4.1 NFS的常量 301 24.4.2 NFS的Typedef声明 302 24.4.3 NFS的数据结构 303 24.5 NFS的过程 305 24.6 NFS中的操作的语义 306 24.6.1 NFSPROC_NULL(过程0) 306 24.6.2 NFSPROC_GETATTR(过程1) 306 24.6.3 NFSPROC_SETATTR(过程2) 306 24.6.4 NFSPROC_ROOT(过程3)[在NFS3中已经不用了] 306 24.6.5 NFSPROC_LOOKUP(过程4) 306 24.6.6 NFSPROC_READLINK(过程5) 307 24.6.7 NFSPROC_READ(过程6) 307 24.6.8 NFSPROC_WRITECACHE(过程7)[在NFS3中已经不用了] 307 24.6.9 NFSPROC_WRITE(过程8) 307 24.6.10 NFSPROC_CREATE(过程9) 307 24.6.11 NFSPROC_REMOVE(过程10) 307 24.6.12 NFSPROC_RENAME(过程11) 308 24.6.13 NFSPROC_LINK(过程12) 308 24.6.14 NFSPROC_SYMLINK(过程13) 308 24.6.15 NFSPROC_MKDIR(过程14) 308 24.6.16 NFSPROC_RMDIR(过程15) 308 24.6.17 NFSPROC_READDIR(过程16) 308 24.6.18 NFSPROC_STATFS(过程17) 309 24.7 装配协议 309 24.7.1 装配协议的常量定义 309 24.7.2 装配协议的类型定义 310 24.7.3 装配协议的数据结构 310 24.8 装配协议中的过程 311 24.9 装配操作的语义 312 24.9.1 MNTPROC_NULL(过程0) 312 24.9.2 MNTPROC_MNT(过程1) 312 24.9.3 MNTPROC_DUMP(过程2) 312 24.9.4 MNTPROC_UMNT(过程3) 312 24.9.5 MNTPROC_UMNRALL(过程4) 313 24.9.6 MNTPROC_EXPORT(过程5) 313 24.10 NFS和装配的鉴别 313 24.11 NFS版本3中的变化 314 24.12 小结 315 进一步的研究 316 习题 316 第25章 TELNET客户端(程序结构) 317 25.1 引言 317 25.2 概述 317 25.2.1 用户终端 317 25.2.2 命令和控制信息 318 25.2.3 终端、窗口和文件 318 25.2.4 对并发性的需要 318 25.2.5 TELNET客户端的线程模型 319 25.3 TELNET客户端的算法 319 25.4 Windows中的键盘I/0 320 25.5 键盘控制中使用的全局变量 321 25.6 初始化键盘线程 322 25.7 有限状态机的特点 325 25.8 ELNET数据流中内嵌的命令 325 25.9 选项协商 326 25.10 请求/提供的对称 326 25.11 TELNET字符定义 327 25.12 从服务器来的数据的有限状态机 328 25.13 状态之间的转换 329 25.14 实现有限状态机 330 25.15 紧凑的FSM表达 331 25.16 在运行时维持紧凑表示 332 25.17 实现紧凑表示 332 25.18 构造FSM转移矩阵 334 25.19 套接字输出的有限状态机 335 25.20 套接字输出FSM的定义 337 25.21 选项子协商的有限状态机 338 25.22 选项子协商FSM的定义 339 25.23 初始化FSM 340 25.24 TELNET客户端的参数 341 25.25 TELNET客户端的核心 341 25.26 TELNET的同步 345 25.27 处理严重的错误 346 25.28 实现主FSM 346 25.29 立即断开连接的过程 347 25.30 中止过程 348 25.31 小结 349 进一步的研究 349 习题 350 第26章 TELNET客户端(实现细节) 351 26.1 引言 351 26.2 有限状态机的动作过程 351 26.3 记录选项请求的类型 351 26.4 执行空操作 352 26.5 响应针对回显选项的WILL/WONT 353 26.6 发送响应 354 26.7 响应针对不被支持选项的WILL/WONT 355 26.8 响应针对No Go.Ahead选项的WILL/WONT 356 26.9 为一进制传输生成D0/DONT 357 26.10 响应针对不被支持选项的DO/DONT 358 26.11 响应针对传输_进制选项的DO/DONT 359 26.12 响应针对终端类型选项的DO/DONT 360 26.13 选项的子协商 362 26.14 发送终端类型信息 363 26.15 中止子协商 364 26.16 向服务器发送一个字符 365 26.17 在用户终端上显示传入的数据 366 26.18 将一块数据写到服务器中 369 26.19 与本地客户端的交互 370 26.20 对非法命令的响应 371 26.2l 抄写脚本到文件 371 26.22 抄写脚本的实现 372 26.23 抄写脚本的仞始化 372 26.24 收集脚本文件名的字符 373 26.25 打开脚本文件 374 26.26 中止抄写脚本 375 26.27 打印状态信息 377 26.28 小结 378 进一步的研究 378 习题 379 第27章 将服务器程序从UNIX移植到WINDOWS 380 27.1 引言 380 27.2 后台操作 380 27.3 共享描述符和继承 381 27.4 控制TTY 382 27.5 工作目录 382 27.6 建立文件和Umask 383 27.7 进程组 383 27.8 标准I/0描述符 384 27.9 服务器互斥 384 27.10 记录进程ID 385 27.11 等待一个子进程退出 385 27.12 使用系统日志设施 386 27.13 其他的不兼容 387 27.14 小结 388 进一步的研究 389 习题 389 第28章 客户一服务器系统中的死锁和饿死 390 28.1 引言 390 28.2 死锁的定义 390 28.3 死锁检测的难度 391 28.4 避免死锁 391 28.5 单个客户端和服务器问的死锁 392 28.6 在单个交互中避免死锁 392 28.7 一组客户端和单个服务器之间的饿死 393 28.8 忙连接和饿死 393 28.9 避免阻塞的操作 394 28.10 线程、连接和其他限制 394 28.11 客户端和服务器的循环 395 28.12 给依赖性建立文档 396 28.13 小结 397 进一步的研究 397 习题 397 附录A 套接字使用的函数和库例程 399 附录B Windows套接字描述符的操作 433 参考文献 436 译者序    很高兴有机会翻译DouglasE.Comer博士和DavidL.Stevens合作编写的《客户-服务器编程和应用(Windows套接字版)》一书。该书是((TCP/IP网络互连技术》系列丛书的第3卷,同列为第3卷的还有UNIX套接字版。 DouglasE.Comer博士在20世纪70年代就参与了TCP/IP和互联网的研究,在该领域具有丰富的经验,并撰写了大量的科研论文和教科书。他编写的这套丛书负有盛名,已被国内外的许多大学作为本科生和研究生的教材。    TCP/IP网络体系结构和协议栈已成为计算机网络事实上的标准,大量的计算机应用系统通过对TCP/IP协议栈的访问获得了网络通信的服务。在应用系统中如何设计客户机和服务器?如何实现通信中的并发过程?如何进行远程过程调用?如何设计分布式程序?对于这些经常遇到的问题,作者以其丰富的经验,借助例子深入浅出地在书中一一作了回答。同时作者也结合第1卷和第2卷的内容,说明了一些应用协议的实现方法,对读者深入领会这些协议的精髓提供了帮助。    本书内容丰富,概念清楚,讲解详细,有实例有验证,在每章后面又有足够的习题,可供读者巩固学习到的知识,增强实际应用能力。它既适合于高等院校计算机专业的学生,也可供从事在计算机网络上设计编写应用程序的开发人员作为参考书使用。正如作者所说,学生只有亲手使用教材后,才会欣赏它。我们相信该书会给读者带来帮助和成功的乐趣。    本书的翻译由张卫和王能负责,参加翻译工作的还有:朱逢霖、方奕、董梅、吴哲、王超和刘 。我们在尊重原著的基础上,力求准确、严谨地翻译本书,但由于翻译水平所限,难免有错误和欠妥之处,敬请读者批评指正。    译 者    华东师范大学计算机系    2004年3月于上海    序言    很荣幸能向读者介绍Dr.Douglas E.Comer的著作系列中的Windows套接字部分:TCP/IP网络互联技术。这个系列,从1987年开始编写,现在是读者学习网络协议族(Intemet协议族)的主要资料。该协议族使得不同厂商的计算机间通信成为可能。    我认为,与"不必深入了解因特网技术"的说法相反,这项创造性的工作是值得期待的。当媒体和企业使得大众对因特网充满了神秘的想像时,Dr.Comer清楚地解释了使得因特网成为可能的技术真相。    随着Intemet上Windows平台的日益流行,Dougs和DavidL.Stevens合著的这套书尤其重要。第三卷,客户-服务器编程与应用,教我们怎样设计和构建客户-服务器应用程序,而且更重要的是它还教我们怎样理解每个设计决策中所作的平衡和折衷。这对于那些正感受到开放系统和因特网的强大功能的无数Windows程序员来说是一项至关重要的技术。    因此,我邀请你参加到这个难忘的旅程中来,去理解网络互联技术的理论、设计以及实现方法的面貌和原因。    MarshallT.Rose    Theorist,Implementor,andAgentProvocateur    Del Mar,CalifOmia    很高兴能出版网络互连技术系列第3卷的Windows套接字版本。粗略地说,第1卷解释了什么是TCP/IP因特网。第2卷解释了TCP/IP软件如何工作。而第3卷则解释了应用软件如何在因特网上使用TCP/IP通信。它把重点放在客户-服务器机制上,并分析了分布式程序的客户端和服务器两部分的算法。本书给出了能说明每个设计思想的实现方法,讨论了包括应用层网关和管道在内的各种技术。另外,它回顾了几个标准应用协议,使用它们说明一些算法和实现技术。有关死锁和活锁的一章讨论了客户-服务器系统失败的几种表现,产生这些问题的原因,以及防止这些问题出现的技术。    我们编写这本书是为了满足那些为个人计算机构建软件的程序员的需求。针对PC机的软件来自微软公司。有两个流行的操作系统:Windows 95和WindowsNT。这两个系统都支持Win32编程接口,可以使用本书所讨论的Windows套接字应用程序接口(WindowsSocketAPl)。    本书描述了适合Windows95和WindowsNT的抽象概念。例如,并发性的讨论回顾了Windows下线程的抽象概念,这对于后面章节中并发服务器的讨论很重要。更重要的是,本书所给出的例子代码都已经在Windows95和WindowsNT下测试通过,并且可以从网上下载。要得到本书的电子版,可以在下面这个链接地址上找到:    http://www.cs.purdue.edu/homes/comer/books.html    或者在下面这个FTP目录下搜索文件名以TCPIP-vol3开头的文件:    ftp://ftp.cs.purdue,edu/pub/comer    本书采用了容易理解的编写结构。开头几章介绍了客户-服务器机制和应用程序用于网络通信的套接字接口。另外还描述了并发线程以及相关的创建线程的操作系统函数。后续的章节讨论了客户端和服务器的设计,并解释了各种可能的设计不是随机的产生的,而是遵循了一种可被理解的模式,它考虑了并发和传输的选择。例如,有一章讨论了一个非并发的服务器设计,它使用面向连接的传输(如TCP),而另一章讨论了一个类似的设计,它使用无连接的传输(如UDP)。    我们描述了每个设计如何适应各种可能的实现空间,而没有尝试去开发客户-服务器交互的抽象理论。我们强调对于程序员来说很重要的实际设计原则和技术。每种技术在一定的环境下都有优点,而且都已在工作软件中被使用。我们相信,读者理解了各个设计之间的概念性联系将有助于鉴别每种实现方法的优点和缺点,也会使对各种方法的选择变得更容易。    本书含有的一些例子程序显示了每个设计实际上是如何操作的。大多数的例子实现了标准的因特网应用协议。在各种情况下,我们尝试选择一个能传达单个设计思想的应用协议,避免在理解上过于复杂。因此,虽然很少有特别出色的例子程序,但是每个例子程序都说明了一个重要的概念。    后面的章节讨论了远程过程调用的概念,并描述如何利用它来构建分布式程序。它们把远程过程调用技术和客户-服务器模型联系起来,显示如何利用远程过程调用来创建客户和服务器程序。有关TELNET的章节展示了细枝末节如何支配了一个产品程序,以及即使是一个简单的面向字符的协议,其代码是如何的复杂。    本书很大部分的重点在并发处理。编写过并发程序的学生可能很熟悉我们所描述的许多概念,因为这些概念可应用于所有的并发程序,而不仅仅是网络应用程序。没编写过并发程序的学生可能会发现这些概念很难理解。    本书适合于高年级学生或研究生一个学期的网络入门课程。因为本书重点在如何使用网络互连技术,而不是网络互联是如何工作的,因此学生几乎不需要太多的网络背景知识就能理解这些内容。只要教师按合适的进度循序渐进,就没有什么特别的概念会令人感到太难。介绍操作系统基本概念或并发编程实际经验的基础课程,可提供最佳的背景材料。    学生只有亲手使用教材后,才会欣赏它。因此,任何课程都应该安排编程实践,强迫学生将其想法应用到实际程序中。大学本科生可以通过反复设计其他的应用协议来学习基本概念。研究生则应该编写强调某些细微技术的更加复杂的分布式程序(如第15章中的并发管理技术和第17章中的互连技术)。 .   在此要感谢很多人的帮助。Purdue大学因特网研究小组的成员们给本书原稿贡献了技术信息和建议。VinceRusso提供了技术帮助,JohnLin校对了本书。ChristineComer编辑了修订本,并改进了行文和一致性。    Douglas E.Comer    David L.Stevens
端口映射是一个服务器,将RPC程序号转换为DARPA的协议端口号。在使用RPC调用时它必须运行。   portmap进程的主要功能是把RPC程序号转化为Internet的端口号。   当一个RPC服务器启动时,会选择一个空闲的端口号并在上面监听(每次启动后的端口号各不相同),同时它作为一个可用的服务会在portmap进程注册。一个RPC服务器对应惟一一个RPC程序号,RPC服务器告诉portmap进程它在哪个端口号上监听连接请求和为哪个RPC程序号提供服务。经过这个过程,portmap进程就知道了每一个已注册的RPC服务器所用的Internet端口号,而且还知道哪个程序号在这个端口上是可用的。portmap进程维护着一张RPC程序号到Internet端口号之间的映射表,它的字段包括程序号、版本号、所用协议、端口号和服务名,portmap进程通过这张映射表来提供程序号-端口号之间的转化功能   如果portmap进程停止了运行或异常终止,那么该系统上的所有RPC服务器必须重新启动。首先停止NFS服务器上的所有NFS服务进程,然后启动portmap进程,再启动服务器上的NFS进程。   但portmap只在第一次建立连接的时候起作用,帮助网络应用程序找到正确的通讯端口,但是一旦这个双方正确连接,端口和应用就绑定,portmap也就不起作用了。但对其他任何第一次需要找到端口建立通讯的应用仍然有用。   简单的说,portmap就是应用和端口的婚姻介绍人,双方成事了以后,媒婆就没用了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ycnian

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值