第1章 引言与概述 1
1.1TCP/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.3进程的优先级 6
2.4进程的同步通信 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 ARP高速缓存的管理 42
4.7.1高速缓存表项的分配 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.5路由的生成源及保持时间 70
6.6为数据报选择路由 70
6.6.1实用过程 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章 IP:分片与重组 85
7.1引言 85
7.2数据报的分片 85
7.2.1为一个数据报片再次分片 85
7.3分片的实现 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章 IP:差错处理(ICMP) 101
8.1引言 101
8.2 ICMP报文格式 101
8.3 ICMP报文的实现 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章 IP:组播处理(IGMP) 119
9.1引言 119
9.2维护组播主机群的成员信息 119
9.3主机群表 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
9.17小结 137
深入研究 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 TCB的分配及初始化 163
11.9.1分配一个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章 TCP:有限状态机的实现 175
12.1引言 175
12.2 CLOSED状态处理 175
12.3从容关闭 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.4作为一个进程的TCP输出 201
13.5 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.12 RETRANSMIT(重发)状态的实现 206
13.13发送一个报文段 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.4定时器、事件和报文 220
14.5 TCP定时器进程 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重发定时器和退避 230
15.4.1 Karn算法 230
15.4.2重发输出状态的处理 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平均往返时间估值及超时 242
15.9.1一种快速平均值更新算法 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.4.2数据标记解释法 252
16.5为Berkeley紧急指针解释法而进行的配置 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.3作为设备的TCP连接 262
17.4 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.6接受来自被动设备的连接 279
17.7.7改变LISTEN队列的长度 279
17.7.8获取从设备中的统计数据 280
17.7.9设置或清除TCP选项 282
17.8从设备的初始化 283
17.9小结 284
深入研究 284
习题 284
第18章 RIP:主动路由传播和被动获取 286
18.1引言 286
18.2主动和被动模式的参与者 286
18.3基本的RIP算法和费用度量 286
18.4不稳定性及解决方案 287
18.4.1计数到无穷大 287
18.4.2网关瘫痪和路由超时 288
18.4.3水平划分 288
18.4.4毒性逆转 288
18.4.5具有毒性逆转的路由超时 289
18.4.6触发更新 289
18.4.7随机化以防止广播风暴 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处理EXSTA RT状态下的分组 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 MIB变量 359
20.3.1表格中的字段 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 ASN.1表示形式的处理 382
20.17.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