第1章 绪论 1
1.1 Linux网络栈 2
1.2 网络设备 4
1.2.1 网络设备中的NAPI 5
1.2.2 数据包的收发 5
1.2.3 套接字缓冲区 7
1.3 Linux内核网络开发模型 10
1.4 总结 12
第2章 Netlink套接字 13
2.1 Netlink簇 13
2.1.1 Netlink套接字库 15
2.1.2 结构sockaddr_nl 15
2.1.3 用于控制TCP/IP联网的用户空间包 15
2.1.4 内核Netlink套接字 16
2.1.5 Netlink消息报头 20
2.1.6 NETLINK_ROUTE消息 22
2.1.7 在路由选择表中添加和删除路由选择条目 24
2.2 通用Netlink协议 25
2.2.1 创建和发送通用Netlink消息 29
2.2.2 套接字监视接口 31
2.3 总结 32
2.4 快速参考 32
第3章 Internet控制消息协议(ICMP) 36
3.1 ICMPv4 36
3.1.1 ICMPv4的初始化 37
3.1.2 ICMPv4报头 38
3.1.3 接收ICMPv4 消息 42
3.1.4 发送ICMPv4 消息:目的地不可达 43
3.2 ICMPv6 47
3.2.1 ICMPv6初始化 47
3.2.2 ICMPv6报头 48
3.2.3 接收ICMPv6消息 49
3.2.4 发送ICMPv6消息 52
3.3 ICMP套接字(ping套接字) 55
3.4 总结 56
3.5 快速参考 56
3.5.1 方法 56
3.5.2 表格 57
3.5.3 procfs条目 58
3.5.4 使用iptables创建“目的地不可达”消息 59
第4章 IPv4 61
4.1 IPv4报头 62
4.2 IPv4的初始化 63
4.3 接收IPv4数据包 64
4.4 接收IPv4组播数据包 67
4.5 IP选项 69
4.5.1 时间戳选项 71
4.5.2 记录路由选项 74
4.5.3 IP选项和分段 82
4.5.4 创建IP选项 84
4.6 发送IPv4数据包 85
4.7 分段 89
4.7.1 快速路径 90
4.7.2 慢速路径 93
4.8 重组 94
4.9 转发 99
4.10 总结 101
4.11 快速参考 101
4.11.1 方法 102
4.11.2 宏 104
第5章 IPv4路由选择子系统 105
5.1 转发和FIB 105
5.2 在路由选择子系统中进行查找 107
5.3 FIB表 110
5.3.1 FIB信息 110
5.3.2 缓存 115
5.3.3 下一跳 115
5.3.4 策略路由选择 117
5.3.5 FIB别名 118
5.4 ICMPv4重定向消息 121
5.4.1 生成ICMPv4重定向消息 122
5.4.2 接收ICMPv4重定向消息 123
5.4.3 IPv4路由选择缓存 125
5.5 总结 126
5.6 快速参考 126
5.6.1 方法 127
5.6.2 宏 128
5.6.3 表 128
5.6.4 路由标志 129
第6章 高级路由选择 131
6.1 组播路由选择 131
6.1.1 IGMP 132
6.1.2 组播路由选择表 133
6.1.3 组播转发缓存(MFC) 134
6.1.4 组播路由器 136
6.1.5 vif设备 137
6.1.6 IPv4组播接收路径 138
6.1.7 方法ip_mr_forward() 141
6.1.8 方法ipmr_queue_xmit() 143
6.1.9 方法ipmr_forward_finish() 145
6.1.10 组播流量中的TTL 146
6.2 策略路由选择 146
6.2.1 策略路由选择的管理 147
6.2.2 策略路由选择的实现 147
6.3 多路径路由选择 148
6.4 总结 149
6.5 快速参考 149
6.5.1 方法 149
6.5.2 宏 151
6.5.3 procfs组播条目 152
6.5.4 表 152
第7章 Linux邻接子系统 153
7.1 邻接子系统的核心 153
7.1.1 创建和释放邻居 160
7.1.2 用户空间和邻接子系统之间的交互 161
7.1.3 处理网络事件 163
7.2 ARP协议(IPv4) 163
7.2.1 ARP:发送请求 165
7.2.2 ARP:接收请求和应答 168
7.3 NDISC协议(IPv6) 174
7.3.1 重复地址检测(DAD). 174
7.3.2 NIDSC:发送请求 176
7.3.3 NDISC:接收邻居请求和通告 179
7.4 总结 185
7.5 快速参考 186
7.5.1 方法 186
7.5.2 宏 189
7.5.3 结构neigh_statistics 190
7.5.4 表 191
第8章 IPv6 192
8.1 IPv6简介 192
8.2 IPv6地址 193
8.2.1 特殊地址 193
8.2.2 组播地址 194
8.3 IPv6报头 195
8.4 扩展报头 197
8.5 IPv6初始化 199
8.6 自动配置 200
8.7 接收IPv6数据包 201
8.7.1 本地投递 204
8.7.2 转发 206
8.8 接收IPv6组播流量 210
8.9 组播侦听者发现(MLD) 211
8.9.1 加入和退出组播组 212
8.9.2 MLDv2组播侦听者报告 215
8.9.3 组播源过滤 215
8.10 发送IPv6 数据包 220
8.11 IPv6 路由选择 221
8.12 总结 221
8.13 快速参考 221
8.13.1 方法 221
8.13.2 宏 224
8.13.3 表 224
8.13.4 特殊地址 225
8.13.5 IPv6路由选择表的管理 226
第9章 Netfilter 227
9.1 Netfilter框架 227
9.2 Netfilter挂接点 228
注册Netfilter钩子回调函数 229
9.3 连接跟踪 230
9.3.1 连接跟踪的初始化 231
9.3.2 连接跟踪条目 234
9.3.3 连接跟踪辅助方法和期望连接 238
9.3.4 iptables 241
9.3.5 投递到当前主机 243
9.3.6 转发数据包 245
9.3.7 网络地址转换(NAT) 245
9.3.8 NAT钩子回调函数和连接跟踪钩子回调函数 247
9.3.9 NAT钩子回调函数 250
9.3.10 连接跟踪扩展 252
9.4 总结 253
9.5 快速参考 253
9.5.1 方法 253
9.5.2 宏 255
9.5.3 表 255
9.5.4 工具和库 256
第10章 IPsec 257
10.1 概述 257
10.2 Internet密钥交换(IKE) 257
10.3 IPsec和加密 259
10.4 XFRM框架 259
10.4.1 XFRM的初始化 260
10.4.2 XFRM策略 260
10.4.3 XFRM状态(安全关联) 263
10.5 IPv4 ESP的实现 266
10.6 接收IPsec数据包(传输模式) 268
10.7 发送IPsec数据包(传输模式) 271
10.8 XFRM查找 272
10.9 IPsec的NAT穿越功能 275
10.10 总结 276
10.11 快速参考 276
10.11.1 方法 276
10.11.2 表 278
第11章 第4层协议 280
11.1 套接字 280
11.2 创建套接字 281
11.3 用户数据包协议(UDP) 285
11.3.1 UDP的初始化 286
11.3.2 发送UDP数据包 287
11.3.3 接收来自网络层(L3)的UDP数据包 290
11.4 传输控制协议(TCP) 293
11.4.1 TCP报头 293
11.4.2 TCP的初始化 295
11.4.3 TCP定时器 296
11.4.4 TCP套接字的初始化 297
11.4.5 TCP连接的建立 297
11.4.6 接收来自网络层(L3)的TCP数据包 298
11.4.7 发送TCP数据包 299
11.5 流控制传输协议(SCTP) 300
11.5.1 SCTP数据包和数据块 301
11.5.2 SCTP块头 302
11.5.3 SCTP块 302
11.5.4 SCTP关联 303
11.5.5 建立SCTP关联 305
11.5.6 接收SCTP数据包 305
11.5.7 发送SCTP数据包 306
11.5.8 SCTP心跳 306
11.5.9 SCTP多流 306
11.5.10 SCTP多宿主 307
11.6 数据报拥塞控制协议(DCCP) 307
11.6.1 DCCP报头 307
11.6.2 DCCP的初始化 309
11.6.3 DCCP套接字的初始化 310
11.6.4 接收来自网络层(L3)的DCCP数据包 311
11.6.5 发送DCCP数据包 311
11.6.6 DCCP和NAT 312
11.7 总结 313
11.8 快速参考 313
11.8.1 方法 313
11.8.2 宏 315
11.8.3 表 315
第12章 无线子系统 317
12.1 mac80211子系统 317
12.2 802.11 MAC帧头 318
12.3 802.11 MAC帧头的其他成员 320
12.4 网络拓扑 321
12.4.1 基础设施BSS 321
12.4.2 IBSS(对等模式) 322
12.5 省电模式 322
12.5.1 进入省电模式 322
12.5.2 退出省电模式 322
12.5.3 处理组播/广播缓冲区 323
12.6 管理层 325
12.6.1 扫描 325
12.6.2 身份验证 325
12.6.3 关联 325
12.6.4 重新关联 325
12.7 mac80211的实现 326
12.7.1 接收路径 328
12.7.2 传输路径 328
12.7.3 分段 329
12.7.4 mac80211 debugfs 330
12.7.5 无线模式 331
12.8 高吞吐量(IEEE 802.11n) 331
12.9 网状网络(802.11s) 334
12.9.1 HWMP 335
12.9.2 组建网状网络 336
12.10 Linux 无线开发流程 337
12.11 总结 337
12.12 快速参考 338
12.12.1 方法 338
12.12.2 表 341
第13章 InfiniBand 343
13.1 RDMA 和InfiniBand概述 343
13.1.1 RDMA栈的组织结构 344
13.1.2 RDMA技术的优点 345
13.1.3 InfiniBand硬件组件 345
13.1.4 InfiniBand中的编址 345
13.1.5 InfiniBand的功能 346
13.1.6 InfiniBand数据包 346
13.1.7 管理实体 347
13.2 RDMA资源 348
13.2.1 RDMA设备 348
13.2.2 PD 350
13.2.3 AH 350
13.2.4 MR 350
13.2.5 FMR池 351
13.2.6 MW 352
13.2.7 CQ 352
13.2.8 XRC 353
13.2.9 SRQ 353
13.2.10 QP 355
13.2.11 工作请求的处理 360
13.2.12 RDMA架构支持的操作 361
13.2.13 组播组 365
13.2.14 用户空间RDMA API和内核级RDMA API的差别 365
13.3 总结 366
13.4 快速参考 366
第14章 高级主题 372
14.1 网络命名空间 372
14.1.1 命名空间的实现 373
14.1.2 UTS命名空间的实现 381
14.1.3 网络命名空间的实现 383
14.1.4 网络命名空间的管理 388
14.2 cgroup 392
14.2.1 cgroup的实现 393
14.2.2 cgroup设备控制器:一个简单示例 395
14.2.3 cgroup内存控制器:一个简单示例 396
14.2.4 net_prio模块 396
14.2.5 分类器cls_cgroup 397
14.2.6 挂载cgroup子系统 398
14.3 频繁轮询套接字 399
14.3.1 全局启用 400
14.3.2 对特定套接字启用 401
14.3.3 调整和配置 401
14.3.4 性能 401
14.4 Linux蓝牙子系统 401
14.4.1 HCI层 404
14.4.2 HCI连接 406
14.4.3 L2CAP 407
14.4.4 BNEP 407
14.4.5 蓝牙数据包接收示意图 408
14.4.6 L2CAP扩展功能 409
14.4.7 蓝牙工具 409
14.5 IEEE 802.15.4和6LoWPAN 410
14.5.1 邻居发现优化 411
14.5.2 Linux内核的6LoWPAN实现 412
14.6 NFC 415
14.6.1 NFC标签 415
14.6.2 NFC设备 416
14.6.3 通信模式和操作模式 416
14.6.4 主机控制器接口 417
14.6.5 Linux对NFC的支持 417
14.6.6 用户空间架构 421
14.6.7 Android NFC 421
14.7 通知链 422
14.8 PCI子系统 425
14.9 组合网络设备 428
14.10 PPPoE协议 428
14.10.1 PPPoE报头 429
14.10.2 PPPoE的初始化 430
14.10.3 PPPoE数据包的收发 432
14.11 Android 435
14.11.1 Android联网技术 436
14.11.2 Android内部原理:资料 437
14.12 总结 438
14.13 快速参考 438
14.13.1 方法 438
14.13.2 宏 443
附录A Linux API 444
附录B 网络管理 520
附录C 术语表 537
· · · · · · (
收起)