linux内核:笔记3-网络数据包收发流程

1.网络分层中,内核协议栈负责实现网络层和传输层

2.内核对用户进程提供socket接口用以调用

3.Linux内核包含链路层驱动用来驱动网络设备

4.内核网络层用来实现IP、ICMP以及IGMP

5.内核层传输层用来实现TCP和udp协议

6.内核源码中网络设备驱动对应的代码位于driver/net/ethernet目录下;

不同厂商的网卡驱动分配在不同的目录下:

7.内核和网络设备驱动是通过中断的方式处理的

8.网卡驱动硬中断:对cpu的相关引脚上触发一个电压变化,以通知CPU处理数据

9.中断处理下半部分的软中断:是通过给内存中的一个变量的二进制值通知软中断处理程序

ksoftirqd

10.内核网卡收包环节:

参考:

10.1 数据网线到达服务器网卡

10.2 网卡将数据帧DMA(Direct Memory Access)到内存

DMA:

10.3 硬中断通知cpu

10.4 cpu响应硬中断简单处理后发出软中断

10.5 ksoftirqd进程处理软中断调用网卡驱动注册的poll函数开始收包

10.6 帧从ring buffer上摘下来保存为一个skb

skb :

10.7 协议层 开始处理网络帧,处理完后的data被放到socket队列

10.8 内核唤醒用户进程

-----------------------------------

11.ksoftirqd:内核软中断线程,不停的判断有没有软中断需要被处理

12.subsys_initcall 来初始化各个子系统,其中执行net_dev_init函数进行网络子系统的初始化

13.协议栈注册:内核时通过注册的方式实现

14.网卡驱动初始化:

内核:调用网卡驱动probe->网卡驱动获取mac地址

网卡驱动:DMA初始化,注册ethtool是实现函数,注册net_device_ops,netdev等变量

napi初始化,注册poll函数

15.启动网卡:内核调用net_device_ops中注册的open函数如igb_open->网卡驱动

分配RX,TX队列内存,注册新中断处理函数,打开硬中断,等待包进来

16.硬中断处理:网卡把帧DMA到内存的ringbuffer,并向cpu发出IRQ 中断,cpu调用驱动注册的硬中断处理函数,启动NAPI,发出软中断

当ringbuffer 满的时候,可以通过ethtool命令来加大环形队列的长度

经验分享 程序员 微信小程序 职场和发展