logo资料库

Linux2.6协议栈源代码解析(解密版).pdf

第1页 / 共299页
第2页 / 共299页
第3页 / 共299页
第4页 / 共299页
第5页 / 共299页
第6页 / 共299页
第7页 / 共299页
第8页 / 共299页
资料共299页,剩余部分请下载后查看
目 录
图目录
表目录
前 言
感 谢
协议栈概述
操作系统及网络协议介绍
Linux操作系统架构简介
网络协议发展介绍
本书的组织和安排
基本的数据结构和计算机术语
图片风格演示
本书的组织
系统初始化
系统初始化流程简介
内核文件解读
ELF文件格式
Link Scripts知识
Linux内核镜像研究
中断及任务调度管理
中断及软中断模型
中断系统和软中断
设备驱动挂接ISR
各种语境下的切换
内核下的同步与互斥
中断相关的锁
spin_lock/spin_inlock
down/up信号
RCU读写锁
各种异步手段
Timer(定时器函数)
work queue(工作队列)
通知链
虚拟文件系统
网络协议栈各部分初始化
网络基础系统初始化
网络内存管理
sk_buff结构
内存管理函数
网络文件系统初始化
网络协议初始化
初步了解路由系统
Linux设备管理
底层PCI模块的初始化
网络设备接口初始化例程
配置系统
配置过程分析
配置是如何下达到内核的?
socket系统调用
ioctl代码的实现
配置设备IP地址的内核处理过程
netlink和rtnetlink接口
Loopback接口的配置过程
IP别名的实现
回顾FIB系统初始化
深入FIB系统
FIB系统发生了什么样的变化
直接访问路由表
接口状态变化的处理过程
网络层实现的初步研究
从Ping 127.0.0.1开始旅程
再次相遇Socket系统调用
IP数据报文格式
send系统调用
在路由系统中游历
查找出口
当目的地址是远端主机时
创建对应路由cache表项
创建对应邻居表项
回到发送的路径
IP层发送过程
揭密hh_cache
ARP的作用
ARP的机制
ARP报文格式
Linux ARP协议的实现
协议初始化
开始ARP状态机
到达设备驱动层
数据链路层帧格式
Loopback设备的发送过程
从中断到路由系统
ICMP
ICMP报文格式
ping本机地址及回环地址
ping外部地址
从内核到用户
传输层实现的研究
进一步到UDP
UDP用户代码
UDP数据报文格式
服务器端bind的实现
接收代码
释放UDP的socket
更高阶的TCP
TCP用户代码
TCP数据报文格式
TCP栈及socket的初始化
服务器端bind和listen的实现
服务器端accept的实现
客户端connect的实现——发起三次握手
TCP报文的接收
3次握手的实现
内核收到报文转到用户态
释放TCP的socket
TCP拥塞控制
TCP拥塞控制机制介绍
Linux内核拥塞控制功能的实现
Select的实现机制
用户如何使用select?
Select的内核实现
2层功能
基本的2层知识
Linux桥实现的基本框架
VLAN
VLAN概念
Linux下VLAN——存在巨大的缺陷
LACP协议
LACP简介
LACP在Linux中的实现
后 记
参考文献
W.Richard Stevens,UNIX网络编程 卷1 连网的API:套接字与XTI,清华大学出版社,1998.7.
Christian Benvenuti,Understanding Linux Network Internals,2006.5
Gray R.Wright和W.Richard Stevens TCP/IP Illustrated Volume2: The Implementation
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 drvprobe实现的基本功能 图表 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 页
分享到:
收藏