目录
网络收包总结
在开始收包前
- 创建ksoftirqd线程,用来处理软中断;
- 协议栈注册,如ip,udp,tcp;
- 网卡驱动初始化,将DMA准备好,把NAPI的poll函数地址告诉内核;
- 启动网卡,分配RX,TX队列,注册中断对应的函数。
在数据到后
- 网卡将数据帧通过DMA搬运到内存的RingBuffer中,然后向CPU发出软中断;
- CPU响应中断请求,调用网卡启动时注册的中断处理函数;
- 中断函数记录中断数等,基本没有做什么,发起软中断;
- 内核线程ksoftirqd线程发现有软中断来,先关闭硬中断;
- ksoftirqd线程开始调用驱动的poll函数收包;
- poll函数将收到的包送到协议栈的ipc_rcv函数;
- 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);

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

被折叠的 条评论
为什么被折叠?



