本书是一部计算机网络经典性教科书(现在是第二版)。它是目前美国大多数大学里所开设的计算机网络课程的主要参考书。目前国内外能见到的各种有关TCP/IP的书籍,其主要内容均出自本书。本书的特点是:强调原理,概念准确,深入浅出,内容丰富且新颖。全书共分为三卷。第3卷主要讨论应用软件如何使用TCP/IP,重点研究了客户机—服务器范例,并考察了在分布式程序中的客户机和服务器,举例说明了各种设计,讨论了应用网关和隧道技术。全书共28章,各章之后附有很多很好的习题。本书可供计算机和通信专业的研究生、高年级本科生作为教科书和学习参考书,也可供从事科研和技术开发的人员参考。\r\n
\r\n
第l章 引言和概述 \r\n\r\n 1. 1 TCP/IP的使用 \r\n\r\n 1. 2 为分布式环境设计应用程序 \r\n\r\n 1. 3 标准和非标准的应用协议 \r\n\r\n 1. 4 使用标准应用协议的例子 \r\n\r\n 1. 5 一个连接的例子 \r\n\r\n 1. 6 使用TELNET访问其他服务 \r\n\r\n 1. 7 应用协议和软件的灵活性 \r\n\r\n 1. 8 从提供者的角度看服务 \r\n\r\n 1. 9 本教材的其余部分 \r\n\r\n 1. 10 小结 \r\n\r\n 第2章 客户机—服务器模型与软件设计 \r\n\r\n 2. 1 引言 \r\n\r\n 2. 2 动机 \r\n\r\n 2. 3 术语和概念 \r\n\r\n 2. 3. 1 客户机和服务器 \r\n\r\n 2. 3. 2 特权和复杂性 \r\n\r\n 2. 3. 3 标准的和非标准的客户机软件 \r\n\r\n 2. 3. 4 客户机的参数化 \r\n\r\n 2. 3. 5 无连接的和面向无连接的服务器 \r\n\r\n 2. 3. 6 无状态的和有状态的服务器 \r\n\r\n 2. 3. 7 一个有状态的服务器的例子 \r\n\r\n 2. 3. 8 无状态是一个协议问题 \r\n\r\n 2. 3. 9 作为客户机的服务器 \r\n\r\n 2. 4 小结 \r\n\r\n 第3窜 客户机—服务器软件中的并发处理 \r\n\r\n 3. 1 引言 \r\n\r\n 3. 2 网络中的并发性 \r\n\r\n 3. 3 服务器中的并发性 \r\n\r\n 3. 4 术语和概念 \r\n\r\n 3. 4. 1 进程概念 \r\n\r\n 3. 4. 2 程序与进程 \r\n\r\n 3. 4. 3 过程调用 \r\n\r\n 3. 5 一个创建并发进程的例子 \r\n\r\n 3. 5. 1 一个顺序执行的C实例 \r\n\r\n 3. 5. 2 程序的并发版 \r\n\r\n 3. 5. 3 时间分片 \r\n\r\n 3. 5. 4 使各进程分离 \r\n\r\n 3. 6 执行新的代码 \r\n\r\n 3. 7 上下文切换和协议软件设计 \r\n\r\n 3. 8 并发性和异步I/O \r\n\r\n 3. 9 小结 \r\n\r\n 第4章 协议的程序接口 \r\n\r\n 4. 1 引言 \r\n\r\n 4. 2 不精确指明的协议软件接口 \r\n\r\n 4. 2. 1 优点与缺点 \r\n\r\n 4. 3 接口功能 \r\n\r\n 4. 4 概念性接口的规格说明 \r\n\r\n 4. 5 系统调用 \r\n\r\n 4. 6 网络通信的两种基本方法 \r\n\r\n 4. 7 UNIX中所提供的基本I/O功能 \r\n\r\n 4. 8 用UNIX I/O结合TCP/IP \r\n\r\n 4. 9 小结 \r\n\r\n 第5章 插口接口 \r\n\r\n 5. 1 引言 \r\n\r\n 5. 2 Berkeley的插口 \r\n\r\n 5. 3 指明一个协议接口 \r\n\r\n 5. 4 插口的抽象 \r\n\r\n 5. 4. 1 插口描述符和文件描述符 \r\n\r\n 5. 4. 2 针对插口的系统数据结构 \r\n\r\n 5. 4. 3 使用插口 \r\n\r\n 5. 5 指明端点地址 \r\n\r\n 5. 6 类属地址结构 \r\n\r\n 5. 7 与插口一同使用的主要的系统调用 \r\n\r\n 5. 7. 1 socket调用 \r\n\r\n 5. 7. 2 connect调用 \r\n\r\n 5. 7. 3 write调用 \r\n\r\n 5. 7. 4 read调用 \r\n\r\n 5. 7. 5 c1ose调用 \r\n\r\n 5. 7. 6 bind调用 \r\n\r\n 5. 7. 7 1isten调用 \r\n\r\n 5. 7. 8 accept调用 \r\n\r\n 5. 7. 9 TCP所使用的插口调用小结 \r\n\r\n 5. 8 用于整数转换的实用例程 \r\n\r\n 5. 9 在程序中使用插口调用 \r\n\r\n 5. 10 插口调用的参数所使用的符号常量 \r\n\r\n 5. 11 小结 \r\n\r\n 第6章 客户机软件设计中的算法和问题 \r\n\r\n 6. 1 引言 \r\n\r\n 6. 2 不是研究细节而是学习算法 \r\n\r\n 6. 3 客户机体系结构 \r\n\r\n 6. 4 标识一个服务器的位置 \r\n\r\n 6. 5 分析地址参数 \r\n\r\n 6. 6 查找域名 \r\n\r\n 6. 7 由名字查找某个知名端口 \r\n\r\n 6. 8 端口号和网络字节序 \r\n\r\n 6. 9 由名字查找协议 \r\n\r\n 6. 10 TCP客户机算法 \r\n\r\n 6. 11 分配一个插口 \r\n\r\n 6. 12 选择一个本地协议端口号 \r\n\r\n 6. 13 选择本地IP地址中的一个基本问题 \r\n\r\n 6. 14 将一个TCP插口连接到某个服务器 \r\n\r\n 6. 15 使用TCP与服务器通信 \r\n\r\n 6. 16 从一个TCP连接中读取响应 \r\n\r\n 6. 17 关闭TCP连接 \r\n\r\n 6. 17. 1 对部分关闭(partial close)的需要 \r\n\r\n 6. 17. 2 部分关闭的操作 \r\n\r\n 6. 18 UDP客户机的编程 \r\n\r\n 6. 19 连接的和非连接的UDrP插口 \r\n\r\n 6. 20 对UDP使用connect \r\n\r\n 6. 21 使用UDP与服务器通信 \r\n\r\n 6. 22 关闭一个使用UDP的插口 \r\n\r\n 6. 23 对UDP的部分关闭 \r\n\r\n 6. 24 关于UDP不可靠性的警告 \r\n\r\n 6. 25 小结 \r\n\r\n 第7章 客户机软件举例 \r\n\r\n 7. 1 引言 \r\n\r\n 7. 2 小例子的重要性 \r\n\r\n 7. 3 隐藏细节 \r\n\r\n 7. 4 针对客户机程序的过程库例子 \r\n\r\n 7. 5 connectTCP的实现 \r\n\r\n 7. 6 connectUDP的实现 \r\n\r\n 7. 7 构成连接的过程 \r\n\r\n 7. 8 使用例子库 \r\n\r\n 7. 9 DAYTIME服务 \r\n\r\n 7. 10 针对DAYTIME的TCP客户机实现 \r\n\r\n 7. 11 从TCP连接中进行读 \r\n\r\n 7. 12 TIME服务 \r\n\r\n 7. 13 访问TIME服务 \r\n\r\n 7. 14 精确时间和网络时延 \r\n\r\n 7. 15 针对TIME服务的UDP客户机 \r\n\r\n 7. 16 ECHO服务 \r\n\r\n 7. 17 针对ECHO服务的TCP客户机 \r\n\r\n 7. 18 针对ECHO服务的UDP客户机 \r\n\r\n 7. 19 小结 \r\n\r\n 第8章 服务器软件设计的算法和问题 \r\n\r\n 8. 1 引言 \r\n\r\n 8. 2 概念性的服务器算法 \r\n\r\n 8. 3 并发服务器和循环服务器 \r\n\r\n 8. 4 面向连接的和无连接的访问 \r\n\r\n 8. 5 面向连接的服务器 \r\n\r\n 8. 6 无连接的服务器 \r\n\r\n 8. 7 故障. 可靠性和无状态 \r\n\r\n 8. 8 优化无状态服务器 \r\n\r\n 8. 9 四种基本类型的服务器 \r\n\r\n 8. 10 请求处理时间 \r\n\r\n 8. 11 循环服务器的算法 \r\n\r\n 8. 12 一种循环的. 面向连接的服务器的算法 \r\n\r\n 8. 13 用INADDR_ANY绑定一个知名端口 \r\n\r\n 8. 14 将插口置于被动模式 \r\n\r\n 8. 15 接受连接并使用这些连接 \r\n\r\n 8. 16 一个循环的. 无连接的服务器的算法 \r\n\r\n 8. 17 在无连接的服务器中构造一个应答 \r\n\r\n 8. 18 并发服务器的算法 \r\n\r\n 8. 19 主进程和从进程 \r\n\r\n 8. 20 并发的. 无连接的服务器的算法 \r\n\r\n 8. 21 并发的. 面向连接服务器的算法 \r\n\r\n 8. 22 把单独的程序作为从进程来使用 \r\n\r\n 8. 23 使用单个进程获得表面上的并发性 \r\n\r\n 8. 24 各服务器类型所适用的场合 \r\n\r\n 8. 25 服务器类型小结 \r\n\r\n 8. 26 重要问题——服务器死锁 \r\n\r\n 8. 27 其他的实现方法 \r\n\r\n 8. 28 小结 \r\n\r\n 第9章 循环的. 无连接服务器(UDP) \r\n\r\n 9. 1 引言 \r\n\r\n 9. 2 创建一个被动插口 \r\n\r\n 9. 3 进程结构 \r\n\r\n 9. 4 TIME服务器举例 \r\n\r\n 9. 5 小结 \r\n\r\n 第10章 循环的. 面向连接的服务器(TCP) \r\n\r\n 10. 1 引言 \r\n\r\n 10. 2 分配一个被动的TCP插口 \r\n\r\n 10. 3 用于DAYTIME服务的服务器 \r\n\r\n 10. 4 进程结构 \r\n\r\n 10. 5 DAYTIME服务器举例 \r\n\r\n 10. 6 关闭连接 \r\n\r\n 10. 7 连接终止和服务器的脆弱性 \r\n\r\n 10. 8 小结 \r\n\r\n 第11章 并发的. 面向连接的服务器(TCP) \r\n\r\n 11. 1 引言 \r\n\r\n 11. 2 并发ECHO \r\n\r\n 11. 3 循环与并发实现的比较 \r\n\r\n 11. 4 进程结构 \r\n\r\n 11. 5 并发ECHO服务器举例 \r\n\r\n 11. 6 清除游离(errant)进程 \r\n\r\n 11. 7 小结 \r\n\r\n 第12章 单进程. 并发服务器(TCP) \r\n\r\n 12. 1 引言 \r\n\r\n 12. 2 服务器中的数据驱动处理 \r\n\r\n 12. 3 用单个进程进行数据驱动处理 \r\n\r\n 12. 4 单个进程服务器的进程结构 \r\n\r\n 12. 5 单进程ECHO服务器举例 \r\n\r\n 12. 6 小结 \r\n\r\n 第13章 多协议服务器(TCP, UDP) \r\n\r\n 13. 1 引言 \r\n\r\n 13. 2 减少服务器数量的动机 \r\n\r\n 13. 3 多协议服务器的设计 \r\n\r\n 13. 4 进程结构 \r\n\r\n 13. 5 一个多协议DAYTIME服务器的例子 \r\n\r\n 13. 6 共享代码的概念 \r\n\r\n 13. 7 并发多协议服务器 \r\n\r\n 13. 8 小结 \r\n\r\n 第14章 多服务服务器(TCP, UDP) \r\n\r\n 14. 1 引言 \r\n\r\n 14. 2 合并服务器 \r\n\r\n 14. 3 无连接的. 多服务服务器的设计 \r\n\r\n 14. 4 面向连接的. 多服务服务器的设计 \r\n\r\n 14. 5 并发的. 面向连接的. 多服务服务器 \r\n\r\n 14. 6 单进程的. 多服务服务器的实现 \r\n\r\n 14. 7 从多服务服务器调用单独的程序 \r\n\r\n 14. 8 多服务. 多协议设计 \r\n\r\n 14. 9 多服务服务器的例子 \r\n\r\n 14. 10 静态的和动态的服务器配置 \r\n\r\n 14. 11 UNIX超级服务器, inetd \r\n\r\n 14. 12 inetd服务器的例子 \r\n\r\n 14. 13 小结 \r\n\r\n 第15章 服务器并发性的统一. 高效管理 \r\n\r\n 15. 1 引言 \r\n\r\n 15. 2 在循环设计和并发设计间选择 \r\n\r\n 15. 3 并发等级 \r\n\r\n 15. 4 需求驱动的并发 \r\n\r\n 15. 5 并发的代价 \r\n\r\n 15. 6 额外开销和时延 \r\n\r\n 15. 7 小时延可能出麻烦 \r\n\r\n 15. 8 进程预分配 \r\n\r\n 15. 8. 1 UNIX中的预分配 \r\n\r\n 15. 8. 2 面向连接服务器中的预分配 \r\n\r\n 15. 8. 3 无连接服务器中的预分配 \r\n\r\n 15. 8. 4 预分配. 突发通信量和NFS \r\n\r\n 15. 8. 5 多处理器上的进程预分配 \r\n\r\n 15. 9 延迟的进程分配 \r\n\r\n 15. 10 两种技术统一的基础 \r\n\r\n 15. 11 技术的结合 \r\n\r\n 15. 12 小结 \r\n\r\n 第16章 客户机中的并发 \r\n\r\n 16. 1 引言 \r\n\r\n 16. 2 并发的优点 \r\n\r\n 16. 3 运用控制的动机 \r\n\r\n 16. 4 与多个服务器的并发联系 \r\n\r\n 16. 5 实现并发客户机 \r\n\r\n 16. 6 单个进程的实现 \r\n\r\n 16. 7 一个使用ECHO的并发客户机 \r\n\r\n 16. 8 并发客户机的执行 \r\n\r\n 16. 9 例子代码中的并发性 \r\n\r\n 16. 10 小结 \r\n\r\n 第17章 运输层和应用层的隧道技术 \r\n\r\n 17. 1 引言 \r\n\r\n 17. 2 多协议环境 \r\n\r\n 17. 3 混合网络技术 \r\n\r\n 17. 4 动态电路分配 \r\n\r\n 17. 5 封装和隧道技术 \r\n\r\n 17. 6 通过IP互连网的隧道技术 \r\n\r\n 17. 7 客户机和服务器之间的应用级隧道技术 \r\n\r\n 17. 8 隧道技术. 封装和电话拨号线 \r\n\r\n 17. 9 小结 \r\n\r\n 第18章 应用级网关 \r\n\r\n 18. 1 引言 \r\n\r\n 18. 2 在受约束的环境中的客户机和服务器 \r\n\r\n 18. 2. 1 多种技术的现实 \r\n\r\n 18. 2. 2 有限功能的计算机 \r\n\r\n 18. 2. 3 安全性引起的连通性约束 \r\n\r\n 18. 3 使用应用网关 \r\n\r\n 18. 4 通过邮件网关互操作 \r\n\r\n 18. 5 邮件网关的实现 \r\n\r\n 18. 6 应用网关与隧道技术的比较 \r\n\r\n 18. 7 应用网关和有限功能系统 \r\n\r\n 18. 8 为解决安全问题而使用的应用网关 \r\n\r\n 18. 9 应用网关和额外跳问题 \r\n\r\n 18. 10 应用网关举例 \r\n\r\n 18. 11 一个应用网关的实现 \r\n\r\n 18. 12 应用网关的代码 \r\n\r\n 18. 13 网关交换的例子 \r\n\r\n 18. 14 使用rfcd和UNIX的. forward文件 \r\n\r\n 18. 15 一个通用的应用网关 \r\n\r\n 18. 16 SURP的运行 \r\n\r\n 18. 17 SLIRP如何处理连接 \r\n\r\n 18. 18 IP寻址和SLIRP \r\n\r\n 18. 19 小结 \r\n\r\n 第19章 外部数据表示(xDR] \r\n\r\n 19. 1 引言 \r\n\r\n 19. 2 计算机中的数据表示 \r\n\r\n 19. 3 N平方转换问题 \r\n\r\n 19. 4 网络标准字节序 \r\n\r\n 19. 5 外部数据表示的事实上的标准 \r\n\r\n 19. 6 XDR数据类型 \r\n\r\n 19. 7 隐含类型 \r\n\r\n 19. 8 使用XDR的软件支持 \r\n\r\n 19. 9 XDR库例程 \r\n\r\n 19. 10 一次一片地构造一个报文 \r\n\r\n 19. 11 XDR库中的转换例程 \r\n\r\n 19. 12 XDR流. I/O和TCP \r\n\r\n 19. 13 记录. 记录边界和数据报I/O \r\n\r\n 19. 14 小结 \r\n\r\n 第20章 远程过程调用(RPC)的榴念 \r\n\r\n 20. 1 引言 \r\n\r\n 20. 2 远程过程调用模型 \r\n\r\n 20. 3 构建分布式程序的两种模式 \r\n\r\n 20. 4 传统的过程调用的概念性模型 \r\n\r\n 20. 5 过程模型的扩充 \r\n\r\n 20. 6 传统过程调用的执行和返回 \r\n\r\n 20. 7 分布式系统中的过程模型 \r\n\r\n 20. 8 客户机—服务器和RPC之间的类比 \r\n\r\n 20. 9 作为一个程序的分布式计算 \r\n\r\n 20. 10 Sun Microsystems的远程过程调用定义 \r\n\r\n 20. 11 远程程序和过程 \r\n\r\n 20. 12 减少参数的数量 \r\n\r\n 20. 13 标识远程程序和过程 \r\n\r\n 20. 14 适应远程程序的多个版本 \r\n\r\n 20. 15 远程程序中的互斥 \r\n\r\n 20. 16 通信语义 \r\n\r\n 20. 17 至少一次语义 \r\n\r\n 20. 18 RPC重传 \r\n\r\n 20. 19 将一个远程程序映射到一个协议端口 \r\n\r\n 20. 20 动态端口映射 \r\n\r\n 20. 21 RPC端口映射器算法 \r\n\r\n 20. 22 ONCRPC的报文格式 \r\n\r\n 20. 23 对远程过程进行参数序列化 \r\n\r\n 20. 24 鉴别 \r\n\r\n 20. 25 RPC报文表示的一个例子 \r\n\r\n 20. 26 UNIX鉴别字段的例子 \r\n\r\n 20. 27 小结 \r\n\r\n 第21章 分布式程序的生成 \r\n\r\n 21. 1 引言 \r\n\r\n 21. 2 使用远程过程调用 \r\n\r\n 21. 3 支持RPC的编程工具 \r\n\r\n 21. 4 将一个程序划分成本地过程和远程过程 \r\n\r\n 21. 5 为RPC增加代码 \r\n\r\n 21. 6 stub过程 \r\n\r\n 21. 7 多个远程过程和分派 \r\n\r\n 21. 8 客户机端的stub过程的名字 \r\n\r\n 21. 9 使用rpcgen生成分布式程序 \r\n\r\n 21. 10 rpcgen输出和接口过程 \r\n\r\n 21. 11 rpcgen的输入和输出 \r\n\r\n 21. 12 使用rpcgen构建客户机和服务器 \r\n\r\n 21. 13 小结 \r\n\r\n 第22章 分布式程序的生成(rpcgen的例子) \r\n\r\n 22. 1 引言 \r\n\r\n 22. 2 一个说明rpcgen的例子 \r\n\r\n 22. 3 查找字典 \r\n\r\n 22. 4 一个分布式程序的八个步骤 \r\n\r\n 22. 5 步骤1:构建一个常规的应用程序 \r\n\r\n 22. 6 步骤2:将程序划分成两部分 \r\n\r\n 22. 7 步骤3:创建一个rpcgen规格说明 \r\n\r\n 22. 8 步骤4:运行rpcgen \r\n\r\n 22. 9 rpcgen产生的. h文件 \r\n\r\n 22. 10 rpcgen产生的XDR转换文件 \r\n\r\n 22. 11 rpcgen产生的客户机代码 \r\n\r\n 22. 12 rpcgen产生的服务器代码 \r\n\r\n 22. 13 步骤5:编写stub接口过程 \r\n\r\n 22. 13. 1 客户机端接口例程 \r\n\r\n 22. 13. 2 服务器端接口例程 \r\n\r\n 22. 14 步骤62编译并链接客户机程序 \r\n\r\n 22. 15 步骤7:编译和链接服务器程序 \r\n\r\n 22. 16 步骤8:启动服务器和执行客户机 \r\n\r\n 22. 17 使用UNIX的make实用程序 \r\n\r\n 22. 18 小结 \r\n\r\n 第23章 网络文件系统(NFS)的概念 \r\n\r\n 23. 1 引言 \r\n\r\n 23. 2 远程文件存取和传输 \r\n\r\n 23. 3 对远程文件的操作 \r\n\r\n 23. 4 异构计算机之间的文件存取 \r\n\r\n 23. 5 无状态服务器 \r\n\r\n 23. 6 NFS和UNIX的文件语义 \r\n\r\n 23. 7 UNIX文件系统的回顾 \r\n\r\n 23. 7. 1 基本定义 \r\n\r\n 23. 7. 2 无记录界限的字节序列 \r\n\r\n 23. 7. 3 文件拥有者和组标识符 \r\n\r\n 23. 7. 4 保护和存取 \r\n\r\n 23. 7. 5 打开—读—写—关闭范例 \r\n\r\n 23. 7. 6 数据传输 \r\n\r\n 23. 7. 7 允许搜索目录 \r\n\r\n 23. 7. 8 随机存取 \r\n\r\n 23. 7. 9 搜索超过文件的结束 \r\n\r\n 23. 7. 10 文件位置和并发存取 \r\n\r\n 23. 7. 11 在并发存取时的“写(write)”语义 \r\n\r\n 23. 7. 12 文件名和路径 \r\n\r\n 23. 7. 13 索引结点(inode):存储在文件中的信息 \r\n\r\n 23. 7. 14 stat操作 \r\n\r\n 23. 7. 15 文件命名机制 \r\n\r\n 23. 7. 16 文件系统mount \r\n\r\n 23. 7. 17 UNIX文件名解析 \r\n\r\n 23. 7. 18 符号链接 \r\n\r\n 23. 8 NFS下的文件 \r\n\r\n 23. 9 NFS的文件类型 \r\n\r\n 23. 10 NFS文件模式 \r\n\r\n 23. 11 NFS文件属性 \r\n\r\n 23. 12 NFS客户机和服务器 \r\n\r\n 23. 13 NFS客户机操作 \r\n\r\n 23. 14 NFS客户机与UNIX \r\n\r\n 23. 15 NFS mount \r\n\r\n 23. 16 文件句柄 \r\n\r\n 23. 17 句柄取代路径名 \r\n\r\n 23. 18 在UNIX中的NFS客户机 \r\n\r\n 23. 19 无状态服务器的文件定位 \r\n\r\n 23. 20 对目录的操作 \r\n\r\n 23. 21 无状态地读目录 \r\n\r\n 23. 22 NFS服务器中的多个分层结构 \r\n\r\n 23. 23 安装(mount)协议 \r\n\r\n 23. 24 小结 \r\n\r\n 第24章 网馅文件系统协议(NFS, Mount) \r\n\r\n 24. 1 引言 \r\n\r\n 24. 2 用RPC定义协议 \r\n\r\n 24. 3 用数据结构和过程定义协议 \r\n\r\n 24. 4 NFS常数. 类型和数据声明 \r\n\r\n 24. 4. 1 NFS常数 \r\n\r\n 24. 4. 2 NFS的typedef声明 \r\n\r\n 24. 4. 3 NFS数据结构 \r\n\r\n 24. 5 NFS过程 \r\n\r\n 24. 6 NFS操作的语义 \r\n\r\n 24. 6. 1 NFSPROC—NULL(过程0) \r\n\r\n 24. 6. 2 NFSPROC_GETATTR(过程1) \r\n\r\n 24. 6. 3 NFSPROC_SETATTR(过程2) \r\n\r\n 24. 6. 4 NFSPROC_ROOT(过程3)[在NFS3中已经不用] \r\n\r\n 24. 6. 5 NFSPROC_LOOKUP(过程4) \r\n\r\n 24. 6. 6 NFSPROC_READLINK(过程5) \r\n\r\n 24. 6. 7 NFSPROC_READ(过程6) \r\n\r\n 24. 6. 8 NFSPROC_WRITECACHE(过程7)[在NFS3已经不用] \r\n\r\n 24. 6. 9 NFSPROC_WRITE(过程8) \r\n\r\n 24. 6. 10 NFSPR(Xi—敝EAT2(过程9) \r\n\r\n 24. 6. 11 NFSPROC_REMOVE(过程10) \r\n\r\n 24. 6:12 NFSPROC_RENAME(过程11) \r\n\r\n 24. 6. 13 NFSPROC_LINK(过程12) \r\n\r\n 24. 6. 14 NFSPROC_SYMLINK(过程13) \r\n\r\n 24. 6. 15 NFSPROC_MKDIR(过程14) \r\n\r\n 24. 6. 16 NFSPROC_RMDIR(过程15) \r\n\r\n 24. 6. 17 NFSPROC_READDIR(过程16) \r\n\r\n 24. 6. 18 NFSPROC_STATFS(过程17) \r\n\r\n 24. 7 安装协议 \r\n\r\n 24. 7. 1 安装协议的常数定义 \r\n\r\n 24. 7. 2 安装协议的类型定义 \r\n\r\n 24. 7. 3 安装数据结构 \r\n\r\n 24. 8 安装协议中的过程 \r\n\r\n 24. 9 安装操作的语义 \r\n\r\n 24. 9. 1 MNTPROC_NULL(过程0) \r\n\r\n 24. 9. 2 MNTPROC_MNT(过程1) \r\n\r\n 24. 9. 3 MNTPROC_DUMP(过程2) \r\n\r\n 24. 9. 4 MNTPROC_UMNT(过程3) \r\n\r\n 24. 9. 5 MNTPROC_UMNTALL(过程4) \r\n\r\n 24. 9. 6 MN了PROC_ExPORT(过程5) \r\n\r\n 24. 10 NFS和安装鉴别 \r\n\r\n 24. 11 NFS版本3中的改变 \r\n\r\n 24. 12 小结 \r\n\r\n 第25章 TELNET客户机(程序结构) \r\n\r\n 25. 1 引言 \r\n\r\n 25. 2 概述 \r\n\r\n 25. 2. 1 用户终端 \r\n\r\n 25. 2. 2 命令和控制信息 \r\n\r\n 25. 2. 3 终端. 窗口和文件 \r\n\r\n 25. 2. 4 对并发性的需要 \r\n\r\n 25. 2. 5 TELNET客户机的一个过程模型 \r\n\r\n 25. 3 TELNET客户机算法 \r\n\r\n 25. 4 UNIX中的终端I/O \r\n\r\n 25. 4. 1 控制设备驱动器 \r\n\r\n 25. 5 建立终端模式 \r\n\r\n 25. 6 用于保存状态的全局变量 \r\n\r\n 25. 7 在退出之前恢复终端模式 \r\n\r\n 25. 8 客户机挂起与恢复 \r\n\r\n 25. 9 有限状态机的规格说明 \r\n\r\n 25. 10 在TELNET数据流中嵌入命令 \r\n\r\n 25. 11 选项协商 \r\n\r\n 25. 12 请求/提供的对称性 \r\n\r\n 25. 13 TELNET字符定义 \r\n\r\n 25. 14 针对来自服务器数据的有限状态机 \r\n\r\n 25. 15 在各种状态之间转移 \r\n\r\n 25. 16 有限状态机的实现 \r\n\r\n 25. 17 压缩的FSM表示 \r\n\r\n 25. 18 在运行时维持压缩表示 \r\n\r\n 25. 19 压缩表示的实现 \r\n\r\n 25. 20 构造FSM转移矩阵 \r\n\r\n 25. 21 插口输出有限状态机 \r\n\r\n 25. 22 插口输出FSM的相关定义 \r\n\r\n 25. 23 选项子协商有限状态机 \r\n\r\n 25. 24 选项子协商FSM的相关定义 \r\n\r\n 25. 25 FSM初始化 \r\n\r\n 25. 26 TELNET客户机的参数 \r\n\r\n 25. 27 TELNET客户机的核心 \r\n\r\n 25. 28 主FSM的实现 \r\n\r\n 25. 29 小结 \r\n\r\n 第26章 TELNET客户机(实现细节) \r\n\r\n 26. 1 引言 \r\n\r\n 26. 2 FSM动作过程 \r\n\r\n 26. 3 记录选项请求的类型 \r\n\r\n 26. 4 完成空操作 \r\n\r\n 26. 5 对回显选项的WILL/WONT做出响应 \r\n\r\n 26. 6 对未被支持之选项的WILL/WONT做出响应 \r\n\r\n 26. 7 对no g0—ahead选项的WILL/WONT做出响应 \r\n\r\n 26. 8 生成用于二进制传输的DO/DONT \r\n\r\n 26. 9 对未被支持的选项的DO/DoNT做出响应 \r\n\r\n 26. 10 对传输二进制选项的DO/DONT做出响应 \r\n\r\n 26. 11 对终端类型选项的DO/DONT做出响应 \r\n\r\n 26. 12 选项子协商 \r\n\r\n 26. 13 发送终端类型信息 \r\n\r\n 26. 14 终止子协商 \r\n\r\n 26. 15 向服务器发送字符 \r\n\r\n 26. 16 显示在用户终端上出现的入数据 \r\n\r\n 26. 17 使用tenncap控制用户终端 \r\n\r\n 26. 18 将数据块写到服务器 \r\n\r\n 26. 19 与客户机进程交互 \r\n\r\n 26. 20 对非法命令做出响应 \r\n\r\n 26. 21 脚本描述文件 \r\n\r\n 26. 22 脚本描述的实现 \r\n\r\n 26. 23 初始化脚本描述 \r\n\r\n 26. 24 收集脚本文件名的字符 \r\n\r\n 26. 25 打开脚本文件 \r\n\r\n 26. 26 终止脚本描述 \r\n\r\n 26. 27 打印状态信息 \r\n\r\n 26. 28 小结 \r\n\r\n 第27章 UNIX服务器中的实用技巧和技术 \r\n\r\n 27. 1 引言 \r\n\r\n 27. 2 后台操作 \r\n\r\n 27. 3 编写在后台运行的服务器 \r\n\r\n 27. 4 打开描述符和继承 \r\n\r\n 27. 5 对服务器编程以关闭所继承的描述符 \r\n\r\n 27. 6 来自控制TTY的信号 \r\n\r\n 27. 7 对服务器编程以改变它的控制TTY \r\n\r\n 27. 8 转移到一个安全的和已知的目录 \r\n\r\n 27. 9 对服务器编程以改变目录 \r\n\r\n 27. 10 UNIX umask \r\n\r\n 27. 11 对服务器编程以设置其umask \r\n\r\n 27. 12 进程组 \r\n\r\n 27. 13 对服务器编程以设置其进程组 \r\n\r\n 27. 14 用于标准I/O的描述符 \r\n\r\n 27. 15 对服务器编程以打开标准描述符 \r\n\r\n 27. 16 服务器用的互斥 \r\n\r\n 27. 17 对服务器编程以避免多个副本 \r\n\r\n 27. 18 记录服务器的进程ID \r\n\r\n 27. 19 对服务器编程以记录其进程ID \r\n\r\n 27. 20 等待一个子进程退出 \r\n\r\n 27. 2l 对服务器编程以等待每个子进程退出 \r\n\r\n 27. 22 外来信号 \r\n\r\n 27. 23 对服务器编程以忽略外来信号 \r\n\r\n 27. 24 使用系统日志设施 \r\n\r\n 27. 24. 1 产生日志报文 \r\n\r\n 27. 24. 2 间接方式和标准差错的优点 \r\n\r\n 27. 24. 3 I/O重定向的限制 \r\n\r\n 27. 24. 4 客户机—服务器的解决方案 \r\n\r\n 27. 24. 5 syslog机制 \r\n\r\n 27. 24. 6 syslog吧的报文类 \r\n\r\n 27. 24. 7 syslog的设施 \r\n\r\n 27. 24. 8 syslog的优先级 \r\n\r\n 27. 24. 9 使用syslog \r\n\r\n 27. 24. 10 syslog配置文件举例 \r\n\r\n 27. 25 小结 \r\n\r\n 第28章 客户机—服务器系统中的死锁和饿死 \r\n\r\n 28. 1 引言 \r\n\r\n 28. 2 死锁的定义 \r\n\r\n 28. 3 死锁检测的难度 \r\n\r\n 28. 4 避免死锁 \r\n\r\n 28. 5 一个客户机和服务器间的死锁 \r\n\r\n 28. 6 在单个交互中避免死铰 \r\n\r\n 28. 7 一组客户机和一个服务器之间的饿死 \r\n\r\n 28. 8 忙连接和饿死 \r\n\r\n 28. 9 避免阻塞的操作 \r\n\r\n 28. 10 进程. 连接和其他限制 \r\n\r\n 28. 11 客户机和服务器的循环 \r\n\r\n 28. 12 用文档确认依赖性 \r\n\r\n 28. 13 小结 \r\n\r\n 附录1 系统调用与插口使用的库例程 \r\n\r\n 附录2 UNIX文件和插口描述符的操作 \r\n\r\n 参考文献 \r\n\r\n \r\n
\r\n
我们很高兴为大家介绍网际互连系列中第三卷的修订版. 粗略地讲, 第一卷研究了“什么是TCP/IP互连网?”的问题, 第二卷研究了“TCP/IP软件是怎样工作的?”, 它比第一卷阐述了更多的细节, 且探讨更为深入. 本卷将研究“应用软件如何使用TCP/IP?”这个问题, 它重点研究了客户机—服务器范例, 并考察了在分布式程序中的客户机和服务器这两部分. 本卷举例说明了每种设计, 并讨论了包括应用层网关和隧道在内的技术. 另外, 本卷还重温了几个标准应用协议, 并用它们来说明一些算法和实现技术.
所做修订都遵从最近的标准. 例如, 例子中的代码已使用ANSI C重写, 并且有关NFS讨论的章节已改变为第3版. 另外, 还增加了一些新章节解释一些程序中所蕴涵的概念, 像slirp程序, 它提供用拨号电话连接进入到Internet. 对客户机—服务器系统发生故障方式的讨论也加以扩充:用整个新的一章着重讨论死锁(deadlock)和活锁(1ivelock). 该章考察了问题发生的原因, 以及避免发生这些问题的技术. 最后, 原书行文中的少量印刷错误和意义不够明确的地方现都已纠正.
本书代码可在线获得. 要通过Web得到一个拷贝, 可在如下网址的连网书表中查找第三卷:
http://www. cs. purdue. edu/homes/comer/books. html要通过FTP访问代码, 请使用:
ftp://ftp. cs. Purdue.edu/pub/Xinu/TCPIP—vo13. bsd. dist. tar, Z
本书的组织与上一版相同. 开始几章介绍了客户机—服务器模型, 以及应用程序用于接入到TCP/IP协议软件的插口(socket)接口. 此外, 还描述了并发进程和用于创建他们的操作系统函数. 随后的几章介绍了客户机和服务器设计.
本书阐明了各式各样可能的设计并不是没有规则的, 实际上, 这些设计都是遵循了一种模式. 在考虑了并行性和传输的选择后, 就可以理解这一观点. 例如, 有一章讨论了一个使用面向连接传输(如TCP)的非并发服务器设计, 而另一章讨论了一个相似的设计, 但它使用无连接传输(如UDP).
我们描述了每个设计如何适应于各种可能的实现, 但是, 我们并没有试图开发一种客户机—服务器交互的抽象“理论”. 我们只是强调实用的设计原则, 以及对程序员来说是重要的技术. 每种技术在一些情况下都有其优点, 并且每种技术都已用于正在工作的软件中. 我们相信, 理解这些设计之间的概念联系, 将有助于读者理解每种方法的优缺点, 并使在它们之间进行选择更为容易.
本书包含了多个例子程序, 他们展现了各种设计实际上是如何进行的. 大多数例子实现了标准的TCP/IP应用协议. 在每一种情况下, 我们都试图选择一个应用协议, 使它可表达一种设计思路而又不太难理解. 因此, 虽然很少有令人激动的例子程序, 但这里的每一个例子都说明了一个重要的概念. 在第三卷的这个版本中, 所有的例子程序都使用BSD U-NIX插口机制, 相关版本中含有使用AT&T的TLI协议接口的相同例子.
后几章讨论远程过程调用的概念, 并描述它是怎样被用于构造分布式程序的. 这些章将远程过程调用技术与客户机—服务器模型相联系, 并说明如何使用软件从一个远程过程调用描述生成出客户机和服务器程序. 有关TELNET的章节展现了细枝末节如何在一个实际工作的程序中占据支配地位, 以及即使是实现一个简单的. 面向字符的协议, 其代码如何会变得复杂.
本书很大部分的重点在并发处理. 写过并发程序的学生可能熟悉我们所描述的许多概念, 因为这些概念适用于所有的并发程序, 而不仅仅是网络应用. 没写过并发程序的学生可能会觉得这些概念很难.
本书适于作为向高年级或研究生介绍连网知识的一个学期的课程. 由于本书重点是如何使用互连网, 而不是互连网是如向工作的, 因此学生几乎不需要太多的网络背景知识就能理解这些内容. 只要学生们按合适的进度循序渐进, 较低级课程中不会有特别的概念令人感到太难. 介绍操作系统概念或并发编程实际经验的基础课程, 可提供最佳背景材料.
学生只有亲手使用教材后, 才会欣赏它. 因此, 任何课程都应安排编程实践, 强迫学生将其想法运用到实际程序中. 大学本科生可通过反复设计其他的应用协议来学习基本概念. 研究生则应构建更为复杂的分布式程序, 这些程序强调一些细微的技术(如第15章中并发管理技术, 和第17章中互连技术).
在此, 要感谢许多人的帮助. 珀杜(Purdue)大学的Internet研究小组的成员们给本书原稿提供了许多技术信息和建议. ChristineComer进行了修订并改进了行文和一致性.
Douglas E. Comer
David L. Stevens
Douglas E. Comer博士的系列著作——《用TCP/IP进行网际互连》是一套引人瞩目的书. 能向读者介绍该书第三卷的修订版, 对我来说实在是荣幸之至. 这套书开始创作于1987年, 那时它还不为很多人所知. 然而现在它已成为学习Intemet协议族的首选材料, 而Internet协议族业已使与厂商无关的计算机通信成为可能.
在我看来, 这部创新的著作是最有望抵制所谓“Internet要变成哑巴了”的论调. 当媒介和企业家们让大众的想像被“Internet神秘主义”所填满时, 是勘mer博士清晰地阐述了那些使Internet成为可能的技术的真实状况.
尽管我已学习了这一套书的所有三本, 但我觉得, Doug与David L. Stevens合著的第三卷——客户机—服务器编程和应用, 与今天的Intemet特别有关. 这本书教给我们如何设计和构建客户机—服务器应用, 而且更重要的是, 它还教给我们如何理解每种设计决策中所蕴涵的权衡.
因此, 我邀请您加入一个难忘的行程——学习网络互连技术的理论. 设计以及实现的原理和内容.
Marshll T. Rose
Theorist, Implementor, andAgent Provocateur
Del Mar, California