标题：Lighttpd源码分析
图书信息
  书名：Lighttpd源码分析
作者：高群凯
定价：19.00
页数：460
出版日期：2010年03月17日
图书分类：计算机 > 软件与程序设计 > 综合
语种：简体中文
开本：16
所属丛书：原创精品系列
责任编辑：周茂辉
作者自序
作为最为优秀的轻量级Web Server之一，Lighttpd有着众多的忠实拥护者和使用者。本书就是一本介绍分析Lighttpd源码的初级读本，其主要目标在于：一方面让已经接触过网络编程的读者可以从Lighttpd这个开源项目中学习到更深入实际的网络编程知识，另一方面也可以让使用Lighttpd作为自己管理站点Web服务器的读者能更有效地使用、优化甚至定制自己的Lighttpd服务器应用程序。
目前对于学习网络编程最好的参考书籍当属《UNIX网络编程》（第3版）1，但是其包含内容众多，讲解太过广泛深入，不是在短期时间内就能很好领会并灵活运用的，因此它更适合当作我们桌边的手册或圣经。在实践项目中学习，从实践源码中理解，这一直是我们学习的最好方法，虽然当前书市也有不少关于实践项目介绍的书，但是由于实在太过庞大（比如Apache）或实践项目不具有代表性，选择性的讲解使得许多细节被忽略，细节不明朗使得读者也很难清楚地从整体上去把握。本书选择的Lighttpd开源项目内容较少却功能实现完整，是难得的学习网络编程的源码材料。另外，我们在讲解该项目源码时紧密结合Web开发的相关RFC协议文档（比如RFC 822、RFC 1034、RFC 1035、RFC 1738、RFC 2068、RFC 2396、RFC 2616、RFC 2732、RFC 3986等）对所分析的代码为什么这样写都做出了详细的解释，并指明了其依据的是哪个RFC的哪个部分，可以让读者明确查找方向，以快速、进一步地对其深入理解。
总的来说，Lighttpd源码虽然代码量不多，但是其设计巧妙，效率高，实现功能完备并且易扩展，因此能在众多优秀Web Server中取得一席之地。Lighttpd编码风格优美，C代码简洁明了，是学习Linux/C网络编程、熟悉Http服务器编写的良好范例。另外，源码把和Web有关的众多国际标准或协议（如Http、Url、Html等）实现得恰如其分，阅读Lighttpd源码，不管是C基础还是网络协议实现，都可以从中获益良多。
本书针对的Lighttpd项目版本为最新（2008年12月16日）的稳定版本1.4.202，一共包含有137个文件。在本书的实际讲解中，这些文件并不会被全部讲到，这主要是由于Lighttpd插件太多，不可能一一讲解到，但是由于这些插件有一个统一的骨架，因此对其中一个插件的理解自然可以类推到其他插件，而本书对Lighttpd插件的整体以及几个具有代表性的插件进行了详细讲解，因此读者完全不用担心会影响自己对Lighttpd源码的理解。除了源码分析知识外，另外一些涉及的技巧（比如Linux操作技巧）、工具等也会给出提示和介绍，以便初学者也能顺利阅读本书。
本书的目标读者定位在想要学习Linux/C网络编程或者想要提高自己网络编程水平以及对Web服务后台开发感兴趣的计算机专业开发研究人员；对于使用Lighttpd作为自己管理站点Web服务器的用户阅读本书也能获取一定的相关帮助。
作为本书的作者，我把阅读Lighttpd源码的总结尽可能详细地记录下来，供大家学习参考。由于本人才疏学浅，又经验不足，因此本书中会存在不足之上，请大家不吝赐教。
最后，感谢Jan Kneschke3大师为我们提供了这么优秀的开源项目，感谢曾经在CU、CSDN、BAIDU、LQ等论坛、网站直接或间接地帮助过我的各位热心网友。
高群凯
图书目录
前言
第1章　 Lighttpd介绍与分析准备工作 1
1.1　 Lighttpd介绍 1
1.1.1　 什么是Lighttpd 1
1.1.2　 Lighttpd功能概述 1
1.2　 源码分析的准备工作 3
1.2.1　 Lighttpd源码下载与组织结构 3
1.2.2　 Lighttpd源码分析工具 4
1.2.3　 系统编译环境 6
1.2.4　 Lighttpd编译运行 6
1.2.5　 其他准备 7
1.3　 本书内容综述 7
1.4　 本章总结 8
第2章　 Lighttpd网络服务主模型 9
2.1　 概述 9
2.2　 Lighttpd主进程执行流程 10
2.2.1　 Lighttpd进程守护化 10
2.2.2　 Lighttpd多进程网络服务模型 14
2.3　 Lighttpd信号处理机制 20
2.3.1　 信号的概念 20
2.3.2　 Lighttpd中信号处理机制 21
2.4　 Lighttpd工作进程处理模型 25
2.5　 本章总结 26
第3章　 Lighttpd数据结构 27
3.1　 概述 27
3.2　 bitset数据结构 27
3.2.1　 结构说明 27
3.2.2　 结构定义 27
3.2.3　 结构操作 30
3.3　 buffer数据结构 32
3.3.1　 结构说明 32
3.3.2　 结构定义 32
3.3.3　 结构操作 33
3.4　 data_xxxxx数据结构 65
3.4.1　 结构说明 65
3.4.2　 结构定义 65
3.4.3　 结构操作 67
3.5　 array数据结构 67
3.5.1　 结构说明 67
3.5.2　 结构定义 68
3.5.3　 结构操作 69
3.6　 chunk数据结构 78
3.6.1　 结构说明 78
3.6.2　 结构定义 78
3.6.3　 结构操作 80
3.7　 keyvalue数据结构 88
3.7.1　 结构说明 88
3.7.2　 结构定义 88
3.7.3　 结构操作 91
3.8　 本章总结 92
第4章　 伸展树 93
4.1　 概述 93
4.2　 伸展树基础知识 93
4.2.1　 伸展树介绍 93
4.2.2　 伸展树的自底向上伸展 94
4.2.3　 伸展树的自顶向下伸展 98
4.3　 Lighttpd中伸展树实现源码解析 101
4.3.1　 结构定义 101
4.3.2　 结构操作 102
4.4　 本章总结 106
4.5　 参考文献 106
第5章　 日志系统 108
5.1　 概述 108
5.2　 日志源码解析 108
5.2.1　 日志系统头文件 108
5.2.2　 日志系统实现文件 109
5.3　 本章总结 124
第6章　 文件状态缓存器 125
6.1　 概述 125
6.2　 ETag知识 125
6.2.1　 ETag的定义 125
6.2.2　 ETag的功能 126
6.2.3　 ETag的优势 127
6.2.4　 Lighttpd中ETag的实现 128
6.2.5　 Lighttpd中ETag的使用 130
6.3　 文件状态缓存器 134
6.3.1　 缓存器设计思路 134
6.3.2　 缓存器结构定义 134
6.3.3　 缓存器实现 137
6.4　 本章总结 159
第7章　 配置信息加载 160
7.1　 概述 160
7.2　 配置信息范例与程序加载结果 160
7.2.1　 Lighttpd配置信息的范例 160
7.2.2　 Lighttpd配置信息范例的加载结果 164
7.3　 加载配置信息的源码分析 167
7.3.1　 Lighttpd配置信息存储结构 167
7.3.2　 Lighttpd配置信息加载的函数
调用流程 172
7.4　 客户端连接配置信息 203
7.4.1　 条件配置信息缓存存储结构 203
7.4.2　 客户端连接配置信息动态获取 204
7.5　 本章总结 215
第8章　 I/O多路复用技术模型 216
8.1　 概述 216
8.2　 I/O模型基础知识 216
8.2.1　 I/O模型分类介绍 216
8.2.2　 常见I/O多路复用实现技术 221
8.3　 Lighttpd中多路复用技术模型应用 236
8.3.1　 整合多种复用技术模型的数据结
构封装 237
8.3.2　 I/O多路复用技术模型的使用 250
8.3.3　 六种I/O多路复用技术模型的实现 256
8.4　 本章总结 279
第9章　 插件链 280
9.1　 概述 280
9.2　 插件内部结构 280
9.2.1　 数据结构 280
9.2.2　 函数接口 283
9.3　 插件组织结构 286
9.3.1　 串链结构 286
9.3.2　 插件组织结构源码分析 286
9.4　 本章总结 296
第10章　 网络请求服务响应流程 297
10.1　 概述 297
10.2　 简单网络服务通信模型 297
10.3　 Lighttpd网络服务通信模型 298
10.3.1　 通信模型总图 298
10.3.2　 通信模型源码分析 299
10.4　 本章总结 402
第11章　 请求响应数据快速传输方式 403
11.1　 概述 403
11.2　 三种数据传输方式 403
11.2.1　 内核系统调用架构 403
11.2.2　 read/write数据读写传输方式 405
11.2.3　 readv/writev数据读写传输方式 408
11.2.4　 “零拷贝”（sendfile）数据读
写传输方式 409
11.3　 传输方式程序实现 413
11.3.1　 源码network_write.c分析 413
11.3.2　 源码network_writev.c分析 417
11.3.3　 源码network_linux_sendfile.c
分析 423
11.4　 本章总结 428
第12章　 基本插件模块 429
12.1　 概述 429
12.2　 mod_indexfile插件模块 429
12.2.1　 数据结构 429
12.2.2　 函数接口 430
12.3　 mod_dirlisting插件模块 433
12.3.1　 数据结构 433
12.3.2　 梳子排序 439
12.4　 mod_staticfile插件模块 441
12.4.1　 数据结构 442
12.4.2　 函数接口 442
12.5　 本章总结 443
后记 444
附录一　 ASCII码字符表 445
附录二　 扩展ASCII码字符表 446
附录三　 客户端请求连接的有限状态
机转换图 447
附录四　 HTTP状态码简介 448
附录五　 参考资料 449