Linux2.6 协议栈源代码分析
基于 Linux 2.6.18 内核源码
V0.1
luoyu
第 i 页
电
子
邮
Linux2.6 协议栈源代码分析
目 录
第2章 系统初始化
目 录
图目录
表目录
前 言
感 谢
第1章 协议栈概述
1.2 本书的组织和安排
1.1 操作系统及网络协议介绍
2.1 系统初始化流程简介
2.2 内核文件解读
1.1.1 Linux操作系统架构简介
1.1.2 网络协议发展介绍
2.2.1 ELF文件格式
2.2.2 Link Scripts知识
2.2.3 Linux内核镜像研究
1.2.1 基本的数据结构和计算机术语
1.2.2 图片风格演示
1.2.3 本书的组织
....................................................................................................................................... ii
.......................................................................................................................................... iv
........................................................................................................................................ viii
.................................................................................................................................... xiii
.................................................................................................................................... xiv
...................................................................................................................... 1
................................................................................................ 1
.......................................................................................... 1
.................................................................................................. 2
.......................................................................................................... 4
................................................................................ 5
.......................................................................................................... 6
............................................................................................................. 7
...................................................................................................................... 9
....................................................................................................... 9
................................................................................................................ 13
........................................................................................................ 13
................................................................................................... 15
............................................................................................... 16
..................................................................................................... 23
................................................................................................ 23
................................................................................................ 32
............................................................................................. 33
........................................................................................................ 35
................................................................................................................ 37
.............................................................................................. 39
............................................................................................. 40
........................................................................................................ 40
............................................................................................. 48
.................................................................................................... 50
................................................................................................ 58
.............................................................................................................. 58
.......................................................................................... 60
...................................................................................... 63
....................................................................................................................... 73
2.3.1 中断及软中断模型
2.3.2 各种语境下的切换
2.3.3 内核下的同步与互斥
2.3.4 各种异步手段
2.4 虚拟文件系统
2.5 网络协议栈各部分初始化
2.5.1 网络基础系统初始化
2.5.2 网络内存管理
2.5.3 网络文件系统初始化
2.5.4 网络协议初始化
2.5.5 初步了解路由系统
2.6.1 底层PCI模块的初始化
2.6.2 网络设备接口初始化例程
2.3 中断及任务调度管理
Linux设备管理
2.6
第3章 配置系统
第 ii 页
Linux2.6 协议栈源代码分析
第4章 网络层实现的初步研究
4.1 从Ping 127.0.0.1 开始旅程
4.2 再次相遇Socket系统调用
4.3
4.4
4.5 在路由系统中游历
IP数据报文格式
send系统调用
3.1 配置过程分析
3.1.1 配置是如何下达到内核的?
3.1.2 socket系统调用
3.1.3
ioctl代码的实现
3.1.4 Loopback接口的配置过程
3.1.5
IP别名的实现
3.2 回顾FIB系统初始化
3.3 深入FIB系统
3.4 FIB系统发生了什么样的变化
3.5 直接访问路由表
3.6 接口状态变化的处理过程
................................................................................................................ 73
.................................................................................. 73
.................................................................................................... 74
..................................................................................................... 81
.................................................................................... 90
........................................................................................................ 92
...................................................................................................... 96
................................................................................................................. 99
...................................................................................... 108
.......................................................................................................... 122
............................................................................................ 124
................................................................................................ 127
......................................................................................... 127
........................................................................................... 129
.......................................................................................................... 129
............................................................................................................. 130
...................................................................................................... 135
............................................................................................................. 135
.................................................................................... 146
..................................................................................... 147
.............................................................................................. 151
.......................................................................................................... 156
................................................................................................................. 165
......................................................................................................... 166
...................................................................................................... 166
........................................................................................ 167
.......................................................................................................... 180
.............................................................................................. 180
.................................................................................. 183
...................................................................................................... 184
........................................................................................................................... 198
.................................................................................................... 199
.................................................................................... 200
...................................................................................................... 202
.............................................................................................................. 207
....................................................................................................... 211
.............................................................................................................. 211
...................................................................................................... 211
.............................................................................................. 212
4.5.1 查找出口
4.5.2 当目的地址是远端主机时
4.5.3 创建对应路由cache表项
4.5.4 创建对应邻居表项
4.6 回到发送的路径
4.7 ARP的作用
4.7.1 ARP的机制
4.7.2 ARP报文格式
4.7.3 Linux ARP协议的实现
4.8 到达设备驱动层
4.8.1 数据链路层帧格式
4.8.2 Loopback设备的发送过程
4.9 从中断到路由系统
4.10
ICMP
4.10.1 ICMP报文格式
4.10.2 ping本机地址及回环地址
4.10.3 ping外部地址
4.11 从内核到用户
第5章 传输层实现的研究
5.1 进一步到UDP
5.1.1 UDP用户代码
5.1.2 UDP数据报文格式
第 iii 页
5.2 更高阶的TCP
Linux2.6 协议栈源代码分析
5.1.3 服务器端bind的实现
5.1.4 接收代码
5.1.5 释放UDP的socket
5.2.1 TCP用户代码
5.2.2 TCP数据报文格式
5.2.3 TCP栈及socket的初始化
5.2.4 服务器端bind和listen的实现
5.2.5 服务器端accept的实现
5.2.6 客户端connect的实现——发起三次握手
5.2.7 TCP报文的接收
5.2.8 3 次握手的实现
5.2.9 内核收到报文转到用户态
5.2.10 释放TCP的socket
........................................................................................... 212
............................................................................................................. 217
.............................................................................................. 219
.............................................................................................................. 221
...................................................................................................... 221
.............................................................................................. 222
.................................................................................... 223
............................................................................... 225
....................................................................................... 230
............................................................ 232
.................................................................................................. 240
................................................................................................... 245
.................................................................................... 247
............................................................................................... 252
.............................................................................................................. 256
....................................................................................... 257
........................................................................... 259
....................................................................................................... 261
......................................................................................... 262
............................................................................................... 263
....................................................................................................................... 268
.......................................................................................................... 268
.............................................................................................. 268
.......................................................................................................................... 269
........................................................................................................... 269
..................................................................... 270
................................................................................................................... 276
........................................................................................................... 276
....................................................................................... 278
................................................................................................................................... 284
................................................................................................................................... 285
7.3.1 VLAN概念
7.3.2 Linux下VLAN——存在巨大的缺陷
5.3.1 TCP拥塞控制机制介绍
5.3.2 Linux内核拥塞控制功能的实现
7.4.1 LACP简介
7.4.2 LACP在Linux中的实现
6.1.1 用户如何使用select?
6.1.2 Select的内核实现
Linux桥实现的基本框架
LACP协议
5.3 TCP拥塞控制
第6章 Select的实现机制
第7章 2层功能
7.1 基本的 2 层知识
7.2
7.3 VLAN
7.4
后 记
参考文献
图目录
图表 1-1 操作系统架构图
图表 1-2 IP为什么重要
................................................................................................................ 2
..................................................................................................................... 3
第 iv 页
Linux2.6 协议栈源代码分析
图表 1-3 真实操作系统协议栈实现
图表 1-4 list和hlist的区别
图表 1-5 函数调用树的演示
图表 2-1Linux内核编译——网络选项部分
图表 2-2 系统启动函数序列图
图表 2-3rest_init函数调用树
图表 2-4init函数调用关系树
图表 2-5ELF文件格式
图表 2-6 普通的ELF段排列
图表 2-7 中断向量和中断请求号之间的关系
图表 2-8 do_IRQ函数调用树
图表 2-9 系统调用发生的情况
图表 2-10VFS与底层各模块关系
图表 2-11 super_blocks和file_systems链表
图表 2-12 sock和sk_buff的关系
图表 2-13 skbuff_fclone_cache中的内存操作
图表 2-14 不同skb cache中的内存操作
图表 2-15 各协议层函数对网络报文头的理解
图表 2-16 kern_mount函数调用树
图表 2-17 sockfs_get_sb函数调用树
图表 2-18 inet_init调用树
图表 2-19 tcp_prot, udp_prot, raw_prot结构
图表 2-20 协议栈的具体形式
图表 2-21 pci_module_init函数调用树
图表 2-22 bus_match函数调用树
图表 2-23 drv->probe的被调用关系树
图表 2-24 系统装入各驱动程序的步骤
图表 2-25 drvprobe实现的基本功能
图表 2-26net_device和in_device、设备特定数据之间的关系
图表 3-1FD的意义
图表 3-2sys_socket的函数调用树
图表 3-3sock_alloc函数调用树
图表 3-4 soket_alloc结构
图表 3-5file、socket、sock之间的关系
图表 3-6 sock结构在不同协议的数据块
图表 3-7ioctl的内核实现
图表 3-8 inet_set_ifa之后数据结构之间的关系
图表 3-9 devinet_ioctl函数调用树
图表 3-10 inet_set_ifa发送NETDEV_UP事件
................................................................................................ 4
................................................................................................................. 6
............................................................................................................ 7
..................................................................................... 9
....................................................................................................... 10
............................................................................................................11
........................................................................................................... 12
..................................................................................................................... 14
............................................................................................................ 14
.............................................................................. 24
.......................................................................................................... 27
...................................................................................................... 29
................................................................................................... 38
.................................................................................... 38
...................................................................................................... 41
................................................................................ 46
........................................................................................ 46
............................................................................ 48
.................................................................................................. 49
.............................................................................................. 50
................................................................................................................ 51
................................................................................... 52
........................................................................................................ 57
........................................................................................... 61
.................................................................................................... 62
........................................................................................... 63
........................................................................................ 63
........................................................................................... 65
..................................................... 71
........................................................................................................................... 75
................................................................................................... 76
....................................................................................................... 76
................................................................................................................. 77
......................................................................................... 80
........................................................................................ 81
................................................................................................................. 82
............................................................................ 86
.................................................................................................. 87
............................................................................... 87
第 v 页
Linux2.6 协议栈源代码分析
图表 3-11 rtentry被拆分成 3 个部分
图表 3-12 rtnetlink_init函数调用树
图表 3-13 probe发起NET_DEV_REGISTER事件
图表 3-14 dev_open发起NETDEV_UP事件
图表 3-15 IP别名的用途
图表 3-16 ifa_list的组织形式
图表 3-17 FIB和RT cache的关系
图表 3-18 devinet_init函数调用树
图表 3-19ip_fib_init函数调用树
图表 3-20 Linux内核路由模块结构
图表 3-21 FIB规则和FIB表的关系
图表 3-22 不同算法的fib_table的结构不同
图表 3-23fib_table和fn_zone、fib_node结构的关系
图表 3-24fib_inetaddr_event函数内部实现
图表 3-25 fn_hash_insert之后fib_table和fn_zone及fib_node之间的关系
图表 3-26 fib_node与fib_alias、fib_info、fib_nh结构的关系
图表 3-27 fib_info_hash和fib_info_devhash的关系
图表 3-28 第一次完成FIB表插入
图表 3-29 第二次完成FIB表插入
图表 3-30 第三次完成FIB表插入
图表 3-31 第四次完成FIB表插入
图表 3-32 完成FIB表插入
图表 3-33 对main FIB表插入
图表 3-34 常见路由软件架构
图表 3-35linkwatch_run_queue内部主要逻辑
图表 3-36 NETDEV_CHANGE事件
图表 4-1 IP层数据报文格式
图表 4-2 sys_send函数调用树
图表 4-3 meghdr如何指向用户空间数据
图表 4-4 rt_hash_table和rtable、dst_entry的关系
图表 4-5fib_result、fib_info、fib_nh的关系
图表 4-6 __ip_route_output_key内部逻辑和FIB、路由cache之间的关系
图表 4-7__neigh_lookup_errno内部逻辑图
图表 4-8ip_output函数调用树
图表 4-9 hh_cache的结构关系图
图表 4-10 邻居子系统初次发送过程的序列图
图表 4-11 ARP报文格式
图表 4-12 arp_init函数调用树
图表 4-13neigh_table各成员的关系图
............................................................................................... 88
................................................................................................ 88
......................................................................... 90
................................................................................... 91
................................................................................................................. 93
.......................................................................................................... 95
.................................................................................................... 96
............................................................................................... 98
..................................................................................................... 98
.............................................................................................. 100
............................................................................................... 101
................................................................................ 103
................................................................... 107
.................................................................................. 108
...................................118
.....................................................119
......................................................................119
................................................................................................ 120
................................................................................................. 120
................................................................................................. 121
................................................................................................. 121
............................................................................................................ 122
....................................................................................................... 122
...................................................................................................... 123
............................................................................. 126
............................................................................................. 126
.......................................................................................................... 130
....................................................................................................... 131
..................................................................................... 132
....................................................................... 136
............................................................................... 142
................................. 151
.................................................................................. 152
....................................................................................................... 159
.................................................................................................. 160
........................................................................... 165
................................................................................................................ 166
.................................................................................................... 168
......................................................................................... 170
第 vi 页
Linux2.6 协议栈源代码分析
图表 4-14 arp_send函数调用树
图表 4-15 arp_rcv函数调用树
图表 4-16 ping操作的基本流程
图表 4-17 以太网层数据报文格式
图表 4-18 不同类型的驱动程序造成不同的报文接收方式
图表 4-19 __netif_rx_schedule函数调用树
图表 4-20 net_rx_actiion函数调用树
图表 4-21 报文到达被不同层次协议处理的原理图
图表 4-22 netif_receive_skb函数调用树
图表 4-23ip_route_input函数调用树
图表 4-24 dst_input函数调用树
图表 4-25ICMP数据报文格式
图表 4-26 icmp_rcv处理接收到的消息
图表 4-27 icmp_echo函数调用树
图表 4-28 协议栈的交互——目的地址是本机
图表 4-29 协议栈的交互——目的地址是直连主机
图表 4-30 协议栈的交互——目的地址是远端主机
图表 4-31 ICMP重定向示意图
图表 4-32 ipmp_redirect函数调用树
图表 4-33 sys_rcv函数调用树
图表 4-34 从两个方向来理解报文是如何到达用户层的
图表 5-1UDP数据报文格式
图表 5-2 udp_hash数据结构
图表 5-3 udp_rcv函数调用树
图表 5-4 release函数
图表 5-5 inet_release函数调用树
图表 5-6TCP数据报文格式
图表 5-7 sys_listen函数调用树
图表 5-8 bind和listen都要调用tcp_v4_get_port函数
图表 5-9 tcp_hashinfo中的内部数据结构
图表 5-10 inet_csk_listen_start函数调用树
图表 5-11 sys_accept函数调用树
图表 5-12 sys_connct在不同的协议下的执行路径
图表 5-13ip_local_deliver_finish函数调用tcp的树
图表 5-14tcp_v4_conn_request函数调用树
图表 5-15 3 次握手在内核中的实现序列图
图表 5-16tcp_transmit_skb调用树
图表 5-17 tcp_close函数调用树
图表 5-18 网络负载与吞吐量及响应时间的关系
..................................................................................................... 173
....................................................................................................... 174
.................................................................................................... 180
............................................................................................... 181
...................................................... 184
.................................................................................. 187
............................................................................................ 188
.................................................................. 189
....................................................................................... 190
............................................................................................ 192
.................................................................................................... 197
...................................................................................................... 199
........................................................................................ 200
.................................................................................................. 200
........................................................................... 201
................................................................... 202
................................................................... 204
..................................................................................................... 204
............................................................................................. 205
....................................................................................................... 207
.......................................................... 208
.......................................................................................................... 212
.......................................................................................................... 216
........................................................................................................ 217
...................................................................................................................... 220
.................................................................................................. 220
........................................................................................................... 222
..................................................................................................... 226
................................................................... 227
.................................................................................... 228
.................................................................................. 230
.................................................................................................. 231
..................................................................... 234
...................................................................... 240
.................................................................................. 245
................................................................................ 246
................................................................................................ 247
.................................................................................................... 255
....................................................................... 256
第 vii 页
Linux2.6 协议栈源代码分析
图表 5-19(a) 慢启动和拥塞避免
图表 5-20(b) 快速重传和快速恢复
图表 5-21 TCP Reno的状态机
图表 6-1 典型的软件包实现形式
图表 6-2 core_sys_select函数调用树
图表 7-1 netif_receive_skb调用handle_bridge分支
图表 7-2 VLAN使用场景之一
图表 7-3 VLAN的格式
图表 7-4 vlan_proto_init函数调用树
图表 7-5 sock_ioctl关于VLAN的分支
图表 7-6 VLAN“设备”组织图
图表 7-7 LACP应用场景
图表 7-8 链路聚合场景中对上层协议的影响
图表 7-9 LACP报文格式
图表 7-10 协议原理图
图表 7-11 LACP状态机的运转图
图表 7-12 bonding_init函数调用树
图表 7-13 bond_3ad_lacpdu_recv函数调用树
.................................................................................................. 258
............................................................................................. 258
....................................................................................................... 259
................................................................................................ 262
............................................................................................ 265
...................................................................... 268
...................................................................................................... 270
.................................................................................................................. 270
............................................................................................ 271
.......................................................................................... 271
.................................................................................................. 274
............................................................................................................... 276
............................................................................ 277
............................................................................................................... 278
.................................................................................................................. 279
................................................................................................. 280
............................................................................................... 281
.............................................................................. 283
表目录
21
19
代码段 1-1 hlist_head的定义
6
13
代码段 2-1do_initcalls函数
代码段 2-2init.h
代码段 2-3Linux内核ld scripts
23
代码段 2-4 内核镜像输出init的打印
25
代码段 2-5 2.4 中断定义宏
代码段 2-6init_IRQ函数
26
28
代码段 2-7do_IRQ函数
28
代码段 2-8handle_IRQ_event函数
代码段 2-9 sys_socketcall函数
30
30
代码段 2-10softirq_init函数
31
代码段 2-11open_softirq函数
31
代码段 2-12__do_softirq函数
代码段 2-13request_irq函数
32
37
代码段 2-14 notifier_call_chain函数
40
代码段 2-15 sock_init函数
代码段 2-16 sk_buff_head 结构
41
第 viii 页