linux内核网络收包过程—UDP协议处理

本文详细介绍了网络数据包从到达网卡到被应用层接收的完整流程,包括创建ksoftirqd线程、协议栈注册、网卡驱动初始化、中断处理、UDP协议解析以及recvfrom系统调用的步骤。着重阐述了如何通过中断、软中断及内核线程协同工作,将数据包传递给正确的UDP socket,并在找不到对应socket时发送ICMP目标不可达消息。此外,还探讨了数据接收与等待的机制。

目录

网络收包总结

在开始收包前

在数据到后

UDP协议处理

重要结构体关系图

recvfrom系统调用流程

数据接收与等待


网络收包总结

在开始收包前

  1. 创建ksoftirqd线程,用来处理软中断;
  2. 协议栈注册,如ip,udp,tcp;
  3. 网卡驱动初始化,将DMA准备好,把NAPI的poll函数地址告诉内核;
  4. 启动网卡,分配RX,TX队列,注册中断对应的函数。

在数据到后

  1. 网卡将数据帧通过DMA搬运到内存的RingBuffer中,然后向CPU发出软中断;
  2. CPU响应中断请求,调用网卡启动时注册的中断处理函数;
  3. 中断函数记录中断数等,基本没有做什么,发起软中断;
  4. 内核线程ksoftirqd线程发现有软中断来,先关闭硬中断;
  5. ksoftirqd线程开始调用驱动的poll函数收包;
  6. poll函数将收到的包送到协议栈的ipc_rcv函数;
  7. ip_rcv函数将数据送到udp包送到udp_rcv,tcp包送到tcp_rcv。

UDP协议处理

udp接数据调用关系如下

int udp_rcv(struct sk_buff *skb)
{
	return __udp4_lib_rcv(skb, &udp_table, IPPROTO_UDP);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

为了维护世界和平_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值