前言

本书将引领你完成一次深入探索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内核网络时需要的各种工具。

排版约定

本书始终采用一致的排版风格。所有代码段(无论包含在正文中还是单独列出)都使用等宽字体,新术语使用楷体,其他需要突出的内容使用粗体

目录

  • 技术审阅
  • 前言
  • 致谢
  • 第1章 绪论
  • 第2章 Netlink套接字
  • 第3章 Internet控制消息协议(ICMP)
  • 第4章 IPv4
  • 第5章 IPv4路由选择子系统
  • 第6章 高级路由选择
  • 第7章 Linux邻接子系统
  • 第8章 IPv6
  • 第9章 Netfilter
  • 第10章 IPsec
  • 第11章 第4层协议
  • 第12章 无线子系统
  • 第13章 InfiniBand
  • 第14章 高级主题
  • 封底文字
  • 附录A Linux API
  • 附录B 网络管理
  • 附录C 术语表
  • 作者简介