Linux内核源码剖析(套装上下册)

当前位置:首页 > 计算机网络 > 网络与数据通信 > Linux内核源码剖析(套装上下册)

出版社:机械工业出版社
出版日期:2011-1
ISBN:9787111323730
作者:樊东东,莫澜
页数:1062页

章节摘录

插图:尽管技术有了巨大的进步,但是TCP/IP协议栈的处理方式却几乎没有变化。也就是说,即便用户使用最先进的CPU,依然要处理那些未经优化的TCP/IP协议,由此产生巨大的系统开销。例如,TCP/IP的传输过程中需要封装、解包,这些动作对于处理器而言并不是一个复杂的过程,但是会占用处理器周期,而且网络带宽越高,这个问题越严重。系统开销的增大不仅仅表现在占用较多的处理器周期,还会导致处理网络相关数据时的内存访问效率降低。这又会进一步降低CPU效能和网络效率。过去,网络流量较低,处理网络相关数据所产生的开销,远远低于用于执行正常任务的开销,所以并未引起重视。现在,随着网络流量大幅度提升,处理网络相关数据所产生的系统开销越来越不能忽视,甚至已经影响到了正常应用。现有几种解决方案:  (1)TSO(TCP Segmentation Offioad)  通过网络设备上的专用处理器处理部分或者全部的封包,借此来降低对于系统处理器资源的占用,不过这种解决方案只对具有某些特征的数据包有效。(2)RDMA(。Remote Direct MemoryAccess,远程直接内存访问)发送端系统直接将有效数据送至目的系统指定的内存中,无需移动数据包的时间消耗,因此大大提升了网络传输的效率。但是这种技术需要专用的网络设备,应用程序也需要进行修改,甚至还增加了一个RDMA层的封装过程,而且这种操作风险较高,因此目前看来还不是一个吸引人的解决方案。  (3)Onloading技术  将系统处理器作为处理网络流量的第一引擎,尽可能地提升CP[J处理网络数据包的效率,这种思想已经被英特尔借鉴。

前言

有人宣称Linux人才是未来20年IT职场中的王者。无论这种说法有多夸张,有一个事实是不可否认的,那就是,近年来Linux的市场份额不断增长,Linux正在受到越来越多的关注乃至推崇。由于Linux可广泛地应用到各种系统,包括很多嵌入式系统上,以及其他的诸多优点,如开放、高效、丰富的网络功能等,这种趋势在可预计的未来还将持续。目前,国内对Linux各方面的研究工作没有国外那样广泛和深入,相关的出版物水准参差不齐。特别是在网络的实现方面,有些著作针对性不强,有些则缺少了重要的传输层协议实现的论述,还有一些虽然有比较全面的介绍,却不够深入,选用的Linux版本也比较旧。针对以上情况,本书选择了较新的2.6.2 0版本内核RCP/IP实现作详细的论述,在重要的细节处甚至逐行分析,并在此基础上,对代码背后的机制和原理作了深入的阐述,将各关键点连成一个整体,帮助读者理清整个Linux网络部分的脉络。作者本着严谨的态度,在写作过程中参阅了大量的中英文资料及相关的文档。相信本书可以成为那些希望深入了解Linux的TCP/IP协议栈、网络部分实现的人们的有力工具。本书共有33章,通过自底向上的方法来论述TCP/IP的实现,从数据链路层开始,然后是网络层(IP、ICMP、IGMP、路由以及邻居子系统和IP组播),接下来是套接口,最后是传输层(TCP和UDP)。在学习的时候也可以采用自顶向下的方法(从传输层开始向下),或者结合以上两种方法。要理解一个系统的运行机制,对于一个专业人员来说,代码是最为直接也最为可靠的资源。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.5 netlink套接口
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

下 册 目 录

第20章 路由缓存
551
20.1 系统参数
551
20.2 路由缓存的组织结构
552
20.2.1 rtable结构
552
20.2.2 flowi结构
555
20.2.3 dst_entry结构
556
20.2.4 dst_ops结构
559
20.3 初始化
561
20.4 创建路由缓存项
563
20.4.1 创建输入路由缓存项
563
20.4.2 创建输出路由缓存项
565
20.5 添加路由表项到缓存中:
rt_intern_hash()
568
20.6 输入路由缓存查询:
ip_route_input()
571
20.7 输出路由缓存查询
573
20.7.1 ip_route_output_key()
573
20.7.2 __ip_route_output_key()
573
20.8 垃圾回收
575
20.8.1 路由缓存项的过期
575
20.8.2 判断缓存路由表项是否
可被删除
575
20.8.3 同步清理
576
20.8.4 异步清理
580
20.8.5 路由缓存项的释放
582
20.9 刷新缓存
582
20.9.1 通过定时器定时刷新
584
20.9.2 网络设备的硬件地址发生
改变
584
20.9.3 网络设备状态发生变化
584
20.9.4 给设备添加或删除一个
IP地址
584
20.9.5 全局转发状态或设备的转发
状态发生变化
584
20.9.6 一条路由被删除
585
20.9.7 通过写/proc的flush文件
585
20.10 ICMP重定向消息的处理
585
20.11 ICMP目的不可达,需要分片
消息的处理
588
第21章 路由策略
590
21.1 路由策略组织结构
590
21.1.1 fib_rules_ops结构
590
21.1.2 fib_rule结构
592
21.1.3 fib4_rule结构
594
21.2 三个默认路由策略
595
21.3 IPv4协议族的fib_rules_ops
结构实例
595
21.3.1 fib4_rule_action()
595
21.3.2 fib4_rule_match()
596
21.3.3 fib4_rule_configure()
596
21.3.4 fib4_rule_compare()
598
21.3.5 fib4_rule_fill()
598
21.3.6 fib4_rule_default_pref()
599
21.4 netlink接口
599
21.4.1 netlink路由策略消息结构
599
21.4.2 fib_nl_newrule()
600
21.4.3 fib_nl_delrule()
602
21.5 受网络设备状态改变的影响
604
21.6 策略路由的查找
604
第22章 套接口层
606
22.1 socket结构
607
22.2 proto_ops结构
608
22.3 套接口文件系统
610
22.3.1 套接口文件系统类型
610
22.3.2 套接口文件系统超级块操作
接口
610
22.3.3 套接口文件的inode
611
22.3.4 sock_alloc_inode()
611
22.3.5 sock_destroy_inode()
612
22.4 套接口文件
612
22.4.1 套接口文件与套接口的绑定
612
22.4.2 根据文件描述符获取套接口
614
22.5 进程、文件描述符和套接口
615
22.6 套接口层的系统初始化
616
22.7 套接口系统调用
617
22.7.1 套接口系统调用入口
617
22.7.2 socket系统调用
621
22.7.3 bind系统调用
629
22.7.4 listen系统调用
632
22.7.5 accept系统调用
633
22.7.6 connect系统调用
635
22.7.7 shutdown系统调用
636
22.7.8 close系统调用
638
22.7.9 select系统调用的实现
640
第23章 套接口I/O
641
23.1 输出/输入数据的组织
641
23.1.1 msghdr结构
641
23.1.2 verify_iovec()
643
23.1.3 memcpy_toiovec()
644
23.1.4 memcpy_fromiovec()
644
23.1.5 memcpy_fromiovecend()
644
23.1.6 csum_partial_copy_
fromiovecend()
644
23.2 输出系统调用
644
23.2.1 sock_sendmsg()
644
23.2.2 sendto系统调用
645
23.2.3 send系统调用
646
23.2.4 sendmsg系统调用
646
23.3 输入系统调用
649
第24章 套接口选项
650
24.1 setsockopt系统调用
650
24.2 ioctl系统调用
655
24.2.1 ioctl在文件系统内的调用过程
655
24.2.2 套接口文件ioctl调用接口的
实现
655
24.2.3 套接口层的实现
658
24.3 getsockname系统调用
659
24.4 getpeername系统调用
660
第25章 传输控制块
661
25.1 系统参数
662
25.2 传输描述块结构
662
25.2.1 sock_common结构
662
25.2.2 sock结构
663
25.2.3 inet_sock结构
670
25.3 proto结构
674
25.3.1 proto实例组织结构
677
25.3.2 proto_register()
677
25.3.3 proto_unregister()
679
25.4 传输控制块的内存管理
680
25.4.1 传输控制块的分配和释放
680
25.4.2 普通的发送缓存区的分配
682
25.4.3 发送缓存的分配与释放
685
25.4.4 接收缓存的分配与释放
686
25.4.5 辅助缓存的分配与释放
688
25.5 异步IO机制
688
25.5.1 sk_wake_async()
689
25.5.2 sock_def_wakeup()
690
25.5.3 sock_def_error_report()
690
25.5.4 sock_def_readable()
691
25.5.5 sock_def_write_space()和
sk_stream_write_space()
691
25.5.6 sk_send_sigurg()
692
25.5.7 接收到FIN段后通知进程
692
25.5.8 sock_fasync()
693
25.6 传输控制块的同步锁
694
25.6.1 socket_lock_t结构
694
25.6.2 控制用户进程和下半部间
同步锁
695
25.6.3 控制下半部间同步锁
698
第26章 TCP:传输控制协议
699
26.1 系统参数
699
26.2 TCP的inet_protosw实例
705
26.3 TCP的net_protocol结构
705
26.4 TCP传输控制块
706
26.4.1 inet_connection_sock结构
706
26.4.2 inet_connection_sock_af_ops
结构
710
26.4.3 tcp_sock结构
711
26.4.4 tcp_options_received结构
721
26.4.5 tcp_skb_cb结构
723
26.5 TCP的proto结构和proto_ops
结构的实例
725
26.6 TCP状态迁移图
725
26.7 TCP首部
726
26.8 TCP校验和
727
26.8.1 输入TCP段的校验和检测
728
26.8.2 输出TCP段校验和的计算
729
26.9 TCP的初始化
729
26.10 TCP传输控制块的管理
731
26.10.1 inet_hashinfo结构
732
26.10.2 管理除LISTEN状态之外的
TCP传输控制块
733
26.10.3 管理LISTEN状态的
TCP传输控制块
734
26.11 TCP层的套接口选项
735
26.12 TCP的ioctl
736
26.13 TCP传输控制块的初始化
737
26.14 TCP的差错处理
737
26.15 TCP传输控制块层的缓存
管理
741
26.15.1 缓存管理的算法
741
26.15.2 发送缓存的管理
744
26.15.3 接收缓存的管理
745
第27章 TCP的定时器
746
27.1 初始化
746
27.2 连接建立定时器
747
27.2.1 连接建立定时器处理函数
747
27.2.2 连接建立定时器的激活
751
27.3 重传定时器
751
27.3.1 重传定时器处理函数
751
27.3.2 重传定时器的激活
756
27.4 延迟确认定时器
756
27.4.1 延时确认定时器的处理函数
756
27.4.2 延时确认定时器的激活
758
27.5 持续定时器
758
27.5.1 持续定时器处理函数
758
27.5.2 激活持续定时器
762
27.6 保活定时器
763
27.6.1 保活定时器处理函数
763
27.6.2 激活保活定时器
764
27.7 FIN_WAIT_2定时器
764
27.7.1 FIN_WAIT_2定时器处理函数
765
27.7.2 激活FIN_WAIT_2定时器
765
27.8 TIME_WAIT定时器
766
第28章 TCP连接的建立
767
28.1 服务端建立连接过程
767
28.2 连接相关的数据结构
770
28.2.1 request_sock_queue结构
770
28.2.2 listen_sock结构
771
28.2.3 tcp_request_sock结构
771
28.2.4 request_sock_ops结构
774
28.3 bind系统调用的实现
775
28.3.1 bind端口散列表
775
28.3.2 传输接口层的实现
775
28.4 listen系统调用的实现
779
28.4.1 inet_listen()
779
28.4.2 实现侦听:
inet_csk_listen_start()
780
28.4.3 分配连接请求块散列表:
reqsk_queue_alloc()
781
28.5 accept系统调用的实现
782
28.5.1 套接口层的实现:
inet_accept()
782
28.5.2 传输接口层的实现:
inet_csk_accept()
783
28.6 被动打开
785
28.6.1 SYN cookies
785
28.6.2 第一次握手:接收SYN段
786
28.6.3 第二次握手:
发送SYN+ACK段
793
28.6.4 第三次握手:接收ACK段
798
28.7 connect系统调用的实现
813
28.7.1 套接口层的实现:
inet_stream_connect()
813
28.7.2 传输接口层的实现
815
28.8 主动打开
816
28.8.1 第一次握手:发送SYN段
816
28.8.2 第二次握手:
接收SYN+ACK段
823
28.8.3 第三次握手:发送ACK段
828
28.9 同时打开
828
28.9.1 SYN_SENT状态接收SYN段
828
28.9.2 SYN_RECV状态接收
SYN+ACK段
830
第29章 TCP拥塞控制的实现
831
29.1 拥塞控制引擎
831
29.2 拥塞控制状态机
832
29.2.1 Open状态
833
29.2.2 Disorder状态
833
29.2.3 CWR状态
833
29.2.4 Recovery状态
834
29.2.5 Loss状态
834
29.3 拥塞窗口调整撤销
836
29.3.1 撤销拥塞窗口的检测
837
29.3.2 tcp_undo_cwr()
837
29.3.3 从Disorder拥塞状态撤销
838
29.3.4 从Recovery状态撤销
838
29.3.5 从Recovery拥塞状态撤销
839
29.3.6 从Loss拥塞状态撤销
839
29.4 显式拥塞通知
840
29.4.1 IP对ECN的支持
841
29.4.2 TCP对ECN的支持
841
29.5 拥塞控制状态的处理及转换
843
29.5.1 拥塞控制状态的处理:
tcp_fastretrans_alert()
843
29.5.2 拥塞避免
852
29.6 拥塞窗口的检测:
tcp_cwnd_test()
852
29.7 F-RTO算法
853
29.7.1 进入F-RTO算法处理阶段
853
29.7.2 进行F-RTO算法处理
855
29.8 拥塞窗口的检验
857
29.8.1 tcp_event_data_sent()
857
29.8.2 tcp_cwnd_validate()
858
29.9 支持多拥塞控制算法的机制
859
29.9.1 接口
859
29.9.2 注册拥塞控制算法:tcp_register_
congestion_control()
861
29.9.3 注销拥塞控制算法:tcp_unregister_
congestion_control()
861
29.9.4 选取某种拥塞控制算法: tcp_set_
congestion_control()
861
29.9.5 Linux支持的拥塞控制算法
862
第30章 TCP的输出
864
30.1 引言
864
30.2 最大段长度(MSS)
867
30.3 sendmsg系统调用在TCP中的
实现
870
30.3.1 分割TCP段
871
30.3.2 套接口层的实现
871
30.3.3 传输接口层的实现
871
30.4 对TCP选项的处理
889
30.4.1 构建SYN段的选项
889
30.4.2 构建非SYN段的选项
892
30.5 Nagle算法
893
30.6 ACK的接收
894
30.6.1 tcp_ack()
894
30.6.2 发送窗口的更新
899
30.6.3 根据SACK选项标记重传
队列中段的记分牌
900
30.6.4 重传队列中已经确认段的删除
910
30.7 往返时间测量和RTO的计算
913
30.8 路径MTU发现
915
30.8.1 路径MTU发现原理
915
30.8.2 路径MTU发现时的黑洞
916
30.8.3 有关数据结构的初始化
916
30.8.4 创建路径MTU发现TCP段并
发送
916
30.8.5 路径MTU发现失败后处理
920
30.8.6 处理需要分片ICMP目的
不可达报文
920
30.8.7 更新当前有效的MSS
921
30.8.8 路径MTU发现成功后处理
922
30.9 TCP重传接口
922
第31章 TCP的输入
926
31.1 引言
926
31.2 TCP接收的总入口
927
31.2.1 接收到prequeue队列
930
31.2.2 有效TCP段的处理
931
31.3 报文的过滤
932
31.3.1 过滤器的数据结构
933
31.3.2 安装过滤器
935
31.3.3 卸载过滤器
937
31.3.4 过滤执行
938
31.4 ESTABLISHED状态的接收
938
31.4.1 首部预测
939
31.4.2 接收处理无负荷的ACK段
941
31.4.3 执行快速路径
942
31.4.4 执行慢速路径
945
31.4.5 数据从内核空间复制到用户
空间
948
31.4.6 通过调节接收窗口进行
流量控制
952
31.4.7 确定是否需要发送ACK段
(用于接收的数据从内核空
间复制到用户空间时)
956
31.5 TCP选项的处理
957
31.5.1 慢速路径中快速解析TCP选项
957
31.5.2 全面解析TCP选项
958
31.6 慢速路径的数据处理
961
31.6.1 接收处理预期的段
963
31.6.2 接收处理在接收窗口之外的段
965
31.6.3 接收处理乱序的段
966
31.6.4 tcp_ofo_queue()
969
31.7 带外数据处理
970
31.7.1 检测紧急指针
970
31.7.2 读取带外数据
972
31.8 SACK信息
973
31.8.1 SACK允许选项
973
31.8.2 SACK选项
974
31.8.3 SACK的产生
974
31.8.4 发送方对SACK的响应
975
31.8.5 实现
975
31.9 确认的发送
975
31.9.1 快速确认模式
976
31.9.2 处理数据接收事件
977
31.9.3 发送确认紧急程度和状态
978
31.9.4 延迟或快速确认
979
31.10 recvmsg系统调用在TCP中的
实现
980
31.10.1 套接口层的实现
980
31.10.2 传输接口层的实现
980
31.11 sk_backlog_rcv接口
991
第32章 TCP连接的终止
992
32.1 连接终止过程
993
32.1.1 正常关闭
993
32.1.2 同时关闭
994
32.2 shutdown传输接口层的
实现
994
32.2.1 tcp_shutdown()
994
32.2.2 tcp_send_fin()
995
32.3 close传输接口层的实现:
tcp_close()
995
32.4 被动关闭:FIN段的接收
处理
999
32.5 主动关闭
1002
32.5.1 timewait控制块的数据
结构
1002
32.5.2 timewait控制块取代TCP传输
控制块
1006
32.5.3 启动FIN_WAIT_2或TIME_WAIT
定时器
1008
32.5.4 CLOSE_WAIT、LAST_ACK、
FIN_WAIT1、FIN_WAIT2与
CLOSING状态处理
1010
32.5.5 FIN_WAIT2和TIME_WAIT
状态处理
1013
32.5.6 timewait控制块的2MSL
超时处理
1020
第33章 UDP:用户数据报
1023
33.1 引言
1023
33.1.1 UDP首部
1023
33.1.2 UDP的输入与输出
1024
33.2 UDP的inet_protosw结构
1024
33.3 UDP的传输控制块
1025
33.4 UDP的proto结构和proto_ops
结构的实例
1027
33.5 UDP的状态
1027
33.6 UDP传输控制块的管理
1027
33.7 bind系统调用的实现
1028
33.8 UDP套接口的关闭
1031
33.9 connect系统调用的实现
1032
33.9.1 udp_disconnect()
1033
33.9.2 ip4_datagram_connect()
1033
33.10 select系统调用的实现
1034
33.11 UDP的ioctl
1037
33.12 UDP的套接口选项
1037
33.13 UDP校验和
1038
33.13.1 输入UDP数据报校验和的
计算
1038
33.13.2 输出UDP数据报校验和的
计算
1039
33.14 UDP的输出:sendmsg系统
调用
1040
33.14.1 udp_sendmsg()
1040
33.14.2 udp_push_pending_frames()
1047
33.15 UDP的输入
1048
33.15.1 UDP接收的入口:
udp_rcv()
1048
33.15.2 UDP组播数据报输入:
__udp4_lib_mcast_deliver()
1052
33.15.3 udp_queue_rcv_skb()
1053
33.16 recvmsg系统调用的实现
1055
33.17 UDP的差错处理:
udp_err()
1059
33.18 轻量级UDP
1061
参考文献
1063

编辑推荐

《Linux内核源码剖析:TCP/IP实现(套装上下册)》:套接口缓存网络设备IP:网际协议ICMP:Internet控制报文协议IP组播IGMP:Internet组管理协议邻居子系统路由表套接口层TCP:传输控制协议TCP连接的建立TOP拥塞控制的实现TCP的输出TCP的输入TCP连接的终止UDP:用户数据报

作者简介

《Linux内核源码剖析:TCP/IP实现(套装上下册)》详细论述了Linux内核2.6.20版本中TCP/IP的实现。书中给出了大量的源代码,通过对源代码的详细注释,帮助读者掌握TCP/IP的实现。《Linux内核源码剖析:TCP/IP实现(套装上下册)》根据协议栈层次,从驱动层逐步论述到传输层,包括驱动的实现、接口层的输入输出、IP层的输入输出以及IP选项的处理、邻居子系统、路由、套接口及传输层等内容,全书基本涵盖了网络体系架构全部的知识点。特别是TCP,包括TCP连接的建立和终止、输入与输出,以.及拥塞控制的实现。
《Linux内核源码剖析:TCP/IP实现(套装上下册)》适用于熟悉Linux的基本使用方法,对Linux内核工作原理以及网络知识有一定的了解,而又极想更深入理解各个机制在Linux中的具体实现的用户,包括应用程序员和嵌入式程序员,以及网络管理员等。相关专业的科研人员在工作中遇到问题时,也可以查阅《Linux内核源码剖析:TCP/IP实现(套装上下册)》,理解相关内核部分的实现。此外,计算机相关专业的本科高年级学生和研究生,在学习相关课程(如操作系统、计算机网络等)时,可将《Linux内核源码剖析:TCP/IP实现(套装上下册)》作为辅助教程,与理论相结合以便更好地理解相应的知识点。

图书封面


 Linux内核源码剖析(套装上下册)下载 精选章节试读 更多精彩书评



发布书评

 
 


精彩书评 (总计1条)

  •     作为IT人,看过的IT技术书不少了,原来的印象是国内的IT书好的很少,尤其是有大牛挂名的书(非第一作者的),质量其实更是没有保证。这本书的作者虽然没什么名气,但往往国内的精品书就是这样的人写的。我与《深入理解网络Linux技术内幕》(包括英文版)对照着看了,《深入理解》虽然是公认的精品书,但其实瑕疵相当多(比《LDD》和《ULK》差远了),尤其是驱动层的分析写得不好——组织混乱,还不够深入。而《Linux剖析》这本国人作品,虽然形式只是代码剖析,但是写得很用心,除去代码的分析外,会加入原理的介绍和很多图的说明,至少在驱动层的分析上比《深入理解网络Linux技术内幕》要好。更难能可贵的是,是对2.6.20内核做的剖析,比较新,使读者能很快迁移到实际工作中去,总的来说:很棒!赞一个!

精彩短评 (总计46条)

  •     内容详尽,很丰富,讲解的很容易理解
  •     印刷质量很好,自己买了看不是为了学习Linux的TCP/IP的实现,而是为了学习其中的编码技巧。就这方面来说,自己已经达到了目的。Linux的编码都是一些高手所为,编码的风格和技巧很值得自己学习。
  •     很满意,基本上该讲的都讲了,而且比较容易懂。推荐。
  •     字写的很大,内容有待研究,不好说
  •     正品,很不错,这本书也写得很好
  •     讲的还不错 国人讲的
  •     本来挺期待这两本书的,但是今天拿到货后,将两本书浏览了一下,发现里面80%的内容都是代码,100多块钱太不值了!!
  •     因工作需要学习TCP,基本能满足要求。就是有些地方没讲透彻。对初学都压力较大。
  •     书纸张太差了,用手一擦,手上有灰,不知到对身体有害没有哦,印刷厂是否合格啊?内容未看,对内容先不做评论。
  •     字体比较大,纸张不太好
  •     不敢说这本书的内容上有什么不妥,敢说的都是真正的高手。只能说书中内容大量引用《深入理解LINUX网络技术内幕》。有些关键内容没讲,比如netfilter和bridge等。从提上来说,对初学者还是很好的。价格偏高,纸质不行。
  •     很好的一本书,内容很丰富,慢慢看!
  •     基本上是一些代码
  •     我的水平不够,看起来有点吃力~~~
  •     此书买后放入公司图书室,大家评论很好, 前两周抢着看呢,呵呵
  •     作为IT人,看过的IT技术书不少了,原来的印象是国内的IT书好的很少,尤其是有大牛挂名的书(非第一作者的),质量其实更是没有保证。这本书的作者虽然没什么名气,但往往国内的精品书就是这样的人写的。我与《深入理解网络Linux技术内幕》(包括英文版)对照着看了,《深入理解》虽然是公认的精品书,但其实瑕疵相当多(比《LDD》和《ULK》差远了),尤其是驱动层的分析写得不好——组织混乱,还不够深入。而《Linux剖析》这本国人作品,虽然形式只是代码剖析,但是写得很用心,除去代码的分析外,会加入原理的介绍和很多图的说明,至少在驱动层的分析上比《深入理解网络Linux技术内幕》要好。更难能可贵的是,是对2.6.20内核做的剖析,比较新,使读者能很快迁移到实际工作中去,总的来说:很棒!赞一个!
  •     书绝对是盗版的;很不爽。
    虽然书是用来看的,但花了这么多钱买个盗版的很不爽!!!
    !!!
    当当图书品质一向是不错的,真不知道这次怎么搞的,竟然买盗版书!!!
    气愤!!!
  •     源码级的讲解,内容没得说啊!
  •     封皮破了,希望大家引以为戒
  •     书是不错,可惜代码太多,甚至整版整版的代码,觉得花钱买来这么多的印刷的代码不是很值,完全可以把2本的量放在1本里面,说是对代码进行分析,其实更多的人需要的是思路的指点而不是在这里去读源代码,完全可以减少很多代码,而是把代码的具体出处告诉读者,让读者自己去实践操作,可能会更好。抛开整版的代码太多的问题,其他都还不错,需要多看几遍才能看懂。
  •     讲解的很深入 但需要一定基础
  •     太专业了,不方便细说,自己买了参考就知道
  •     评,您的评价将帮助其他
  •     有点心痛花了那么多钱,不值
  •     已经开始看了,不错的书,每一章开始的时候都会把基础知识进行讲解,对于初学者或者对理论性的东东不是很理解的童鞋,还是比较有用的。
  •     刚拿到手中,觉得上面讲得还不错~对我们长期在linux环境中编写程序有一定的帮助。
  •     Linux内核图书
  •     只是讲代码,设计理念很少,还得看RFC和相关propose论文。和国外书籍还是有差距,不过总的来说,算是讲TCP协议最全的一本了。tcp/ip architecture那本书倒是过时了。(讲的2.4内核)
  •     对学习linux网络方面还是有帮助的不错。
  •     值得静下心来好好看看。。。
  •     同类书相比,很好的一本书,内容很全,很强大,很给力。
  •     我只用到了下册,上册没看,下册写的确实不错,连拥塞状态机这种不好找的资料都写得很明白。
  •     学习Linux内核代码的不错选择
  •     当成手册查看的。很多内容在网上都可以搜到。 不想费事,就买了。 相比较国内的其他书而言,更适合初学者对着这本书去看代码。
  •     整体来说还可以,含量不高,好多地方想过场子一样,没有点明白!拥塞控制那章真是太烂了 so suck!
  •     剖析的比较细致
  •     只能挺满意。书的内容其实是很好的,尤其适合初学者,唯一的遗憾是,价格的问题,70元左右还可以理解。书中有很多地方,都是一句概括,不够详细。谢谢。但总体讲来,挺满意!
  •     封面有些脏,其他还好
  •     之前一直看电子版的不舒服,后来买了,正好项目要用,对TCP、ip协议栈的脉络说的比较清楚,但感觉有的地方还是不够详细,比较,linux东西太多了。再就是价格,有点贵啊。
  •     为了写书而写的书,这书我翻了个目录,就再没看过.100多大洋啊~~~
  •     套装书,包装不错
  •     大体上把上册和下册的前半部分看完了,感觉还行。
    不过很多地方看着有点似曾相识的感觉。
    如果是初学linux的话,还是很值得看的。
  •     通过学习内核代码,对代码的编写有些指导意义。
  •     这本书对于TCP学习者来说不可或缺
  •     书是不错,可惜代码太多,甚至整版整版的代码,觉得花钱买来这么多的印刷的代码不是很值,完全可以把2本的量放在1本里面,说是对代码进行分析,其实更多的人需要的是思路的指点而不是在这里去读源代码,完全可以减少很多代码,而是把代码的具体出处告诉读者,让读者自己去实践操作,可能会更好。
    抛开整版的代码太多的问题,其他都还不错,需要多看几遍才能看懂。
  •     优点:全面讲解Linux网络协议栈的一本好书,内容比较充实。目前已经看到15章了,讲得比较清楚,收获比较大。建议大家在看之前先了解下Linux内核以及网络方面的知识,阅读起来会更轻松些。之前也看过《Understanding Linux Network Internal》和《TCP/IP详解卷1》等,但前者没有讲传输层且内核版本也比较老;后者重在讲理论。缺点:1. 虽然买到的第二次印刷的版本,但里面还是有些小的错误,不过不影响阅读。2. 书的纸张比较差。
 

外国儿童文学,篆刻,百科,生物科学,科普,初中通用,育儿亲子,美容护肤PDF图书下载,。 零度图书网 

零度图书网 @ 2024