《用TCP/IP进行网际互连 第3卷:客户机-服务器编程和应用(第2版)》PDF下载

  • 购买积分:14 如何计算积分?
  • 作  者:DOUGLAS E. COMER DAVID L. STEVENS
  • 出 版 社:电子工业出版社
  • 出版年份:1998
  • ISBN:
  • 页数:410 页
图书介绍:

第1章 引言和概述 1

1.1 TCP/IP的使用 1

1.2 为分布式环境设计应用程序 1

1.3 标准和非标准的应用协议 2

1.4 使用标准应用协议的例子 2

1.5 一个连接的例子 3

1.6 使用TELNET访问其他服务 3

1.7 应用协议和软件的灵活性 4

1.8 从提供者的角度看服务 5

1.9 本教材的其余部分 5

1.10 小结 6

第2章 客户机—服务器模型与软件设计 7

2.1 引言 7

2.2 动机 7

2.3.2 特权和复杂性 8

2.3.1 客户机和服务器 8

2.3 术语和概念 8

2.3.3 标准的和非标准的客户机软件 9

2.3.4 客户机的参数化 9

2.3.5 无连接的和面向无连接的服务器 10

2.3.6 无状态的和有状态的服务器 11

2.3.7 一个有状态的服务器的例子 11

2.3.8 无状态是一个协议问题 13

2.3.9 作为客户机的服务器 13

2.4 小结 14

第3章 客户机—服务器软件中的并发处理 16

3.1 引言 16

3.2 网络中的并发性 16

3.3 服务器中的并发性 17

3.4 术语和概念 18

3.4.1 进程概念 18

3.4.3 过程调用 19

3.4.2 程序与进程 19

3.5.1 一个顺序执行的C实例 20

3.5 一个创建并发进程的例子 20

3.5.2 程序的并发版 21

3.5.3 时间分片 22

3.5.4 使各进程分离 23

3.6 执行新的代码 24

3.7 上下文切换和协议软件设计 24

3.8 并发性和异步I/O 25

3.9 小结 25

第4章 协议的程序接口 27

4.1 引言 27

4.2 不精确指明的协议软件接口 27

4.2.1优点与缺点 27

4.3 接口功能 28

4.4 概念性接口的规格说明 28

4.6 网络通信的两种基本方法 29

4.5 系统调用 29

4.7 UNIX中所提供的基本I/O功能 30

4.8 用UNIX I/O结合TCP/IP 31

4.9 小结 31

第5章 插口接口 33

5.1 引言 33

5.2 Berkeley的插口 33

5.3 指明一个协议接口 33

5.4 插口的抽象 34

5.4.1 插口描述符和文件描述符 34

5.4.2 针对插口的系统数据结构 35

5.4.3 使用插口 35

5.5 指明端点地址 36

5.6 类属地址结构 36

5.7.2 connect调用 38

5.7.3 write调用 38

5.7 与插口一同使用的主要的系统调用 38

5.7.1 socker调用 38

5.7.4 read调用 39

5.7.5 close调用 39

5.7.6 bind调用 39

5.7.7 listen调用 39

5.7.8 accept调用 40

5.7.9 TCP所使用的插口调用小结 40

5.10 插口调用的参数所使用的符号常量 41

5.8 用于整数转换的实用例程 41

5.9 在程序中使用插口调用 41

5.11 小结 42

第6章 客户机软件设计中的算法和问题 44

6.1 引言 44

6.2 不是研究细节而是学习算法 44

6.3 客户机体系结构 44

6.4 标识一个服务器的位置 45

6.5 分析地址参数 46

6.7 由名字查找某个知名端口 47

6.6 查找域名 47

6.8 端口号和网络字节序 48

6.9 由名字查找协议 48

6.10 TCP客户机算法 49

6.11 分配一个插口 49

6.12 选择一个本地协议端口号 50

6.13 选择本地IP地址中的一个基本问题 50

6.15 使用TCP与服务器通信 51

6.14 将一个TCP插口连接到某个服务器 51

6.16 从一个TCP连接中读取响应 52

6.17 关闭TCP连接 52

6.17.1 对部分关闭(partial close)的需要 52

6.17.2 部分关闭的操作 53

6.18 UDP客户机的编程 53

6.22 关闭一个使用UDP的插口 54

6.21 使用UDP与服务器通信 54

6.20 对UDP使用connect 54

6.19 连接的和非连接的UDP插口 54

6.23 对UDP的部分关闭 55

6.24 关于UDP不可靠性的警告 55

6.25 小结 55

第7章 客户机软件举例 57

7.1 引言 57

7.2 小例子的重要性 57

7.3 隐藏细节 57

7.4 针对客户机程序的过程库例子 58

7.5 connect TCP的实现 58

7.6 connect UDP的实现 59

7.7 构成连接的过程 59

7.8 使用例子库 62

7.9 DAYTIME服务 63

7.10 针对DAYTIME的TCP客户机实现 63

7.12 TIME服务 65

7.11 从TCP连接中进行读 65

7.13 访问TIME服务 66

7.14 精确时间和网络时延 66

7.15 针对TIME服务的UDP客户机 66

7.16 ECHO服务 68

7.17 针对ECHO服务的TCP客 户机 68

7.18 针对ECHO服务的UDP客户机 70

7.19 小结 72

8.2 概念性的服务器算法 74

8.3 并发服务器和循环服务器 74

第8章 服务器软件设计的算法和问题 74

8.1 引言 74

8.4 面向连接的和无连接的访问 75

8.5 面向连接的服务器 75

8.6 无连接的服务器 76

8.7 故障、可靠性和无状态 76

8.8 优化无状态服务器 77

8.20 请求处理时间 79

8.9 四种基本类型的服务器 79

8.11 循环服务器的算法 80

8.12 一种循环的、面向连接的服务器的算法 80

8.13. 用INADDR__ANY绑定一个知名端口 80

8.14 将插口置于被动模式 81

8.15 接受连接并使用这些连接 81

8.16 一个循环的、无连接的服务器的算法 81

8.17 在无连接的服务器中构造一个应答 82

8.18 并发服务器的算法 82

8.19 主进程和从进程 83

8.20 并发的、无连接的服务器的算法 83

8.21 并发的、面向连接服务器的算法 84

8.22 把单独的程序作为从进程来使用 84

8.23 使用单个进程获得表面上的并发性 85

8.24 各服务器类型所适用的场合 85

8.25 服务器类型小结 86

8.26 重要问题——服务器死锁 87

8.27 其他的实现方法 88

8.28 小结 88

9.1 引言 90

9.2 创建一个被动插口 90

9.3 进程结构 93

9.4 TIME服务器举例 94

9.5 小结 95

10.2 分配一个被动的TCP插口 97

10.1 引言 97

10.3 用于DAYTIME服务的服务器 98

10.4 进程结构 98

10.5 DAYTIME服务器举例 99

10.6 关闭连接 101

10.7 连接终止和服务器的脆弱性 101

10.8 小结 102

11.3 循环与并发实现的比较 103

11.2 并发ECHO 103

11.1 引言 103

第11章 并发的、面向连接的服务器(TCP) 103

11.4 进程结构 104

11.5 并发ECHO服务器举例 104

11.6 清除游离(errant)进程 108

11.7 小结 108

第12章 单进程、并发服务器(TCP) 110

12.1 引言 110

12.2 服务器中的数据驱动处理 110

12.4 单个进程服务器的进程结构 111

12.3 用单个进程进行数据驱动处理 111

12.5 单进程ECHO服务器举例 112

12.6 小结 114

第13章 多协议服务器(TCP,UDP) 116

13.1 引言 116

13.2 减少服务器数量的动机 116

13.3 多协议服务器的设计 116

13.5 一个多协议DAYTIME服务器的例子 117

13.4 进程结构 117

13.6 共享代码的概念 120

13.7 并发多协议服务器 121

13.8 小结 121

第14章 多服务服务器(TCP,UDP) 123

14.1 引言 123

14.2 合并服务器 123

14.3 无连接的、多服务服务器的设计 123

14.4 面向连接的、多服务服务器的设计 124

14.5 并发的、面向连接的、多服务服务器 125

14.6 单进程的、多服务服务器的实现 125

14.7 从多服务服务器调用单独的程序 126

14.8 多服务、多协议设计 127

14.9 多服务服务器的例子 128

14.10 静态的和动态的服务器配置 134

14.11 UNIX超级服务器,inetd 135

14.12 inetd服务器的例子 137

14.13 小结 138

第15章 服务器并发性的统一、高效管理 140

15.1 引言 140

15.2 在循环设计和并发设计间选择 140

15.3 并发等级 141

15.4 需求驱动的并发 141

15.5 并发的代价 141

15.7 小时延可能出麻烦 142

15.6 额外开销和时延 142

15.8 进程预分配 143

15.8.1 UNIX中的预分配 143

15.8.2 面向连接服务器中的预分配 144

15.8.3 无连接服务器中的预分配 145

15.8.4 预分配、突发通信量和NFS 146

15.8.5 多处理器上的进程预分配 146

15.9 延迟的进程分配 146

15.11 技术的结合 147

15.10 两种技术统一的基础 147

15.12 小结 148

第16章 客户机中的并发 150

16.1 引言 150

16.2 并发的优点 150

16.3 运用控制的动机 150

16.4 与多个服务器的并发联系 151

16.5 实现并发客户机 152

16.6 单个进程的实现 152

16.7 一个使用ECHO的并发客户机例子 153

16.8 并发客户机的执行 158

16.9 例子代码中的并发性 159

16.10 小结 159

第17章 运输层和应用层的隧道技术 161

17.1 引言 161

17.2 多协议环境 161

17.3 混合网络技术 162

17.4 动态电路分配 163

17.5 封装和隧道技术 164

17.6 通过IP互联网的隧道技术 164

17.7 客户机和服务器之间的应用级隧道技术 165

17.8 隧道技术、封装和电话拔线 165

17.9 小结 166

第18章 应用级网关 168

18.1 引言 168

18.2 在受约束的环境中的客户机和服18.3 务器 168

18.3.1 多种技术的现实 168

18.3.2 有限功能的计算机 168

18.3.3 安全性引起的连通性约束 169

18.4 使用应用网关 169

18.5 通过邮件网关互操作 169

18.6 邮件网关的实现 170

18.7 应用网关与隧道技术的比较 171

18.8 应用网关和有限功能系统 172

18.9 为解决安全问题而18.10 使用的应用网关 173

18.11 应用网关和额外跳问题 174

18.12 应用网关举例 175

18.13 一个应用网关的实现 176

18.14 应用网关的代码 177

18.15 网关交换的例子 179

18.16 使用rfcd和UNIX的.forward文件 179

18.17 一个通用的应用网关 179

18.19 SLIRP如何处理连接 180

18.18 SLIRP的运行 180

18.20 IP寻址和SLIRP 181

18.21 小结 182

第19章 外部数据表示(XDR) 184

19.1 引言 184

19.2 计算机中的数据表示 184

19.3 N平方转换问题 185

19.4 网络标准字节序 185

19.6 XDR数据类型 186

19.5 外部数据表示的事实上的标准 186

19.7 隐含类型 187

19.8 使用XDR的软件支持 188

19.9 XDR库例程 188

19.10 一次一片地构造一个报文 188

19.11 XDR库中的转换例程 189

19.12 XDR流、I/O和TCP 191

19.13 记录、记录边界和数据报I/O 191

19.14 小结 192

第20章 远程过程调用(RPC)的概念 194

20.1 引言 194

20.2 远程过程调用模型 194

20.3 构建分布式程序的两种模式 194

20.4 传统的过程调用的概念性模型 195

20.5 过程模型的扩充 195

20.6 传统过程调用的执行和返回 196

20.7 分布式系统中的过程模型 197

20.8 客户机---服20.9 务器和RPC之间的类比 197

20.10 作为一个程序的分布式计算 198

20.11 Sun Microsystems的远程过程调用定义 199

20.12 远程程序和过程 199

20.13 减少参数的数量 200

20.14 标20.15 识远程程序和过程 200

20.16 适应远程程序的多个版本 202

20.17 远程程序中的互斥 202

20.18 通信语义 202

20.19 至少一次语义 203

20.20 RPC重传 203

20.21 将一个远程程序映射到一个协议端口 204

20.22 动态端口映射 204

20.23 RPC端口映射器算法 205

20.24 ONC RPC的报文格式 206

20.25 对远程过程进行参数序列化 207

20.26 鉴别 208

20.27 RPC报文表示的一个例子 209

20.28 UNIX鉴别字段的例子 209

20.27 小结 209

第21章 分布式程序的生成 212

21.2 使用远程过程调用 212

21.3 支持RPC的编程工具 213

21.4 将一个程序划分成本地过程和远程过程 214

21.5 为RPC增加代码 214

21.6 stub过程 215

21.7 多个远程过程和分派 215

21.8 客户机端的stub过程的名字 216

21.9 使用rpcgen生成分布式程序 217

21.10 rpcgen输出和接口过程 217

21.12 使用rpcgen构建客户机和服务器 218

21.11 rpcgen的输入和输出 218

21.13 小结 219

第22章 分布式程序的生成(rpcgen的例子) 221

22.1 引言 221

22.2 一个说明rpcgen的例子 221

22.3 查找字典 221

22.4 一个分布式程序的八个步骤 222

22.5 步骤1:构建一个常规的应用程序 223

22.6 步骤2:将程序划分成两部分 227

22.7 步骤3:创建一个rpcgen规格说明 232

22.8 步骤4:运行rpcgen 234

22.9 rpcgen产生的.h文件 234

22.10 rpcgen产生的XDR转换文件 235

22.11 rpcgen产生的客户机代码 236

22.12 rpcgen产生的服务器代码 237

22.13 步骤5:编写stub接口过程 240

22.13.1 客户机端接口例程 240

22.13.2 服务器端接口例程 242

22.14 步骤6:编译并链接客户机程序 244

22.15 步骤7:编译和链接服务器程序 247

22.16 步骤8:启动服务器和执行客户机 249

22.17 使用UNIX的make实用程序 249

22.18 小结 251

第23章 网络文件系统(NFS)的概念 253

23.1 引言 253

23.2 远程文件存取和传输 253

23.3 对远程文件的操作 254

23.4 异构计算机之间的文件存取 254

23.5 无状态服务器 254

23.6 NFS和UNIX的文件语义 254

23.7.2 无记录界限的字节序列 255

23.7.4 保护和存取 255

23.7.3 文件拥有者和组标识符 255

23.7.1 基本定义 255

23.7 UNIX文件系统的回顾 255

23.7.5 打开-读-写-关闭范例 256

27.20 等待一个子进程退出 256

23.7.6 数据传输 257

23.7.7 允许搜索目录 257

23.7.8 随机存取 258

23.7.9 搜索超过文件的结束 258

23.710 文件位置和并发存取 258

23.7.11 在并发存取时的 写(write) 语义 259

23.7.12 文件名和路径 260

23.7.13 索引结点(inode):存储在文件中的信息 260

23.7.14 stat操作 261

23.7.15 文件命名机制 262

23.7.16 文件系统mount 262

23.7.17 UNIX文件名解析 264

23.9 NFS的文件类型 265

23.8 NFS下的文件 265

23.7.18 符号链接 265

23.10 NFS文件模式 266

23.11 NFS文件属性 267

23.12 NFS客户机和服务器 267

23.13 NFS客户机操作 268

23.14 NFS客户机与UNIX 269

23.15 NFS mount 269

23.16 文件句柄 270

23.17 句柄取代路径名 271

23.19 无状态服务器的文件定位 272

23.20 对目录的操作 272

23.18 在UNIX中的NFS客户机 272

23.21 无状态地读目录 273

23.22 NFS服务器中的多个分层结构 273

23.23 安装(mount)协议 274

23.24 小结 274

24.3 用数据结构和过程定义协议 276

第24章 网络文件系统协议(NFS,mount) 276

24.2 用RPC定义协议 276

24.1 引言 276

24.4 NFS常数、类型和数据声明 277

24.4.1 NFS常数 277

24.4.2 NFS的typedef声明 278

24.4.3 NFS数据结构 278

24.5 NFS过程 280

24.6 NFS操作的语义 281

24.6.1 NFSPROC__NULL(过程0) 281

24.6.2 NFSPROC__GETATTR(过程1) 281

24.6.3 NFSPROC__SETATTR(过程2) 281

24.6.4 NFSPROC__ROOT(过程3)〔在NFS3中已经不用〕 281

24.6.5 NFSPROC__LOOKUP(过程4) 281

24.6.6 NFSPROC__READLINK(过程5) 281

24.6.12 NFSPROC__RENAME(过程11) 282

24.6.11 NFSPROC__REMOVE(过程10) 282

24.6.13 NFSPROC__LINK(过程12) 282

24.6.14 NFSPROC__SYMLINK(过程13) 282

24.6.8 NFSPROC__WRITECACHE(过程7) 〔在NFS3中已经不用〕 282

24.6.7 NFSPROC__READ(过程6) 282

24.6.10 NFSPROC__CREATE(过程9) 282

24.6.9 NFSPROC__WRITE(过程8) 282

24.6.18 NFSPROC__STATFS(过程17) 283

24.7 安装协议 283

24.6.15 NFSPROC__MKDIR(过程14) 283

24.6.17 NFSPROC__READDIR(过程16) 283

24.6.16 NFSPROC__RMDIR(过程15) 283

24.7.1 安装协议的常数定义 284

24.7.2 安装协议的类型定义 284

24.7.3 安装数据结构 284

24.8 安装协议中的过程 285

24.9 安装操作的语义 285

24.9.5 MNTPROC_UMNTALL(过程4) 286

24.10 NFS和安装鉴别 286

24.9.6 MNTPROC_EXPORT(过程5) 286

24.9.4 MNTPROC_UMNT(过程3) 286

24.9.3 MNTPROC_DUMP(过程2) 286

24.9.2 MNTPROC_MNT(过程1) 286

24.9.1 MNTPROC_NULL(过程0) 286

24.11 NFS版本3中的改变 287

24.12 小结 288

第25章 TELNET客户机(程序结构) 290

25.1 引言 290

25.2 概述 290

25.2.2 命令和控制信息 290

25.2.1 用户终端 290

25.2.3 终端、窗口和文件 291

25.2.4 对并发性的需要 291

25.2.5 TELNET客户机的一个过程模型 292

25.3 TELNET客户机算法 292

25.4 UNIX中的终端I/O 293

25.4.1 控制设备驱动器 294

25.5 建立终端模式 295

25.6 用于保存状态的全局变量 296

25.7 在退出之前恢复终端模式 297

25.8 客户机挂起与恢复 298

25.9 有限状态机的规格说明 299

25.11 选项协商 300

25.10 在TELNET数据流中嵌入命令 300

25.12 请求/提供的对称性 301

25.13 TELNET字符定义 301

25.14 针对来自服务器数据的有限状态机 302

25.15 在各种状态之间转移 303

25.16 有限状态机的实现 304

25.17 压缩的FSM表示 304

25.18 在运行时维持压缩表示 306

25.19 压缩表示的实现 306

25.20 构造FSM转移矩阵 308

25.21 插口输出有限状态机 309

25.22 插口输出FSM的相关定义 311

25.23 选项子协商有限状态机 312

25.24 选项子协商FSM的相关定义 313

25.25 FSM初始化 313

25.26 TELNET客户机的参数 314

25.27 TELNET客户机的核心 315

25.28 主FSM的实现 319

25.29 小结 320

第26章 TELNET客户机(实现细节) 322

26.1 引言 322

26.2 FSM动作过程 322

26.3 记录选项请求的类型 322

26.4 完成空操作 323

26.5 对回显选项的WILL/WONT做出响应 323

26.6 对未被支持之选项的WILL/WONT做出响应 325

26.7 对no go--ahead选项的WILL/WONT做出响应 326

26.8 生成用于二进制传输的DO/DONT 327

26.9 对未被支持的选项的DO/DONT做出响应 328

26.10 对传输二进制选项的DO/DONT做出响应 328

26.11 对终端类型选项的DO/DONT做出响应* 329

26.12 选项子协商 331

26.13 发送终端类型信息 332

26.14 终止子协商 333

26.15 向服务器发送字符 334

25.16 显示在用户终端上出现的入数据 335

26.17 使用termcap控制用户终端 338

26.18 将数据块写到服务器 339

26.19 与客户机进程交互 340

26.20 对非法命令做出响应 341

26.21 脚本描述文件 341

26.22 脚本描述的实现 342

26.23 初始化脚本描述 342

26.24 收集脚本文件名的字符 343

26.25 打开脚本文件 344

26.26 终止脚本描述 345

26.27 打印状态信息 346

26.28 小结 348

27.1 引言 349

27.2 后台操作 349

第27章 UNIX服务器中的实用技巧和技术 349

27.3 编写在后台运行的服务器 350

27.4 打开描述符和继承 351

27.5 对服务器编程以关闭所继承的描述符 351

27.6 来自控制TTY的信号 351

27.7 对服务器编程以改变它的控制TTY 351

27.8 转移到一个安全的和已知的目录 352

27.9 对服务器编程以改变目录 352

27.10 UNIX umask 352

27.11 对服务器编程以设置其umask 353

27.12 进程组 353

27.13 对服务器编程以设置其进程组 353

27.14 用于标准I/O的描述符 353

27.15 对服务器编程以打开标准描述符 354

27.16 服务器用的互斥 354

27.17 对服务器编程以避免多个副本 354

27.18 记录服务器的进程ID 355

27.19 对服务器编程以记录其进程ID 355

27.21 对服务器编程以等待每个子进程退出 356

27.22 外来信号 356

27.23 对服务器编程以忽略外来信号 356

27.24 使用系统日志设施 356

27.24.1 产生日志报文 356

27.24.3 I/O重定向的限制 357

27.24.4 客户机-服务器的解决方案 357

27.24.2 间接方式和标准差错的优点 357

27.24.5 syslog机制 358

27.24.6 syslog的报文类 358

27.24.7 syslog的设施 358

27.24.8 sylog优先级 359

27.24.9 使用syslog 359

27.24.10 syslog配置文件举例 360

27.25 小结 361

28.2 死锁的定义 363

第28章 客户机-服务器系统中的死锁和饿死 363

28.1 引言 363

28.3 死锁检测的难度 364

28.4 避免死锁 364

28.5 一个客户机和服务器间的死锁 364

28.6 在单个交互避免死锁 365

28.7 一组客户机和一个服务器之间的饿死 365

28.8 忙连接和饿死 366

28.9 避免阻塞的操作 366

28.10 进程、连接和其他限制 367

28.11 客户机和服务器的循环 367

28.12 用文档确认依赖性 368

28.13 小结 368

附录1 系统调用与插口使用的库例程 370

附录2 UNIX文件和插口描述符的操作 400

参考文献 403