linux 网络包接收过程

网络分层模型和对应实现

TCP/IP 网络分层模型

物理层、链路层、网络层、传输层、应用层

物理层对应网卡网线

应用层对应常见的Nginx,HTTP、FTP等等各种应用

linux 实现链路层、网络层和传输层

链路层协议靠网卡驱动实现,内核协议栈实现网络层和传输层

内核对更上层的应用曾提供socket接口供用户进程访问

硬中断和软中断

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

当设备有数据到达,会给CPU对应引脚上触发一个电压变化,通知CPU处理数据,这就是硬中断

对网络模块来说,处理流程较复杂以及耗时,如果在中断函数中处理所有事情,会过度占据CPU,导致CPU无法响应其他设备,例如键鼠

因此linux 中断处理函数分为上下两个部分,上半部分只进行最简单的部分,快速处理然后释放CPU,接着CPU就可以允许其他中断进来

剩下的绝大部分工作可以在下半部分进行,从容处理

2.4以后的内核版本下半部分的实现方式是软中断,由ksoftirqd 内核线程全权处理,通过给内存的一个变量的二进制值来通知软中断处理程序,这就是软中断

内核收包路径

  1. 数据帧从外部网络到达网卡
  2. 网卡把桢DMA到内存
  3. 硬中断通知CPU
  4. CPU响应硬中断,简单处理后发出软中断
  5. ksoftirqd 进程处理软中断,调用网卡驱动注册的poll函数开始收包
  6. 帧被从Ring buffer 上摘下来保存为一个skb
  7. 协议层开始处理网络帧,处理完后的数据data被放到socket的接收队列中

当网卡收到数据后,linux第一个工作模块是网络驱动,网络驱动会以DMA的方式把网卡上收到的帧写到内存里,再向CPU发起一个中断,通知CPU有数据到达

当CPU收到中断请求后,会调用网络驱动注册的中断处理函数,网卡的终端处理函数并不会做过多工作,发起软中断请求,释放CPU

ksoftirqd 检测到软中断请求到达,调用poll开始轮询收包,收到后交由各级协议栈处理,放入到socket 的接收队列中

硬中断在哪个CPU上被响应,那么软中断也是在这个CPU上处理的,所以说,如果你发现你的linux软中断CPU消耗都集中在一个核上的话,做法就是调整硬中断的CPU亲和性,将硬中断打散到不同CPU核上去

总结

开始收包前,linux做了很多准备工作

  1. 创建ksoftirqd 线程,设置好它自己的线程函数,用来处理后续的软中断
  2. 协议栈注册,linux要实现很多协议,例如:ip\udp\tcp 每一个协议会将自己的处理函数注册一些,方便包来了迅速找到对应的处理函数
  3. 网卡驱动初始化,每个驱动都有一个初始化函数,内核会让驱动也初始化一下,准备好DMA,把NAPI的poll函数地址告诉内核
  4. 启动网卡,分配RX,TX队列,注册中断对应的处理函数

上述准备好后,打开硬中断,等待数据包到来

数据到了以后,第一个迎接它的是网卡

  1. 网卡将数据帧DMA到内存的RingBuffer中,然后向CPU发起终端通知

  2. CPU响应中断请求,调用网卡启动时注册的终端处理函数

  3. 中断处理函数几乎没干啥,就发起了软中断请求

  4. 内核线程ksoftirqb 线程发现有软中断请i去到来,先关闭硬中断

  5. ksoftirqd 线程开始调用驱动的poll函数收包

  6. poll函数将收到的包送到协议栈注册的ip_rev函数中

  7. ip_rev函数再将包送到udp_rcv 函数中(对于tcp包就送到tcp_rcv)

相关推荐
顾喵1 分钟前
PetaLinux 2017.4 实操指南:PREEMPT_RT实时补丁移植+Zynq PL中断UIO用户态配置(超完整避坑版)
linux
小樱花的樱花15 分钟前
Linux 线程的创建
linux·c语言·开发语言
云飞云共享云桌面24 分钟前
单机建模卡顿运维繁琐!中小型机械制造厂云飞云 3D 云桌面落地
运维·服务器·网络·3d·自动化·电脑·负载均衡
mounter62540 分钟前
BPF 的进化史:从网络过滤器到 AI 时代的 Linux 核心引擎
linux·网络·人工智能·ebpf·linux kernel·kernel
CryptoPP1 小时前
BSE股票K线数据接入实战:从接口调用到前端图表展示
大数据·前端·网络·人工智能·websocket·网络协议
液态不合群2 小时前
卡死在生产流程?AI破解制造业数字化落地顽疾
网络·人工智能·低代码·重构
技术不好的崎鸣同学2 小时前
Windows 命令提示符(CMD)恶意脚本分析篇
网络·windows·安全·系统安全
m0_715674432 小时前
2026年医疗行业数据库风险监测产品综合能力排名分析
网络·数据库
代码AC不AC3 小时前
【Linux】线程池
linux·线程池
阿米亚波4 小时前
【EVE-NG 实战】防火墙基础(VLAN · VRRP · NAT · ACL · 静态路由)
运维·网络·笔记·网络协议·计算机网络·网络安全·运维开发