标题：LINUX内核源码剖析 TCP/IP实现下
简介
【作 者】樊东东，莫澜编著
【出版发行信息】 北京市：机械工业出版社 , 2011.01
【ISBN号】978-7-111-32373-4
【页 数】 1063
【原书定价】142.00（上下册）
【主题词】计算机网络-通信协议-LINUX操作系统-机器代码程序-程序分析
部分阅读
【中图法分类号】TP316.89;TN915.04 (工业技术>自动化技术、计算机技术>计算技术、计算机技术>计算机软件>操作系统>网络操作系统>其他)
【参考文献格式】樊东东，莫澜编著. LINUX内核源码剖析 TCP/IP实现 下. 北京市：机械工业出版社
本书详细论述了linux内核2.6.20版本中tcp/ip的实现。书中给出了大量的源代码，通过对源代码的详细注释，帮助读者掌握tcp/ip的实现。本书根据协议栈层次，从驱动层逐步论述到传输层，包括驱动的实现、接口层的输入输出、ip层的输入输出以及ip选项的处理、邻居子系统、路由、套接口及传输层等内容，全书基本涵盖了网络体系架构全部的知识点。特别是tcp，包括tcp连接的建立和终止、输入与输出，以及拥塞控制的实现。
本书适用于熟悉linux的基本使用方法，对linux内核工作原理以及网络知识有一定的了解，而又极想更深入理解各个机制在linux中的具体实现的用户，包括应用程序员和嵌入式程序员，以及网络管理员等。相关专业的科研人员在工作中遇到问题时，也可以查阅本书，理解相关内核部分的实现。此外，计算机相关专业的本科高年级学生和研究生，在学习相关课程（如操作系统、计算机网络等）时，可将本书作为辅助教程，与理论相结合以便更好地理解相应的知识点。 
目录
前言 
第1章 预备知识 1 
1.1 应用层配置诊断工具 2 
1.1.1 iputils 2 
1.1.2 net-tools 2 
1.1.3 iproute2 2 
1.2内核空间与用户空间的接口 2 
1.2.1 procfs 2 
1.2.2 sysctl(/proc/sys目录) 4 
1.2.3 sysfs(/sys文件系统) 5 
1.2.4 ioctl系统调用 6 
1.2.5netlink套接口 6 
1.3 网络i/o加速 6 
1.3.1 tso/gso 7 
1.3.2 i/o at 8 
1.4 其他 8 
1.4.1 slab分配器 9 
1.4.2 rcu 9 
第2章 网络体系结构概述 10 
.2.1 引言 10 
2.2 协议简介 10 
2.3 网络架构 11 
2.4 系统调用接口 11 
2.5 协议无关接口 12 
2.6 传输层协议 12 
2.7 套接口缓存 13 
2.8 设备无关接口 14 
2.9 设备驱动程序 14 
2.10 网络模块源代码组织 14 
第3章 套接口缓存 15 
3.1 引言 15 
3.2 sk_buff结构 15 
3.2.1 网络参数和内核数据结构 16 
3.2.2 skb组织相关的变量 19 
3.2.3 数据存储相关的变量 20 
3.2.4 通用的成员变量21 
3.2.5 标志性变量 24 
3.2.6 特性相关的成员变量 25 
3.3 skb_shared_info结构 25 
3.3.1 “零拷贝”技术 25 
3.3.2 对聚合分散i/o数据的支持 27 
3.3.3 对gso的支持 30 
3.3.4 访问skb_shared_info结构 31 
3.4 管理函数 31 
3.4.1 skb的缓存池31 
3.4.2 分配skb 32 
3.4.3 释放skb 34 
3.4.4 数据预留和对齐 36 
3.4.5 克隆和复制skb 38 
3.4.6 链表管理函数 42 
3.4.7 添加或删除尾部数据 42 
3.4.8 拆分数据：skb_split() 44 
3.4.9 重新分配skb的线性数据区：pskb_expand_head() 46 
3.4.10 其他函数 46 
第4章 网络模块初始化 48 
4.1 引言 48 
4.2 网络模块初始化顺序 48 
4.3 优化基于宏的标记 49 
4.4 网络设备处理层初始化 52 
第5章 网络设备 55 
5.1 pci设备 55 
5.1.1 pci驱动程序相关结构 55 
5.1.2 注册pci驱动程序 57 
5.2 与网络设备有关的数据结构 59 
5.2.1 net_device结构 59 
5.2.2 网络设备有关结构的组织 71 
5.2.3 相关函数 72 
5.3 网络设备的注册 73 
5.3.1 设备注册的时机 73 
5.3.2 分配net_device结构空间 73 
5.3.3 网络设备注册过程 75 
5.3.4 注册设备的状态迁移 79 
5.3.5 设备注册状态通知 79 
5.3.6 引用计数 80 
5.4 网络设备的注销 80 
5.4.1 设备注销的时机 80 
5.4.2 网络设备注销过程 81 
5.5 网络设备的启用 86 
5.6 网络设备的禁用 88 
5.7 与电源管理交互 89 
5.7.1 挂起设备 90 
5.7.2 唤醒设备 90 
5.8 侦测连接状态改变 91 
5.8.1 调度处理连接状态改变事件 91 
5.8.2 linkwatch标志 95 
5.9 从用户空间配置设备相关信息 95 
5.9.1 ethtool 95 
5.9.2 媒体独立接口 97 
5.10 虚拟网络设备 97 
第6章 ip编址 99 
6.1 接口和ip地址 99 
6.1.1 主ip地址、从属ip地址和ip别名 99 
6.1.2 ip地址的组织 99 
6.1.3 in_device结构 100 
6.1.4 in_ifaddr结构 101 
6.2 函数 102 
6.2.1 inetdev_init() 102 
6.2.2 inetdev_destroy() 104 
6.2.3 inet_select_addr() 104 
6.2.4 inet_confirm_addr() 106 
6.2.5 inet_addr_onlink() 107 
6.2.6 inetdev_by_index() 107 
6.2.7 inet_ifa_byprefix() 108 
6.2.8 inet_abc_len() 108 
6.3 ip地址的设置 109 
6.3.1 netlink接口 109 
6.3.2 inet_insert_ifa() 111 
6.3.3 inet_del_ifa() 112 
6.4 ioctl 115 
6.5 inetaddr_chain通知链 121 
第7章 接口层的输入 122 
7.1 系统参数 122 
7.2 接口层的ioctl 123 
7.2.1 siocxifxxx类命令 123 
7.2.2 siocethtool 126 
7.2.3 私有命令 127 
7.3 初始化 127 
7.4 softnet_data结构 128 
7.5 napi方式 130 
7.5.1 网络设备中断例程 131 
7.5.2 网络输入软中断 131 
7.5.3 轮询处理 133 
7.6 非napi方式 134 
7.7 接口层输入报文的处理 137 
7.7.1 报文接收例程 137 
7.7.2 netif_receive_skb() 138 
7.7.3 dev_queue_xmit_nit() 141 
7.8 响应cpu状态的变化 142 
7.9 netpoll 143 
7.9.1 netpoll相关结构 143 
7.9.2 注册netpoll实例 145 
7.9.3 netpoll的输入 148 
7.9.4 netpoll的输出 156 
7.9.5 tx_work工作队列 159 
7.9.6 netpoll实例：netconsole 160 
第8章 接口层的输出 163 
8.1 输出接口 163 
8.1.1 dev_queue_xmit() 163 
8.1.2 dev_hard_start_xmit() 167 
8.1.3 e100的输出接口：e100_xmit_frame() 168 
8.2 网络输出软中断 168 
8.2.1 netif_schedule() 168 
8.2.2 net_tx_action() 169 
8.3 网络设备不支持gso时的处理 170 
8.3.1 dev_gso_cb私有控制块 171 
8.3.2 dev_gso_segment() 171 
8.3.3 skb_gso_segment() 172 
第9章 流量控制 174 
9.1 通过流量控制后输出 174 
9.1.1 dev_queue_xmit() 175 
9.1.2 qdisc_restart() 176 
9.2 构成流量控制的三种元素 178 
9.2.1 排队规则 179 
9.2.2 类 186 
9.2.3 过滤器 189 
9.3 默认的fifo排队规则 192 
9.3.1 pfifo_fast_init() 194 
9.3.2 pfifo_fast_reset() 194 
9.3.3 pfifo_fast_enqueue() 194 
9.3.4 pfifo_fast_dequeue() 195 
9.3.5 pfifo_fast_requeue() 195 
9.4 netlink的tc接口 195 
9.5 排队规则的创建接口 197 
9.5.1 类的创建接口 201 
9.5.2 过滤器的创建接口 204 
第10章 internet协议族 209 
10.1 net_proto_family结构 209 
10.2 inet_protosw结构 210 
10.3 net_protocol结构 212 
10.4 internet协议族的初始化 214 
第11章 ip：网际协议 217 
11.1 引言 217 
11.1.1 ip首部 218 
11.1.2 ip数据报的输入与输出 219 
11.2 ip的私有信息控制块 220 
11.3 系统参数 220 
11.4 初始化 223 
11.5 ip层套接口选项 223 
11.6 ipv4_devconf结构 227 
11.7 套接口的错误队列 229 
11.7.1 添加icmp差错信息 231 
11.7.2 添加由本地产生的差错信息 232 
11.7.3 读取错误信息 233 
11.8 报文控制信息 235 
11.8.1 ip控制信息块 235 
11.8.2 报文控制信息的输出 235 
11.8.3 报文控制信息的输入 236 
11.9 对端信息块 237 
11.9.1 系统参数 239 
11.9.2 对端信息块的创建和查找 239 
11.9.3 对端信息块的删除 241 
11.9.4 垃圾回收 242 
11.10 ip数据报的输入处理 244 
11.10.1 ip数据报输入到本地 247 
11.10.2 ip数据报的转发 249 
11.11 ip数据报的输出处理 253 
11.11.1 ip数据报输出到设备 253 
11.11.2 tcp输出的接口 255 
11.11.3 udp输出的接口 261 
11.12 ip层对gso的支持 275 
11.12.1 inet_gso_segment() 275 
11.12.2 inet_gso_send_check() 277 
第12章 ip选项处理 278 
12.1 ip选项 278 
12.1.1 选项列表的结束符 279 
12.1.2 空操作 279 
12.1.3 安全选项 279 
12.1.4 严格源路由选项 280 
12.1.5 宽松源路由选项 281 
12.1.6 记录路由选项 282 
12.1.7 流标识选项 282 
12.1.8 时间戳选项 283 
12.1.9 路由器警告选项 283 
12.2 ip_options结构 284 
12.3 在ip数据报中构建ip选项 285 
12.4 复制ip数据报中选项到指定的ip_options结构 286 
12.5 处理待发送ip分片中的选项 290 
12.6 解析ip选项 291 
12.7 还原在校验ip选项时修改的ip选项 297 
12.8 处理转发ip数据报中的ip选项 298 
12.9 处理ip数据报的源路由选项 299 
12.10 解析并处理ip首部中的ip选项 300 
12.11 路由警告选项的处理 301 
12.12 由控制信息生成ip选项信息块 302 
第13章 ip的分片与组装 303 
13.1 系统参数 303 
13.2 分片303 
13.2.1 快速分片 306 
13.2.2 慢速分片 309 
13.3 组装 312 
13.3.1 ipq结构 312 
13.3.2 ipq散列表和链表的维护 315 
13.3.3 ipq散列表的重组 316 
13.3.4 超时ip分片的清除 317 
13.3.5 垃圾收集 318 
13.3.6 相关分片组装函数 319 
13.3.7 分片组装 327 
第14章 icmp：internet控制报文协议 330 
14.1 icmp报文结构 330 
14.2 注册icmp报文类型 330 
14.3 系统参数 330 
14.4 icmp的初始化 332 
14.5 输入处理 333 
14.5.1 差错处理 337 
14.5.2 重定向处理 342 
14.5.3 请求回显 343 
14.5.4 时间戳请求 345 
14.5.5 地址掩码请求和应答 346 
14.6 输出处理 346 
14.6.1 发送icmp报文 346 
14.6.2 发送回显应答和时间戳应答报文 350 
第15章 ip组播 353 
15.1 初始化 353 
15.2 虚拟接口 354 
15.2.1 虚拟接口的添加 355 
15.2.2 虚拟接口的删除： 
vif_delete() 358 
15.2.3 查找虚拟接口：ipmr_find_vif() 358 
15.3 组播转发缓存 358 
15.3.1 组播转发缓存的创建 361 
15.3.2 组播转发缓存的删除 361 
15.3.3 组播转发缓存的查找 361 
15.3.4 向组播路由守护进程发送报告 362 
15.4 临时组播转发缓存 364 
15.4.1 临时组播转发缓存队列 365 
15.4.2 创建临时组播转发缓存 365 
15.4.3 用于超时而删除临时组播转发缓存的定时器 367 
15.4.4 释放临时组播缓存项中保存的临时组播报文 368 
15.5 外部事件 369 
15.6 组播套接口选项 369 
15.6.1 ip_multicast_ttl 369 
15.6.2 ip_multicast_loop 370 
15.6.3 ip_multicast_if 370 
15.6.4 ip_add_membership 372 
15.6.5 ip_drop_membership 372 
15.6.6 ip_msfilter 373 
15.6.7 ip_block_source和ip_unblock_source 375 
15.6.8 ip_add_source_membership和ip_drop_source_membership 375 
15.6.9 mcast_join_group 376 
15.6.10 mcast_leave_group 377 
15.6.11 mcast_block_source和mcast_unblock_source 377 
15.6.12 mcast_join_source_group和mcast_leave_source_group 377 
15.6.13 mcast_msfilter 378 
15.7 组播选路套接口选项 378 
15.7.1 mrt_init 379 
15.7.2 mrt_done 379 
15.7.3 mrt_add_vif和mrt_del_vif 380 
15.7.4 mrt_add_mfc和mrt_del_mfc 380 
15.7.5 mrt_assert 380 
15.8 组播的ioctl 380 
15.8.1 siocgetvifcnt 380 
15.8.2 siocgetsgcnt 380 
15.9 组播报文的输入 381 
15.10 组播报文的转发 383 
15.10.1 ip_mr_forward() 383 
15.10.2 ipmr_queue_xmit() 385 
15.11 组播报文的输出 388 
第16章 igmp：internet组管理协议 390 
16.1 in_device结构中的组播参数 390 
16.2 ip_mc_list结构 391 
16.3 系统参数 393 
16.4 igmp的版本与协议结构 393 
16.4.1 igmp的版本 393 
16.4.2 第一版和第二版的igmp报文结构 395 
16.4.3 第三版的igmp查询报文结构 395 
16.4.4 第三版的igmp报告结构 396 
16.5 igmp报文的输入 398 
16.6 函数 399 
16.6.1 ip_mc_find_dev() 399 
16.6.2 ip_check_mc() 400 
16.7 成员关系查询 400 
16.8 成员关系报告 404 
16.8.1 最近离开组播组列表的维护 404 
16.8.2 is_in() 404 
16.8.3 add_grec() 406 
16.8.4 普通查询的报告 409 
16.8.5 v1和v2的报告以及v3的当前状态记录报告 410 
16.8.6 主动发送组关系报告 413 
16.9 维护套接口组播状态 416 
16.9.1 套接口加入组播组 417 
16.9.2 套接口离开组播组 418 
16.10 维护网络设备组播状态 419 
16.10.1 被阻止的组播源列表的维护 421 
16.10.2 网络设备加入组播组 421 
16.10.3 网络设备离开组播组 425 
16.11 ip_mc_source() 430 
16.12 ip_mc_msfilter() 434 
16.13 网络设备组播硬件地址的管理 436 
第17章 邻居子系统 437 
17.1 什么是邻居子系统 437 
17.2 系统参数 437 
17.3 邻居子系统的结构 438 
17.3.1 neigh_table结构 438 
17.3.2 neighbour结构 441 
17.3.3 neigh_ops结构 444 
17.3.4 neigh_parms结构 445 
17.3.5 pneigh_entry结构 447 
17.3.6 neigh_statistics结构 447 
17.3.7 hh_cache结构 448 
17.4 邻居表的初始化 449 
17.5 邻居项的状态机 450 
17.6 邻居项的添加与删除 452 
17.6.1 netlink接口 452 
17.6.2 ioctl 456 
17.6.3 路由表项与邻居项的绑定 456 
17.6.4 接收到的并非请求的应答 456 
17.7 邻居项的创建与初始化 456 
17.7.1 neigh_alloc() 456 
17.7.2 neigh_create() 457 
17.8 邻居项散列表的扩容 459 
17.9 邻居项的查找 460 
17.9.1 neigh_lookup() 460 
17.9.2 neigh_lookup_nodev() 461 
17.9.3 __neigh_lookup ()和neigh_lookup_errno() 461 
17.10 邻居项的更新 461 
17.11 垃圾回收 465 
17.11.1 同步回收 465 
17.11.2 异步回收 466 
17.12 外部事件 468 
17.13 邻居项状态处理定时器 469 
17.14 代理项 472 
17.14.1 代理项的查找、添加和删除 472 
17.14.2 延时处理代理的请求报文 472 
17.15 输出函数 474 
17.15.1 丢弃 474 
17.15.2 慢速发送 474 
17.15.3 快速发送 477 
第18章 arp：地址解析协议 480 
18.1 arp报文格式 480 
18.2 系统参数 481 
18.3 注册arp报文类型 483 
18.4 arp初始化 483 
18.5 arp的邻居项函数指针表 483 
18.6 arp表 484 
18.7 函数 485 
18.7.1 arp_error_report() 485 
18.7.2 arp_solicit() 485 
18.7.3 arp_ignore() 486 
18.7.4 arp_filter() 488 
18.8 ipv4中邻居项的初始化 488 
18.9 arp报文的创建 490 
18.10 arp的输出 490 
18.11 arp的输入 491 
18.11.1 arp_rcv() 491 
18.11.2 arp_process() 492 
18.12 arp代理 497 
18.12.1 arp_process() 498 
18.12.2 arp_fwd_proxy() 499 
18.12.3 parp_redo() 500 
18.13 arp的ioctl 500 
18.14 外部事件 501 
18.15 路由表项与邻居项的绑定 502 
第19章 路由表 503 
19.1 什么是路由表 503 
19.1.1 路由的要素 503 
19.1.2 特殊路由 505 
19.1.3 路由缓存 505 
19.2 系统参数 506 
19.3 路由表组成结构 506 
19.3.1 fib_table结构 508 
19.3.2 fn_zone结构 510 
19.3.3 fib_node结构 511 
19.3.4 fib_alias结构 511 
19.3.5 fib_info结构 512 
19.3.6 fib_nh结构 515 
19.4 路由表的初始化 516 
19.5 netlink接口 517 
19.5.1 netlink路由表项消息结构 517 
19.5.2 inet_rtm_newroute() 519 
19.5.3 inet_rtm_delroute() 520 
19.6 获取指定的路由表 520 
19.7 路由表项的添加 520 
19.8 路由表项的删除 526 
19.9 外部事件 528 
19.9.1 网络设备状态变化事件 528 
19.9.2 ip地址变化事件 529 
19.9.3 fib_add_ifaddr() 529 
19.9.4 fib_del_ifaddr() 531 
19.9.5 fib_disable_ip() 534 
19.9.6 fib_magic() 534 
19.10 选路 535 
19.10.1 输入选路：ip_route_input_slow() 535 
19.10.2 组播输入选路：ip_route_input_mc() 539 
19.10.3 输出选路：ip_route_output_slow() 541 
19.10.4 fib_lookup() 546 
19.10.5 fn_hash_lookup() 548 
19.11 icmp重定向消息的发送 548