<p>《Linux内核源码剖析:TCP/IP实现(套装上下册)》详细论述了Linux内核2.6.20版本中TCP/IP的实现。书中给出了大量的源代码,通过对源代码的详细注释,帮助读者掌握TCP/IP的实现。《Linux内核源码剖析:TCP/IP实现(套装上下册)》根据协议栈层次,从驱动层逐步论述到传输层,包括驱动的实现、接口层的输入输出、IP层的输入输出以及IP选项的处理、邻居子系统、路由、套接口及传输层等内容,全书基本涵盖了网络体系架构全部的知识点。特别是TCP,包括TCP连接的建立和终止、输入与输出,以.及拥塞控制的实现。</p> <p>《Linux内核源码剖析:TCP/IP实现(套装上
Linux内核源码剖析 TCP/IP实现 上
✍ Scribed by 樊东东; 莫澜
- Publisher
- 机械工业出版社
- Year
- 2011
- Tongue
- Chinese
- Leaves
- 562
- Category
- Library
No coin nor oath required. For personal study only.
✦ Synopsis
本书详细论述了Linux内核2.6.20版本中TCP/IP的实现。书中给出了大量的源代码,通过对源代码的详细注释,帮助读者掌握TCP/IP的实现。本书根据协议栈层次,从驱动层逐步论述到传输层,包括驱动的实现、接口层的输入输出、IP层的输入输出以及IP选项的处理、邻居子系统、路由、套接口及传输层等内容,全书基本涵盖了网络体系架构全部的知识点。特别是TCP,包括TCP连接的建立和终止、输入与输出,以及拥塞控制的实现。
✦ Table of Contents
封面
书名
版权
前言
目录
第1章 预备知识
1.1 应用层配置诊断工具
1.1.1 iputils
1.1.2 net-tools
1.1.3 iproute2
1.2 内核空间与用户空间的接口
1.2.1 procfs
1.2.2 sysctl(/proc/sys目录)
1.2.3 sysfs(/sys文件系统)
1.2.4 ioctl系统调用
1.2.5 netlink套接口
1.3 网络I/O加速
1.3.1 TSO/GSO
1.3.2 I/O AT
1.4 其他
1.4.1 slab分配器
1.4.2 RCU
第2章 网络体系结构概述
2.1 引言
2.2 协议简介
2.3 网络架构
2.4 系统调用接口
2.5 协议无关接口
2.6 传输层协议
2.7 套接口缓存
2.8 设备无关接口
2.9 设备驱动程序
2.10 网络模块源代码组织
第3章 套接口缓存
3.1 引言
3.2 sk_buff结构
3.2.1 网络参数和内核数据结构
3.2.2 SKB组织相关的变量
3.2.3 数据存储相关的变量
3.2.4 通用的成员变量
3.2.5 标志性变量
3.2.6 特性相关的成员变量
3.3 skb_shared_info结构
3.3.1 “零拷贝”技术
3.3.2 对聚合分散I/O数据的支持
3.3.3 对GSO的支持
3.3.4 访问skb_shared_info结构
3.4 管理函数
3.4.1 SKB的缓存池
3.4.2 分配SKB
3.4.3 释放SKB
3.4.4 数据预留和对齐
3.4.5 克隆和复制SKB
3.4.6 链表管理函数
3.4.7 添加或删除尾部数据
3.4.8 拆分数据:skb_split()
3.4.9 重新分配SKB的线性数据区:pskb_expand_head()
3.4.10 其他函数
第4章 网络模块初始化
4.1 引言
4.2 网络模块初始化顺序
4.3 优化基于宏的标记
4.4 网络设备处理层初始化
第5章 网络设备
5.1 PCI设备
5.1.1 PCI驱动程序相关结构
5.1.2 注册PCI驱动程序
5.2 与网络设备有关的数据结构
5.2.1 net_device结构
5.2.2 网络设备有关结构的组织
5.2.3 相关函数
5.3 网络设备的注册
5.3.1 设备注册的时机
5.3.2 分配net_device结构空间
5.3.3 网络设备注册过程
5.3.4 注册设备的状态迁移
5.3.5 设备注册状态通知
5.3.6 引用计数
5.4 网络设备的注销
5.4.1 设备注销的时机
5.4.2 网络设备注销过程
5.5 网络设备的启用
5.6 网络设备的禁用
5.7 与电源管理交互
5.7.1 挂起设备
5.7.2 唤醒设备
5.8 侦测连接状态改变
5.8.1 调度处理连接状态改变事件
5.8.2 linkwatch标志
5.9 从用户空间配置设备相关信息
5.9.1 ethtool
5.9.2 媒体独立接口
5.10 虚拟网络设备
第6章 IP编址
6.1 接口和IP地址
6.1.1 主IP地址、从属IP地址和IP别名
6.1.2 IP地址的组织
6.1.3 in_device结构
6.1.4 in_ifaddr结构
6.2 函数
6.2.1 inetdev_init()
6.2.2 inetdev_destroy()
6.2.3 inet_select_addr()
6.2.4 inet_confirm_addr()
6.2.5 inet_addr_onlink()
6.2.6 inetdev_by_index()
6.2.7 inet_ifa_byprefix()
6.2.8 inet_abc_len()
6.3 IP地址的设置
6.3.1 netlink接口
6.3.2 inet_insert_ifa()
6.3.3 inet_del_ifa()
6.4 ioctl
6.5 inetaddr_chain通知链
第7章 接口层的输入
7.1 系统参数
7.2 接口层的ioctl
7.2.1 SIOCxIFxxx类命令
7.2.2 SIOCETHTOOL
7.2.3 私有命令
7.3 初始化
7.4 softnet_data结构
7.5 NAPI方式
7.5.1 网络设备中断例程
7.5.2 网络输入软中断
7.5.3 轮询处理
7.6 非NAPI方式
7.7 接口层输入报文的处理
7.7.1 报文接收例程
7.7.2 netif_receive_skb()
7.7.3 dev_queue_xmit_nit()
7.8 响应CPU状态的变化
7.9 netpoll
7.9.1 netpoll相关结构
7.9.2 注册netpoll实例
7.9.3 netpoll的输入
7.9.4 netpoll的输出
7.9.5 tx_work工作队列
7.9.6 netpoll实例:netconsole
第8章 接口层的输出
8.1 输出接口
8.1.1 dev_queue_xmit()
8.1.2 dev_hard_start_xmit()
8.1.3 e100的输出接口:e100_xmi_frame()
8.2 网络输出软中断
8.2.1 netif_schedule()
8.2.2 net_tx_action()
8.3 网络设备不支持GSO时的处理
8.3.1 dev_gso_cb私有控制块
8.3.2 dev_gso_segment()
8.3.3 skb_gso_segmem()
第9章 流量控制
9.1 通过流量控制后输出
9.1.1 dev_queue_xmit()
9.1.2 qdisc_restart()
9.2 构成流量控制的三种元素
9.2.1 排队规则
9.2.2 类
9.2.3 过滤器
9.3 默认的FIFO排队规则
9.3.1 pfifo_fast_init()
9.3.2 pfifo_fast_reset()
9.3.3 pfifo_fast_enqueue()
9.3.4 pfifo_fast_dequeue()
9.3.5 pfifo_fast_requeue()
9.4 netlink的tc接口
9.5 排队规则的创建接口
9.5.1 类的创建接口
9.5.2 过滤器的创建接口
第10章 Internet协议族
10.1 net_proto_family结构
10.2 inet_protosw结构
10.3 net_protocol结构
10.4 Internet协议族的初始化
第11章 IP:网际协议
11.1 引言
11.1.1 IP首部
11.1.2 IP数据报的输入与输出
11.2 IP的私有信息控制块
11.3 系统参数
11.4 初始化
11.5 IP层套接口选项
11.6 ipv4_devconf结构
11.7 套接口的错误队列
11.7.1 添加ICMP差错信息
11.7.2 添加由本地产生的差错信息
11.7.3 读取错误信息
11.8 报文控制信息
11.8.1 IP控制信息块
11.8.2 报文控制信息的输出
11.8.3 报文控制信息的输入
11.9 对端信息块
11.9.1 系统参数
11.9.2 对端信息块的创建和查找
11.9.3 对端信息块的删除
11.9.4 垃圾回收
11.10 IP数据报的输入处理
11.10.1 IP数据报输入到本地
11.10.2 IP数据报的转发
11.11 IP数据报的输出处理
11.11.1 IP数据报输出到设备
11.11.2 TCP输出的接口
11.11.3 UDP输出的接口
11.12 IP层对GSO的支持
11.12.1 inet_gso_segment()
11.12.2 inet_gso_send_check()
第12章 IP选项处理
12.1 IP选项
12.1.1 选项列表的结束符
12.1.2 空操作
12.1.3 安全选项
12.1.4 严格源路由选项
12.1.5 宽松源路由选项
12.1.6 记录路由选项
12.1.7 流标识选项
12.1.8 时间戳选项
12.1.9 路由器警告选项
12.2 ip_options结构
12.3 在IP数据报中构建IP选项
12.4 复制IP数据报中选项到指定的ip_options结构
12.5 处理待发送IP分片中的选项
12.6 解析IP选项
12.7 还原在校验IP选项时修改的IP选项
12.8 处理转发IP数据报中的IP选项
12.9 处理IP数据报的源路由选项
12.10 解析并处理IP首部中的IP选项
12.11 路由警告选项的处理
12.12 由控制信息生成IP选项信息块
第13章 IP的分片与组装
13.1 系统参数
13.2 分片
13.2.1 快速分片
13.2.2 慢速分片
13.3 组装
13.3.1 ipq结构
13.3.2 ipq散列表和链表的维护
13.3.3 ipq散列表的重组
13.3.4 超时IP分片的清除
13.3.5 垃圾收集
13.3.6 相关分片组装函数
13.3.7 分片组装
第14章 ICMP:Internet控制报文协议
14.1 ICMP报文结构
14.2 注册ICMP报文类型
14.3 系统参数
14.4 ICMP的初始化
14.5 输入处理
14.5.1 差错处理
14.5.2 重定向处理
14.5.3 请求回显
14.5.4 时间戳请求
14.5.5 地址掩码请求和应答
14.6 输出处理
14.6.1 发送ICMP报文
14.6.2 发送回显应答和时间戳应答报文
第15章 IP组播
15.1 初始化
15.2 虚拟接口
15.2.1 虚拟接口的添加
15.2.2 虚拟接口的删除:vif_delete()
15.2.3 查找虚拟接口:ipmr_find_vif()
15.3 组播转发缓存
15.3.1 组播转发缓存的创建
15.3.2 组播转发缓存的删除
15.3.3 组播转发缓存的查找
15.3.4 向组播路由守护进程发送报告
15.4 临时组播转发缓存
15.4.1 临时组播转发缓存队列
15.4.2 创建临时组播转发缓存
15.4.3 用于超时而删除临时组播转发缓存的定时器
15.4.4 释放临时组播缓存项中保存的临时组播报文
15.5 外部事件
15.6 组播套接口选项
15.6.1 IP_MULTICAST_TTL
15.6.2 IP_MULTICAST_LOOP
15.6.3 IP_MULTICAST_IF
15.6.4 IP_ADD_MEMBERSHIP
15.6.5 IP_DROP_MEMBERSHIP
15.6.6 IP_MSFILTER
15.6.7 IP_BLOCK_SOURCE和IP_UNBLOCK_SOURCE
15.6.8 IP_ADD_SOURCE_MEMBERSHIP和IP_DROP_SOURCE_MEMBERSHIP
15.6.9 MCAST_JOIN_GROUP
15.6.10 MCAST_LEAVE_GROUP
15.6.11 MCAST_BLOCK_SOURCE和MCAST_UNBLOCK_SOURCE
15.6.12 MCAST_JOIN_SOURCE_GROUP和MCAST_LEAVE_SOURCE_GROUP
15.6.13 MCAST_MSFILTER
15.7 组播选路套接口选项
15.7.1 MRT_INIT
15.7.2 MRT_DONE
15.7.3 MRT_ADD_VIF和MRT_DEL_VIF
15.7.4 MRT_ADD_MFC和MRT_DEL_MFC
15.7.5 MRT_ASSERT
15.8 组播的ioctl
15.8.1 SIOCGETVIFCNT
15.8.2 SIOCGETSGCNT
15.9 组播报文的输入
15.10 组播报文的转发
15.10.1 ip_mr_forward()
15.10.2 ipmr_queue_xmit()
15.11 组播报文的输出
第16章 IGMP:Internet组管理协议
16.1 in_device结构中的组播参数
16.2 ip_mc_list结构
16.3 系统参数
16.4 IGMP的版本与协议结构
16.4.1 IGMP的版本
16.4.2 第一版和第二版的IGMP报文结构
16.4.3 第三版的IGMP查询报文结构
16.4.4 第三版的IGMP报告结构
16.5 IGMP报文的输入
16.6 函数
16.6.1 ip_mc_find_dev()
16.6.2 ip_check_mc()
16.7 成员关系查询
16.8 成员关系报告
16.8.1 最近离开组播组列表的维护
16.8.2 is_in()
16.8.3 add_grec()
16.8.4 普通查询的报告
16.8.5 V1和V2的报告以及V3的当前状态记录报告
16.8.6 主动发送组关系报告
16.9 维护套接口组播状态
16.9.1 套接口加入组播组
16.9.2 套接口离开组播组
16.10 维护网络设备组播状态
16.10.1 被阻止的组播源列表的维护
16.10.2 网络设备加入组播组
16.10.3 网络设备离开组播组
16.11 ip_mc_source()
16.12 ip_mc_msfilter()
16.13 网络设备组播硬件地址的管理
第17章 邻居子系统
17.1 什么是邻居子系统
17.2 系统参数
17.3 邻居子系统的结构
17.3.1 neigh_table结构
17.3.2 neighbour结构
17.3.3 neigh_ops结构
17.3.4 neigh_parms结构
17.35 pneigh_entry结构
17.36 neigh_statistics结构
17.3.7 hh_cache结构
17.4 邻居表的初始化
17.5 邻居项的状态机
17.6 邻居项的添加与删除
17.6.1 netlink接口
17.6.2 ioctl
17.6.3 路由表项与邻居项的绑定
17.6.4 接收到的并非请求的应答
17.7 邻居项的创建与初始化
17.7.1 neigh_alloc()
17.7.2 neigh_create()
17.8 邻居项散列表的扩容
17.9 邻居项的查找
17.9.1 neigh_lookup()
17.9.2 neigh_lookup_nodev()
17.9.3 _neigh_lookup()和neigh_lookup_errno()
17.10 邻居项的更新
17.11 垃圾回收
17.11.1 同步回收
17.11.2 异步回收
17.12 外部事件
17.13 邻居项状态处理定时器
17.14 代理项
17.14.1 代理项的查找、添加和删除
17.14.2 延时处理代理的请求报文
17.15 输出函数
17.15.1 丢弃
17.15.2 慢速发送
17.15.3 快速发送
第18章 ARP:地址解析协议
18.1 ARP报文格式
18.2 系统参数
18.3 注册ARP报文类型
18.4 ARP初始化
18.5 ARP的邻居项函数指针表
18.6 ARP表
18.7 函数
18.7.1 arp_error_report()
18.7.2 arp_solicit()
18.7.3 arp_ignore()
18.7.4 arp_filter()
18.8 IPv4中邻居项的初始化
18.9 ARP报文的创建
18.10 ARP的输出
18.11 ARP的输入
18.11.1 arp_rcv()
18.11.2 arp_process()
18.12 ARP代理
18.12.1 arp_process()
18.12.2 arp_fwd_proxy()
18.12.3 parp_redo()
18.13 ARP的ioctl
18.14 外部事件
18.15 路由表项与邻居项的绑定
第19章 路由表
19.1 什么是路由表
19.1.1 路由的要素
19.1.2 特殊路由
19.1.3 路由缓存
19.2 系统参数
19.3 路由表组成结构
19.3.1 fib_table结构
19.3.2 fn_zone结构
19.3.3 fib_node结构
19.3.4 fib_alias结构
19.3.5 fib_info结构
19.3.6 fib_nh结构
19.4 路由表的初始化
19.5 netlink接口
19.5.1 netlink路由表项消息结构
19.5.2 inet_rtm_newroute()
19.5.3 inet_rtm_delroute()
19.6 获取指定的路由表
19.7 路由表项的添加
19.8 路由表项的删除
19.9 外部事件
19.9.1 网络设备状态变化事件
19.9.2 IP地址变化事件
19.9.3 fib_add_ifaddr()
19.9.4 fib_del_ifaddr()
19.9.5 fib_disable_ip()
19.9.6 fib_magic()
19.10 选路
19.10.1 输入选路:ip_route_input_slow()
19.10.2 组播输入选路:ip_route_input_mc()
19.10.3 输出选路:ip_route_output_slow()
19.10.4 fib_lookup()
19.10.5 fn_hash_lookup()
19.11 ICMP重定向消息的发送
📜 SIMILAR VOLUMES
学习编程的人都知道,阅读、剖析名家代码乃是提高水平的捷径。源码之前,了无秘密。大师们的缜密思维、经验结晶、技术思路、独到风格,都原原本本体现在源码之中。 这本书所呈现的源码,使读者看到vector的实现、list的实现、heap的实现、deque的实现、Red Black tree的实现、hash table的实现、set/map的实现;看到各种算法(排序、查找、排列组合、数据移动与复制技术)的实现;甚至还能够看到底层的memory pool和高阶抽象的traits机制的实现。
书签已装载, 书签制作方法请找 [email protected] 完全免费 本书对早期Linux内核(v0.12)全部代码文件进行了详细、全面的注释和说明,旨在帮助读者用较短的时间对Linux的工作机理获得全面而深刻的理解,为进一步学习和研究Linux打下坚实的基础。虽然选择的版本较低,但该内核已能够正常编译运行,并且其中已包括了Linux工作原理的精髓。书中首先以Linux源代码版本的变迁为主线,介绍了Linux的历史,同时着重说明了各个内核版本的主要区别和改进,给出了选择0.12版内核源代码作为研究对象的原因。在正式描述内核源代码之前,概要介绍了运行Linux