一文带你掌握Linux内核协议栈架构(超详细)
一、Linux内核代码目录分布

documentation:拥有一套有用内核技术文档。
arch:此目录的所有子目录的文档数据都是体系结构特有的代码。有3个子目录:Kernel不同体系结构内核我有的实现方式,比如计时器、SMP、信号量等等;lib不同体系结构下的高性能通用代码实现,比如memcpy等等;mm不同体系结构特有的内存管理 程序的实现。
drivers:内核的驱动程序代码。包括显卡、网卡、PCI等外围设备驱动代码。
fs:文件系统代码。Ext2 Ext3 Ext4等本地文件系统。
include:包含Linux内核大部分的头文件(.h)。
init:内核初始化过程中的代码。
ipc:进程间通信代码 kernel:Linux内部最重要的目录。主要包含进程创建、销毁和调度等代码。
net:Linux内核网络协议栈的代码。在此目录下有netfilter的实现代码,建构一个netfilter框架,内核防火墙框架,灵活、可实现安全策略,如数据包过滤、数据包处理、透明代理、动态网络地址转换、数据包处理等。抽象及通用化框架,作为中间件,为每种网络协议(IPv4/IPv6等)定义整套钩子函数。
Linux内核--映射到Linux代码3个内核层源码代码组织,具体如下:

具备开发经验至少我们对TCP网络编程流程(socket()/bind()/listen()/accept()/send()/recv()/关闭socket()顺序)。网络数据在内核中处理过程主要是在网卡和协议栈之间进行:交给协议栈处理;协议栈将需要发送的数据通过网络发送出去。

Linux内核的网络协议栈架构视图如下:

【文章福利】小编推荐自己的Linux内核技术交流群:【891587639】整理了一些个人觉得比较好的学习书籍、视频资料共享在群文件里面,有需要的可以自行添加哦!!!前100名进群领取,额外赠送一份价值699的内核资料包(含视频教程、电子书、实战项目及代码)

二、SK_BUFF内部原理及协议栈
内核层和用户层在网络方面差别是比较大,在内核的网络层中sk_buff结构占有重要地位。sk_buff数据结构在内核源码组织结构如下:
网络报文存储空间是在应用层发送网络数据或者网络设备收到网络数据时动态分配的,分配成功之后,将接收或者发送的网络数据填充到这个存储空间中。
三、网络协议inet_protosw结构分析
网络协议族TCP/UDP等,inet_init()函数进程初始化,使用proto_register()函数来注册每个内嵌协议。

sk_buff的数据结构视图如下:


四、软中断CPU报文队列及处理
我们在Linux内核中是采用软中断方式实现,软中断机制的实现原理如下:

软中断机制构成核心成员包括:中断状态、软中断向量表及软中断守护内核线程。
软中断状态:即是否有触发的软中断未处理;
软中断向量表:包含两个成员变量,一个是处理此软中断的回调函数,另一个是处理时所需的参数。
软中断守护内核线程:内核创建一个内核线程ksoftirq来轮询软中断状态,调用软中断向量表中的软中断回调函数处理中断。
假设:当一个软中断事件发生之后,调用raise_softirq()设置中断标记位,触发中断事务。然后会检测软中断状态寄存器的状态,如果ksoftirq通过查询发现某一个软中断事件发生之后,通过软中断向量表调用软中断服务程序action。
常用软中断函数:
open_softirq()函数:它注册一个软中断,将软中断的服务程序注册到系统的软中断向量表;
raise_softirq()函数:设置软中断状态映射表,触发软中断事务响应。
软中断整个处理架构分为:上半部和下半部。
网络收到处理软中断的实现机制:考虑优先级,分别占用向量表的2号和3号软中断来分别处理接收和发送。网络协议栈的软中断机制实现原理如下:

