欢迎访问 内存溢出 —— 独立后端与系统工程技术博客

专注于分布式系统、Linux内核、数据库存储与后端工程实践

深入理解 Linux 内核网络栈:从网卡驱动到 Socket 缓冲区

发表于:|最后更新:|分类:Linux与网络|阅读:5203 次

Linux 网络协议栈的处理流程始于硬件中断。当物理网卡接收到以太网帧时,通过 DMA 将数据直接写入预分配的环形接收缓冲区(Ring Buffer),并触发硬件中断(Hard IRQ)。现代内核普遍采用 NAPI(New API)机制,在中断处理程序中关闭硬件中断并调度软中断(SoftIRQ NET_RX_SOFTIRQ),通过轮询模式批量处理数据包,避免高频中断引发的活锁(Interrupt Livelock)。

软中断调用驱动程序的 napi->poll 方法,将环形缓冲区中的描述符解包为 sk_buff 结构体,随后通过 netif_receive_skb 进入协议栈核心分发逻辑。如果是 IPv4 数据报,调用链依次经过 ip_rcv、Netfilter PREROUTING 钩子、路由决策查找(FIB)、LOCAL_IN 钩子,最终由传输层协议控制块(如 tcp_v4_rcv)完成校验与状态机流转。

传输层通过四元组查表确定关联的 struct sock,随后将负载数据挂载至套接字的接收队列(Receive Queue)。若应用层进程阻塞在 read/epoll_wait 系统调用上,内核将唤醒该等待队列中的任务,并通过 copy_to_user 完成内核空间到用户态内存的数据拷贝。在高吞吐场景下,合理调整 tcp_rmem 与 netdev_max_backlog 是避免丢包的关键调优手段。