《用TCP/IP进行网际互联 第2卷 设计、实现与内核 第3版》PDF下载

  • 购买积分:16 如何计算积分?
  • 作  者:(美)Douglas E.Comer,(美)David L.Stevens著;张娟等译
  • 出 版 社:北京:电子工业出版社
  • 出版年份:2001
  • ISBN:7505366300
  • 页数:520 页
图书介绍:道格拉斯·科默(DotJglas E.Corner)博士是美国普渡大学(Purdue University)计算机科学系资深教授,美国计算机学会(ACM)会员,精通软、硬件,曾开发过包括TCP/IP协议软件、编译程序、设备驱动程序和操作系统在内的许多低层的软件系统,曾在贝尔实验室制作过VLSI芯片。科默是因特网体系结构委员会(IAB)的成员,在因特网的形成过程中立下了汗马功劳,目前是计算机诸多领域的领军人物。在教学大纲制定和实验室筹建方面,科默堪称先驱,他的著作已被翻译成16种文字出版。科默在业界咨询工作中声明远扬,为全世界成千上万的专业工程师和学生答疑解惑,时任Software:Practice and Experience杂志主编。

第1章 引言与概述 1

1.1 TCP/IP协议 1

1.2 了解细节的必要性 1

1.3 协议间交互作用的复杂性 1

1.4 本书采用的方法 2

1.5 研究代码的重要性 2

1.6 Xinu操作系统 2

1.7 本书其余部分的组织 3

1.8 小结 3

深入研究 4

第2章 操作系统中的TCP/IP软件结构 5

2.1 引言 5

2.2 进程的概念 5

2.4 进程的同步通信 6

2.3 进程的优先级 6

2.5 进程间通信 8

2.5.1 端口 8

2.5.2 消息传送 9

2.6 设备驱动程序和输入、输出程序 9

2.7 网络的输入和中断 10

2.8 向高层协议传递分组 11

2.9 IP协议与传输协议之间的数据报传递 12

2.9.1 将传入的数据报发送给TCP 12

2.9.2 将传入的数据报发送给UDP 12

2.10 向应用程序的传递操作 13

2.11 输出时的信息流 13

2.12 从TCP经过IP到网络输出 14

2.13 UDP输出处理 15

2.14 小结 15

习题 16

深入研究 16

第3章 网络接口层 18

3.1 引言 18

3.2 网络接口抽象模型 18

3.2.1 接口数据结构 18

3.3 以太网的基本定义 21

3.3.1 应用中的统计数据 24

3.4 接口的逻辑状态 24

3.5 本地主机接口 24

3.6 缓冲区管理 25

3.6.1 大缓冲区方案 25

3.6.2 链表方案(mbuf) 26

3.6.3 方案举例 26

3.6.4 有关缓冲区的其他议题 26

3.7 传入分组的多路分解 27

3.8 小结 28

深入研究 29

习题 29

第4章 地址的发现及绑定(ARP) 30

4.1 引言 30

4.2 ARP软件在理论上的结构 30

4.3 ARP设计方案举例 30

4.4 ARP高速缓存的数据结构 31

4.5 ARP输出处理 34

4.5.1 搜索ARP高速缓存 34

4.5.2 ARP请求分组的广播 35

4.5.3 输出过程 36

4.6 ARP输入处理 38

4.6.1 向表中增加已转换的表项 38

4.6.2 发送等待发送的分组 39

4.6.3 ARP输入过程 40

4.7.1 高速缓存表项的分配 42

4.7 ARP高速缓存的管理 42

4.7.2 高速缓存的定期维护管理 43

4.7.3 释放队列中的分组 44

4.8 ARP初始化 45

4.9 ARP参数配置 46

4.10 小结 46

深入研究 47

习题 47

第5章 IP:软件的总体结构 48

5.1 引言 48

5.2 中心环节 48

5.3 IP软件设计思想 48

5.4 IP软件结构和数据报流程 49

5.4.1 选择传入数据报的策略 49

5.4.2 允许IP进程被阻塞 51

5.4.3 IP使用的常量的定义 54

5.4.4 校验和的计算 57

5.4.5 处理定向广播 57

5.4.6 识别一个广播地址 59

5.5 IP首部中的字节顺序 60

5.6 向IP发送数据报 61

5.6.1 发送本地生成的数据报 61

5.6.2 发送传入数据报 63

5.7 表格的维护 63

5.8 小结 65

深入研究 65

习题 65

第6章 IP:选路表和选路算法 67

6.1 引言 67

6.2 路由维护和查找 67

6.3 选路表结构 67

6.4 选路表数据结构 68

6.6 为数据报选择路由 70

6.6.1 实用过程 70

6.5 路由的生成源及保持时间 70

6.6.2 获得一个路由 73

6.6.3 数据结构初始化 74

6.7 选路表的定期维护 75

6.7.1 增加路由 77

6.7.2 删除路由 80

6.8 IP选项处理 82

6.9 小结 83

深入研究 83

习题 84

7.2 数据报的分片 85

7.3 分片的实现 85

7.2.1 为一个数据报片再次分片 85

7.1 引言 85

第7章 IP:分片与重组 85

7.3.1 发送一个数据报片 87

7.3.2 复制数据报首部 89

7.4 数据报的重组 90

7.4.1 数据结构 90

7.4.2 互斥操作 91

7.4.3 在链表中加入一个数据报片 91

7.4.4 溢出时的丢弃 93

7.4.5 测试一个完整的数据报 94

7.4.6 将数据报片组装成完整的数据报 96

7.5 数据报片链表的维护管理 97

7.6 初始化 99

7.7 小结 99

深入研究 100

习题 100

8.2 ICMP报文格式 101

8.3 ICMP报文的实现 101

第8章 IP:差错处理(ICMP) 101

8.1 引言 101

8.4 传入ICMP报文的处理 103

8.5 ICMP重定向报文的处理 105

8.6 设置子网掩码 107

8.7 为一个ICMP分组选择源地址 108

8.8 生成ICMP差错报文 109

8.9 避免出现关于差错报文的差错报文 111

8.10 为ICMP报文分配缓冲区 112

8.11 ICMP报文中的数据部分 114

8.12 ICMP重定向报文的生成 116

8.13 小结 117

深入研究 117

习题 117

9.2 维护组播主机群的成员信息 119

9.3 主机群表 119

9.1 引言 119

第9章 IP:组播处理(IGMP) 119

9.4 查找一个主机群 121

9.5 向主机群表中增加一个表项 122

9.6 为一个组播地址设置网络接口 124

9.7 IP组播地址和硬件组播地址之间的转换 125

9.8 从主机群表中删除一个组播地址 126

9.9 加入一个主机群 127

9.10 维持与一个组播路由器的联系 129

9.11 IGMP成员关系报告的实现 130

9.12 计算随机时延 131

9.13 发送IGMP报告的进程 132

9.14 处理输入的IGMP报文 133

9.15 脱离主机群 134

9.16 IGMP数据结构的初始化 136

习题 137

9.17 小结 137

深入研究 137

第10章 UDP:用户数据报 138

10.1 引言 138

10.2 UDP端口和多路分解处理 138

10.2.1 成对通信使用的端口 138

10.2.2 多对一通信使用的端口 138

10.2.3 操作模式 139

10.2.4 多路分解处理中的细节问题 139

10.3 UDP的输入处理 141

10.3.1 UDP数据结构的说明 141

10.3.2 传入数据报队列的说明 142

10.3.3 UDP端口号与队列的映射 144

10.3.4 分配空闲队列 144

10.3.5 网络字节顺序与本机字节顺序之间的相互转换 145

10.3.6 处理一个已到达的数据报 146

10.3.7 UDP校验和的计算 148

10.4 UDP输出的处理 149

10.4.1 一个UDP数据报的发送 150

10.5 小结 151

深入研究 152

习题 152

第11章 TCP:数据结构和输入处理 153

11.1 引言 153

11.2 TCP软件概览 153

11.3 传输控制块 153

11.4 TCP报文段格式 158

11.5 序列空间中的比较 159

11.6 TCP有限状态机 160

11.7 状态变迁举例 160

11.8 有限状态机的说明 161

11.9.1 分配一个TCB 163

11.9 TCB的分配及初始化 163

11.9.2 释放一个TCB 164

11.10 有限状态机的实现 165

11.11 处理一个输入报文段 165

11.11.1 将TCP首部转换为本地字节顺序 167

11.11.2 计算TCP的校验和 168

11.11.3 为报文段查找对应的TCB 169

11.11.4 检查报文段的有效性 171

11.11.5 为当前状态选择一个过程 172

11.12 小结 173

深入研究 173

习题 173

12.2 CLOSED状态处理 175

12.3 从容关闭 175

12.1 引言 175

第12章 TCP:有限状态机的实现 175

12.4 关闭后的延迟计时 176

12.5 TIME-WAIT状态处理 177

12.6 CLOSING状态处理 178

12.7 FIN-WAIT-2状态处理 179

12.8 FIN-WAIT-1状态处理 180

12.9 CLOSE-WAIT状态处理 181

12.10 LAST-ACK状态处理 182

12.11 ESTABLISHED状态处理 183

12.12 处理报文段中的紧急数据 184

12.13 处理报文段中的其他数据 186

12.14 经常注意已接收的八位组 188

12.15 终止一个TCP连接 190

12.16 建立TCP连接 191

12.17 初始化TCB 191

12.18 SYN-SENT状态处理 193

12.19 SYN-RECEIVED状态处理 194

12.20 LISTEN状态处理 196

12.21 为一个新TCB初始化窗口变量 197

12.22 小结 199

深入研究 199

习题 199

第13章 TCP:输出处理 200

13.1 引言 200

13.2 TCP输出控制的复杂性 200

13.3 TCP输出的四种状态 200

13.5 TCP输出报文 201

13.4 作为一个进程的TCP输出 201

13.6 对输出状态和TCB编号的编码 202

13.7 TCP输出进程的实现 202

13.8 互斥操作 203

13.9 IDLE状态的实现 203

13.10 PERSIST状态的实现 204

13.11 TRANSMIT状态的实现 205

13.13 发送一个报文段 206

13.12 RETRANSMIT(重发)状态的实现 206

13.14 计算TCP数据长度 210

13.15 序号计算 210

13.16 其他TCP过程 211

13.16.1 发送复位 211

13.16.2 转换成网络字节顺序 213

13.16.3 等待输出缓冲空间 213

13.16.4 唤醒等待TCB的进程 214

13.16.5 选择初始序号 216

13.17 小结 217

深入研究 217

习题 217

第14章 定时器管理 218

14.1 引言 218

14.2 定时事件的通用数据结构 218

14.3 TCP事件使用的数据结构 219

14.5 TCP定时器进程 220

14.4 定时器、事件和报文 220

14.6 删除TCP定时器事件 222

14.7 删除一个TCB的所有事件 223

14.8 确定出现一个事件的尚需时间 224

14.9 插入TCP定时器事件 225

14.10 启动无时延的TCP输出 227

14.11 小结 227

深入研究 228

习题 228

第15章 流量控制和自适应重发 229

15.1 引言 229

15.2 自适应重发中的难题 229

15.3 自适应重发的调整 229

15.4.1 Karn算法 230

15.4.2 重发输出状态的处理 230

15.4 重发定时器和退避 230

15.5 基于窗口的流量控制 231

15.5.1 糊涂窗口综合症 232

15.5.2 接收方预防糊涂窗口 232

15.5.3 零窗口之后的性能优化 233

15.5.4 调整发送方的窗口 233

15.6 最大报文段长度的计算 235

15.6.1 发送方的最大报文段长度 235

15.6.2 选项处理 236

15.6.3 通告一个最大输入报文段长度 238

15.7 网络拥塞预防与控制 239

15.7.1 成倍递减法 239

15.8 慢启动和拥塞预防 239

15.8.1 慢启动 239

15.8.2 超过上限后减速递增 240

15.8.3 递增拥塞窗口尺寸的实现 240

15.9.1 一种快速平均值更新算法 242

15.9 平均往返时间估值及超时 242

15.9.2 传入确认的处理 243

15.9.3 为窗口外的数据创建确认报文段 245

15.9.4 接收到一个确认后改变输出状态 246

15.10 技巧和注意事项 247

15.11 小结 247

深入研究 248

习题 248

第16章 紧急数据处理和推功能 250

16.1 引言 250

16.2 带外信令 250

16.3 紧急数据 250

16.4 标准的解释 250

16.4.1 带外数据的解释法 251

16.5 为Berkeley紧急指针解释法而进行的配置 252

16.4.2 数据标记解释法 252

16.6 通知应用程序 253

16.6.1 多个并发应用程序 253

16.7 从TCP中读取数据 254

16.8 发送紧急数据 255

16.9 TCP的推功能 256

16.10 在失序交付时对推数据的解释 257

16.11 输入时推功能的实现 257

16.12 小结 258

深入研究 258

习题 259

第17章 套接层的接口 260

17.1 引言 260

17.2 通过设备形成的接口 260

17.2.1 单字节I/O 261

17.2.2 其他一些非传送的函数 261

17.4 TCP客户程序举例 262

17.3 作为设备的TCP连接 262

17.5 TCP服务器程序举例 263

17.6 TCP主设备的实现 265

17.6.1 TCP主设备打开功能 265

17.6.2 被动TCP连接的形成 266

17.6.3 主动TCP连接的形成 267

17.6.4 分配一个未使用的本地端口 268

17.6.5 主动连接的完成 269

17.6.6 TCP主设备的控制 271

17.7 TCP从设备的实现 271

17.7.1 由TCP从设备输入数据 271

17.7.2 由TCP从设备输入单字节 273

17.7.3 通过TCP从设备的输出 274

17.7.4 TCP连接的关闭 276

17.7.5 TCP从设备的控制操作 278

17.7.7 改变LISTEN队列的长度 279

17.7.6 接受来自被动设备的连接 279

17.7.8 获取从设备中的统计数据 280

17.7.9 设置或清除TCP选项 282

17.8 从设备的初始化 283

17.9 小结 284

深入研究 284

习题 284

18.2 主动和被动模式的参与者 286

18.3 基本的RIP算法和费用度量 286

18.1 引言 286

第18章 RIP:主动路由传播和被动获取 286

18.4 不稳定性及解决方案 287

18.4.1 计数到无穷大 287

18.4.2 网关瘫痪和路由超时 288

18.4.3 水平划分 288

18.4.4 毒性逆转 288

18.4.7 随机化以防止广播风暴 289

18.4.5 具有毒性逆转的路由超时 289

18.4.6 触发更新 289

18.5 报文类型 290

18.6 协议特性 290

18.7 RIP的具体实现 291

18.7.1 实现的两种形式 291

18.7.2 定义 291

18.7.3 输出的理论结构 293

18.8 基本RIP进程 294

18.8.1 “必须为零”的字段内容必须为零 295

18.8.2 处理一个传入响应 296

18.8.3 在更新期间的锁定 298

18.8.4 验证一个地址 298

18.9 对输入请求的响应 299

18.10 生成更新报文 300

18.11 初始化一个更新报文的副本 301

18.11.1 向更新报文的副本中添加路由 302

18.11.2 计算一个待通告的费用值 304

18.11.3 为RIP报文分配数据报 305

18.12 生成定期的RIP输出 306

18.13 RIP的局限性 307

18.14 小结 307

深入研究 307

习题 307

第19章 OSPF:使用SPF算法的路由传播 308

19.1 引言 308

19.2 OSPF配置和选项 308

19.3 OSPF的图论模型 308

19.4 OSPF的说明 311

19.4.1 OSPF分组格式的说明 311

19.4.2 OSPF接口说明 313

19.4.3 全局常量和数据结构的说明 314

19.5 邻接关系和链路状态信息的传播 316

19.6 用Hello发现相邻网关 317

19.7 Hello分组的发送 319

19.7.1 Hello分组的一个模板 320

19.7.2 Hello分组输出进程 321

19.8 指定路由器 323

19.9 选出一个指定路由器 324

19.10 变动之后重建邻接关系 327

19.11 处理到达的Hello分组 329

19.12 在相邻网关表中增加一个网关 331

19.13 相邻网关状态的变迁 332

19.14 OSPF定时器事件和重发 333

19.15 判断是否允许邻接关系 335

19.16 OSPF输入的处理 336

19.17 链路状态处理中的说明和过程 339

19.18 数据库描述分组的生成 341

19.19 创建一个模板 343

19.20 传送数据库描述分组 344

19.21 处理到达的数据库描述分组 345

19.21.1 处理EXSTART状态下的分组 347

19.21.2 处理EXCHNG状态下的分组 348

19.21.3 处理FULL状态下的分组 349

19.22 处理链路状态请求分组 350

19.23 建立链路状态概要信息 352

19.24 OSPF实用过程 354

19.25 小结 356

深入研究 357

习题 357

第20章 SNMP:MIB变量、表示形式和绑定 358

20.1 引言 358

20.2 服务器的组织和名字的映射 358

20.3.1 表格中的字段 359

20.3 MIB变量 359

20.4 MIB变量名 360

20.4.1 变量名的数字表示形式 360

20.5 名字之间的字典顺序 360

20.6 除去前缀 361

20.7 在MIB变量上执行的操作 361

20.8 表格名 362

20.9 名字体系概念上的线索 362

20.10 MIB变量的数据结构 363

20.10.1 使用独立的函数完成操作 365

20.11 用于快速查找的数据结构 365

20.12 散列表的实现 366

20.13 MIB绑定的描述 366

20.14 绑定中使用的内部变量 373

20.15 散列表的查找 374

20.16 SNMP的结构和常量 376

20.17.1 长度表示法 382

20.17 ASN.1表示形式的处理 382

20.17.2 将整数转换为ASN.1格式 384

20.17.3 将对象标识符转换为ASN.1格式 386

20.17.4 用于转换对象值的例程 389

20.18 小结 391

深入研究 391

习题 392

第21章 SNMP:客户与服务器 393

21.1 引言 393

21.2 服务器中数据的表示形式 393

21.3 服务器的实现 393

21.4 对SNMP报文的分析 396

21.5 绑定链表中ASN.1名字的转换 400

21.6 解析一个请求 401

21.7 对get-next操作的解释 404

21.8 操作的间接执行 404

21.9 表格的间接寻址 407

21.10 应答报文的反向生成 408

21.11 将内部格式转换为ASN.1表示形式 410

21.12 服务器使用的实用函数 412

21.13 一个SNMP客户的实现 413

21.14 变量初始化 415

21.15 小结 417

深入研究 417

习题 417

第22章 SNMP:表格访问函数 419

22.1 引言 419

22.2 表格访问 419

22.3 表格的对象标识符 419

22.4 地址人口表函数 420

22.4.1 对地址人口表的get操作 421

22.4.2 对地址人口表的get-first操作 423

22.4.3 对地址人口表的get-next操作 424

22.4.4 地址入口表中的递增搜索 425

22.4.5 对地址人口表的set操作 426

22.5 地址转换表函数 426

22.5.1 对地址转换表的get操作 428

22.5.2 对地址转换表的get-first操作 429

22.5.3 对地址转换表的get_next操作 431

22.5.4 地址转换表中的递增搜索 432

22.5.5 乱中有序 433

22.5.6 对地址转换表的set操作 434

22.6 网络接口表的函数 435

22.6.1 接口表标识符的匹配 435

22.6.2 对网络接口表的get操作 436

22.6.3 对网络接口表的get-first操作 440

22.6.4 对网络接口表的get-next操作 441

22.6.5 对网络接口表的set操作 442

22.7 选路表函数 443

22.7.1 对选路表的get操作 444

22.7.2 对选路表的get-first操作 446

22.7.3 对选路表的get-next操作 447

22.7.4 选路表中的递增搜索 449

22.7.5 对选路表的set操作 450

22.8 TCP连接表函数 452

22.8.1 对TCP连接表的get操作 453

22.8.2 对TCP连接表的get-first操作 455

22.8.3 对TCP连接表的get-next操作 456

22.8.4 TCP连接表中的递增搜索 457

22.8.5 对TCP连接表的set操作 458

22.9 UDP Listener表 460

22.9.1 对UDP Listener表的get操作 461

22.9.2 对UDP Listener表的get-first操作 462

22.9.3 对UDP Listener表的get-next操作 463

22.9.4 UDP Listener表中的递增搜索 464

22.9.5 对UDP Listener表的set操作 465

22.10 IP地址转换的实用例程 466

22.11 小结 467

深入研究 467

习题 468

第23章 实现的回顾 469

23.1 引言 469

23.2 程序代码统计分析 469

23.3 各个协议的程序代码行数 469

23.4 每个协议所需的函数和过程 470

23.5 小结 471

习题 471

附录1 过程调用交叉参考表 473

附录2 程序代码中使用到的C数据结构交叉参考表 493

附录3 程序代码中使用到的Xinu函数和常量 498

参考文献 513