描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787115392930丛书名: 图灵程序设计丛书
★重点讲解数据包在Linux内核网络栈中的传输过程,阐述其与网络各层及各子系统之间的交互。
★从网络开发者视角,配合清晰图表,深入剖析Linux内核网络子系统的内部细节及核心实现。
《精通Linux内核网络》不仅适合从事网络相关项目的专业人员参考,也能为相关研究人员和学生提供极大帮助。
第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的初始化 3
本书将引领你完成一次深入探索Linux内核网络实现和理论的旅程。最近10年,始终没有讨论Linux网络的新书上市。对于快速发展的Linux内核来说,10年时间可谓相当漫长。很多重要的内核网络子系统都没有人著书介绍,其中包括IPv6、IPsec、Wireless(IEEE 802.11)、IEEE 802.15.4、NFC、InfiniBand等。网上讨论这些子系统实现细节的资源也是凤毛麟角。有鉴于此,我编写了本书。
大约在10年前,我向Linux内核编程迈出了第一步。当时我是一家创业公司的开发人员,参与了一个基于Linux的机顶盒(STB)的VoIP项目。这个项目涉及USB摄像机,USB栈经常崩溃。鉴于该STB厂商不想花时间解决这种问题,我们不得不深入研究源代码,试图找到解决方案。事实上,不是厂商不想解决问题,而是根本不知道如何解决。当时,几乎找不到任何有关USB栈的文档。那时O’Reilly出版的Linux Device Drivers还是第二版,而讨论USB的章节是第三版才增补的。作为一家创业公司,成功完成这个项目对我们来说生死攸关。在解决USB崩溃问题的过程中,我不得不大量地学习Linux内核编程知识。后来,我们又做了一个需要实现NAT穿越解决方案的项目。由于用户空间解决方案过于庞大,设备很快就崩溃了。有鉴于此,我提出了一种内核解决方案。项目经理对这种想法深表怀疑,但还是决定让我试试。事实证明,内核解决方案非常稳定,占用的CPU周期比用户空间解决方案少得多。从那以后,我参与了很多内核网络项目。本书正是我多年开发和研究工作的结晶。
针对的读者
本书是为计算机专业人员编写的,包括从事网络相关项目的开发人员、软件架构师、设计人员、项目经理和CTO。这些项目涉及的专业领域非常广泛,包括通信、数据中心、嵌入式设备、虚拟化、安全等。另外,对于从事网络项目、网络研究或操作系统研究的学生、学术研究人员和理论研究者,本书也可提供极大的帮助。
组织结构
第1章首先概述了Linux内核和Linux网络栈,然后介绍了网络设备、套接字缓存区、接收路径和传输路径的实现,最后概述了Linux内核网络开发模型。
第2章讨论了Netlink套接字。这种套接字提供了一种在用户空间和内核之间进行双向通信的机制,为网络子系统及其他一些子系统所采用。另外,本章还讨论了通用Netlink套接字。这是一种高级Netlink套接字,第12章也有介绍,内核网络源代码中也能见到。
第3章讨论了ICMP协议。它通过发送有关网络层(L3)的错误和控制消息来帮助确保系统正确地运行。本章还介绍了IPv4和IPv6中的ICMP实现。
第4章深入讨论了IPv4协议。如果没有它,Internet和当代人的生活都不会是现在的样子。具体内容包括IPv4报头的结构、接收和传输路径、IP选项、分段和重组及这样做的原因、数据包转发(这是IPv4最重要的任务之一)。
第5和6章讨论了IPv4路由选择子系统。第5章介绍了路由选择子系统查找是如何进行的,路由选择表是如何组织的,IPv4路由选择子系统使用了哪些优化方法,以及为何将IPv4路由选择缓存删除。第6章讨论了高级路由选择主题,如组播路由选择、策略路由选择和多路径路由选择。
第7章阐述了邻接子系统。主要内容有:IPv4使用的ARP协议、IPv4使用的NDISC协议以及这两种协议之间的一些差别、IPv6使用的重复地址检测(DAD)机制。
第8章讨论了IPv6协议,看起来它终将成为IPv4地址短缺的解决方案。本章介绍了IPv6的实现,讨论了IPv6地址、IPv6报头和扩展报头、IPv6自动配置、接收路径和转发等主题,还将介绍MLD协议。
第9章讨论了Netfilter子系统,包括Netfilter钩子回调函数及其注册、连接跟踪、IP表和网络地址转换(NAT)以及连接跟踪和NAT使用的回调函数。
第10章讨论了IPsec,这是最复杂的网络子系统之一。本章将简要地讨论IKE协议(它是在用户空间中实现的)和IPsec加密方面的内容(全面讨论它们超出了本书的范围)。你将学习XFRM框架(它是Linux IPsec子系统的基础)及其两个最重要的结构——XFRM策略和XFRM状态。本章还将简要地讨论ESP协议以及传输模式中的IPsec接收路径和传输路径。最后,本章将介绍XFRM查找和NAT穿越。
第11章阐述了4种第4层协议。首先介绍最常用的协议UDP和TCP,然后是较新的协议SCTP和DCCP。
第12章讨论了Linux无线子系统(IEEE
802.11)。你将学习mac80211子系统及其实现、各种无线网络拓扑、省电模式、IEEE
802.11n和数据包聚合。本章还专辟一节探讨了无线网状网络。
第13章深入讨论了InfiniBand子系统,这是一种在数据中心中使用得越来越广泛的技术。你将学习RDMA栈的组织结构、InfiniBand编址、InfiniBand数据包的结构以及RDMA API。
第14章是本书的最后一章,将讨论一些高级主题,如Linux命名空间(尤其是网络命名空间)、频繁轮询套接字、蓝牙子系统、IEEE
802.15.4子系统、近场通信(NFC)子系统、PCI子系统等。
附录A和附录C提供了本书讨论的众多主题的完整参考信息。附录B介绍了使用Linux内核网络时需要的各种工具。
“新一代的内核圣经,帮助我解决了很多问题,我可以更快地从客户那里收到钱了。”
“面向Linux网络开发者的绝佳资源,理论和实践的完美平衡。”
评论
还没有评论。