第一篇 Linux内核 2
第1章 推动因素 2
1.1 Linux操作系统 3
1.2 什么是Linux 4
1.3 使用Linux的理由 4
第2章 内核结构 7
2.1 整体式体系结构和微内核 8
2.2 Linux内核中的活动 9
2.2.1 进程和系统调用 10
2.2.2 硬件中断 11
2.2.3 软件中断 12
2.2.4 任务蕾 12
2.2.5 下半区 13
2.3 加锁——原子运算 14
2.3.1 位运算 15
2.3.2 环形锁 16
2.3.3 读写环形锁 17
2.3.4 信号量 18
2.4 内核模块 18
2.4.1 内核模块的管理 19
2.4.3 在加载模块时传递参数 21
2.4.2 模块功能的注册和注销 21
2.4.4 内核符号表和模块 22
2.5 设备驱动程序 23
2.6 内核中的存储管理 26
2.6.1 精选的存储管理函数 26
2.6.2 缓存 27
2.7 Linux内核中的定时 28
2.7.1 标准定时器 29
2.7.2 使用APIC作为高解析频率定时器 30
2.8 proc文件系统 33
2.9 版本化 36
3.1 基于层的通信模型 38
第二篇 网络实现的体系结构 38
第3章 通信系统的体系结构 38
3.1.1 ISO/OSI参考模型 39
3.1.2 TCP/IP参考模型 40
3.2 服务和协议 41
第4章 管理内核中的网络报文 44
4.1 套接字缓存 44
4.1.1 套接字缓存上的操作 48
4.1.2 其他函数 53
4.2 套接字缓存队列 53
第5章 网络设备 57
5.1 net_device接口 58
5.2 管理网络设备 66
5.2.1 网络设备的注册与注销 67
5.2.2 网络设备的开启与关闭 69
5.2.3 创建和寻找网络设备 70
5.2.4 为状态改变而设计的通知链 72
5.2.5 在网络设备上进行传输 73
5.3 网络设备 73
5.3.1 初始化网络适配器 74
5.3.2 打开和关闭网络适配器 79
5.3.3 传输数据 81
5.3.4 包传输过程中的问题 87
5.3.5 运行时配置 88
5.3.6 适配器相关的ioctl()命令 89
5.3.7 网络设备的统计信息 90
5.3.8 适配器层次的多播支持 91
第三篇 第Ⅰ+Ⅱ层——介质访问和逻辑链路层 94
第6章 数据链路层简介 94
6.1 数据链路层的结构 94
6.2 数据链路层上的进程 96
6.2.1 数据包的接收 98
6.2.2 数据包的传输 100
6.3 第3层协议的管理 103
第7章 串行线路Internet协议(SLIP) 107
7.1 简介 107
7.2 Linux内核中的SLIP实现 109
7.2.1 TTY设备和线路规范 109
7.2.2 一般过程 111
7.2.3 函数和数据结构 112
7.2.4 驱动器的初始化及连接的建立 115
7.2.5 网络设备的激活及撤销 116
7.2.6 拆除连接及取消驱动器的初始化 116
7.2.7 IP数据包的传输 116
7.2.8 IP数据包的接收 117
第8章 点对点协议(PPP) 118
8.1 简介 118
8.1.1 子协议 118
8.1.2 Linux实现的组成部分 119
8.2 Linux中的PPP配置 120
8.2.1 内核选项 120
8.2.2 pppd—PPP守护程序 121
8.2.3 Dial on Demand 122
8.2.4 自动回叫 122
8.3 Linux内核中的PPP实现 122
8.3.1 通用PPP驱动程序的功能和数据结构 122
8.3.2 异步PPP驱动程序的函数和数据结构 125
8.3.3 初始化 127
8.3.4 发送IP包 127
8.3.5 检测帧边界 127
8.3.6 接收IP包 128
8.4 实现PPP守护程序 129
8.4.1 管理子协议 129
8.4.2 状态 130
第9章 以太网上的PPP技术 132
9.1 简介 132
9.2 RFC 2516中的PPPOE规范 132
9.3 用户空间中的实现 133
9.4 Liniux内核中的实现 134
9.4.1 内核的变化 134
9.4.2 ppp守护程序的任务 136
9.4.3 配置 137
第10章 异步传输模式——ATM 138
10.1 简介 138
10.2 在linux中实现ATM 138
10.2.1 永久性虚拟通道 139
10.2.2 有信号虚拟通道 142
10.2.3 ATM设备驱动程序 144
10.2.4 进一步的ATM支持 145
10.3 配置 146
第11章 Linux中的蓝牙 147
11.1 主机控制器接口(HCI) 148
11.1.1 指令封包 149
11.1.2 事件封包 149
11.1.3 数据封包 150
11.1.4 访问主机控制器接口 151
11.2 L2CAP 151
11.2.1 连接建立阶段 152
11.2.2 配置阶段 153
11.2.3 数据传输阶段 153
11.3 其他协议 154
第12章 透明桥 155
12.1 介绍 155
12.2 基本概念 155
12.2.1 透明桥的属性 156
12.2.2 转发函数 157
12.2.3 学习功能 158
12.2.4 生成树协议 158
12.3 在Linux下配置桥 163
12.3.1 配置内核和网络适配器 163
12.3.2 用brctl工具配置Linux桥 163
12.3.4 配置实例 164
12.3.3 检查桥功能 164
12.4 实现 166
12.4.1 桥实现的体系结构 166
12.4.2 生成和连接重要的数据结构 167
12.4.3 包在内核中的路径 168
12.4.4 学习新MAC地址 170
12.4.5 实现生成树协议 171
第四篇 网络层 182
第13章 推动因素 182
Internet协议族 182
14.1.1 在路由器之间路由IP包 185
14.1 IP的属性 185
第14章 IPv4 185
14.1.2 IP包头 186
14.1.3 IP数据包的生存期 188
14.1.4 Internet上的寻址 188
14.1.5 IP地址和IP地址分类 188
14.2 IP的实现 190
14.2.1 传入IP包的路径 192
14.2.2 传输层的包 195
14.2.3 包的分片 196
14.2.4 IP实体的数据 200
14.2.5 一些IP辅助函数 203
14.3 IP的选项 204
14.3.1 标准IP包选项 205
14.3.2 配置 208
14.3.3 Linux内核中的ip_options类 210
14.3.4 IP层中的IP选项 212
14.4 Internet控制消息协议(ICMP) 214
14.4.1 ICMP的功能原理 214
14.4.2 ICMP的配置 219
14.4.3 Linux内核中的ICMP 219
15.1 运用地址解析协议 223
第15章 地址解析协议(ARP) 223
15.1.1 ARP协议数据单元的结构 224
15.1.2 接收一个ARP报文并应答 225
15.2 ARP命令 226
15.3 实现Linux内核中的ARP实例 227
15.3.1 管理ARP缓存中可达的计算机 227
15.3.2 地址解析协议(ARP)的运作方式 232
第16章 IP路由 240
16.1 序言 240
16.1.1 网络和路由器 240
16.1.2 转发和路由 241
16.1.3 IP地址 242
16.1.4 转发步骤 244
16.1.5 路由缓存 245
16.1.6 基于规则的路由 246
16.2 配置 247
16.2.1 内核的配置 247
16.2.2 proc文件系统中的文件 249
16.2.3 系统层级的配置 250
16.3 实现 254
16.3.1 路由规则 254
16.3.2 路由表 258
16.3.3 路由缓存 264
16.3.4 转发进程 268
第17章 用于组通信的IP多播 272
17.1 组通信 272
17.1.1 单播 272
17.1.2 广播 273
17.1.3 多播 273
17.2 IP多播 274
17.2.1 用作多播组的地址 275
17.2.2 Linux中的IP多播配置 276
17.2.3 多播编程 277
17.3 Internet组管理协议(IGMP) 279
17.3.1 IGMP包的格式与传送 280
17.3.2 不同的版本 280
17.3.3 IGMP协议的运作 281
17.3.4 IGMP的实现 283
17.4 Linux内核中的多播数据路径 285
17.4.1 MAC层上的多播支持 285
17.4.2 IP中的多播数据路径 287
17.5 当今Internet上的多播 293
17.5.1 多播骨干网(MBone) 294
17.5.2 通过mrouted守护进程访问MBone 294
17.5.3 DVMRP路由算法 300
17.6 多播传输协议 302
第18章 用流量控制支持服务质量(QoS) 303
18.1 引言 303
18.2 Linux中的流量控制的基本结构 303
18.3 外发方向上的流量控制 304
18.4 内核结构和接口 306
18.4.1 句柄 306
18.4.2 排队规则 306
18.4.3 类 309
18.4.4 过滤器 311
18.6 实现一个排队规则 313
18.5 入口限制 313
18.7 配置 316
18.7.1 RT网络连接接口 316
18.7.2 用户接口 316
第19章 包筛选器与防火墙 317
19.1 介绍 317
19.1.1 防火墙的工作原理 317
19.1.2 协议相关特性:TCP、FTP以及其他协议 318
19.1.3 筛选器实现的质量标准 319
19.1.4 防火墙工作原理的局限性 319
19.2 2.2版本Linux的ipchains体系结构 320
19.2.1 ipchains规则语法 321
19.2.2 ipchains体系结构的缺陷 322
19.3 2.4版本Linux的Netfilter体系结构 323
19.3.1 Linux内核中的Netfilter钩子 323
19.3.2 注册和注销包筛选函数 325
19.3.3 iptables与ipchains的比较 327
19.3.4 iptables命令行工具 327
19.3.5 netfilter标准模块 328
20.2 实现 331
20.2.1 基本结构 331
第20章 连接跟踪 331
20.1 简介 331
20.2.2 连接记录 332
20.2.3 传输协议 334
20.2.4 Helper模块 334
20.2.5 全局变量 334
20.2.6 函数 335
第21章 网络地址转换(NAT) 340
21.1 简介 340
21.1.1 重要术语 340
21.1.2 透明地址分配 340
21.1.5 NAT与2.2版本Linux中的地址伪装有何不同 341
21.1.3 透明路由 341
21.1.4 正确处理ICMP包 341
21.1.6 NAT的变化形式 342
21.1.7 相关问题 343
21.2 在Linux中配置NAT 343
21.3 实现NAT模块 345
21.3.1 重要的数据结构 345
21.3.2 初始化NAT模块和卸载NAT模块 348
21.3.3 NAT模块如何处理经过的IP包 348
21.3.4 初始化地址绑定过程 349
21.3.5 实际的地址转换 350
21.4.1 传输协议 351
21.4 NAT模块的扩展接口 351
21.4.2 Helper模块 352
第22章 扩展Linux网络体系结构功能——KIDS 354
22.1 管理动态可扩展的各项功能 354
22.2 KIDS构造系统的结构 355
22.2.1 基本QoS组件 355
22.2.2 钩子 357
22.3 用KIDS实例扩展Liunx网络体系结构 358
22.3.1 组件及其实例 358
22.3.2 注册和管理组件 362
22.3.3 管理组件实例 363
22.3.5 组件的工作方式 364
22.3.4 实现钩子 364
22.3.6 配置各KIDS组件 366
第23章 Ipv6——Internet协议第6版 368
23.1 介绍 368
23.2 IPv6的各项特性 368
23.2.1 地址分配 368
23.2.2 IPv6包报头 370
23.2.3 包报头扩展 371
23.3 IPv6实现 374
23.3.1 传入包 374
23.3.3 本地投递包 375
23.3.2 转发包 375
23.3.4 传输层包 376
第五篇 第四层——传输层 378
第24章 传输控制协议(TCP) 378
24.1 概述 378
24.1.1 对TCP的要求 378
24.1.2 TCP数据包的格式 379
24.2 TCP协议实例的实现 380
24.2.1 输入TCP段的处理 380
24.2.2 TCP段的发送 387
24.2.3 TCP实例的数据结构 390
24.3 连接管理 395
24.3.1 TCP状态机 396
24.3.2 建立连接 397
24.3.3 连接的拆卸 399
24.4 数据交换的协议机制 404
24.4.1 流控制 404
24.4.2 拥塞的检测、回避和处理 415
24.4.3 拥塞回避 421
24.5 TCP中的计时器管理 423
24.5.1 数据结构 423
24.5.2 函数 424
24.5.3 配置 426
25.1 简介 428
第25章 用户数据报协议(UDP) 428
25.2 数据结构 429
25.2.1 传递有效负荷 429
25.2.2 UDP数据报 430
25.2.3 UDP至网络体系结构的集成 431
25.3 UDP数据报的收发 433
第26章 套接字的概念 436
26.1 简介 436
26.2 BSD套接字 437
26.3.1 PF_INET套接字 440
26.3 特定于协议的套接字 440
26.3.2 PF_PACKET套接字 441
26.3.3 PF_NETLINK套接字 442
第六篇 第五层——应用层 446
第27章 涉及套接字的网络编程 446
27.1 简介 446
27.1.1 套接字的地址 446
27.1.2 一些套接字操作 447
27.2 套接字API函数 448
27.2.1 用于连接管理的函数 448
27.2.2 用于数据传输的函数 453
27.2.3 字节排序方法 454
27.2.4 用于处理Internet地址的函数 455
27.3 示例 456
第七篇 附录 458
附录A LXR源代码浏览器 458
A.1 功能 458
A.2 安装 461
附录B Linux内核中的调试 463
B.1 记录Linux内核输出 463
B.1.1 使用printk()创建日志输出 463
B.1.2 syslogd守护进程 464
B.1.3 使用console_print()进行直接输出 466
B.2 在内核中创建字符串 467
B.3 /PROC目录中的相关信息 469
B.4 用调试器调试Linux内核 473
附录C 用于网络操作的工具和命令 476
C.1 使用ifconfig以管理网络设备 476
C.2 使用ping以测试可抵达性 478
C.3 使用netstat以查看网络状态 479
C.4 使用route以处理路由信息 481
C.5 使用tcpdump以进行网络分析 482
C.6 使用traceroute以跟踪包 485
C.7 其他工具 487