1. 网络包接收流程全景图
当一块网卡插入主板PCIe插槽时,它不仅仅是一个硬件设备,而是成为了内核网络子系统的重要组成部分。从硬件中断到用户态socket读取,一个网络包在内核中的旅程要经历多个精心设计的环节。
以最常见的TCP包为例,从网卡到应用程序的完整路径可以划分为六个关键阶段:
- 网卡通过DMA将数据包写入环形缓冲区(Ring Buffer)
- 网卡触发硬件中断通知CPU
- 内核中断处理程序将数据包从Ring Buffer取出
- 数据包进入协议栈处理流程
- 协议栈将处理后的数据放入socket接收缓冲区
- 用户进程通过系统调用读取数据
这个过程中最精妙的设计在于:内核如何平衡中断处理开销与吞吐量?当网络流量较小时,每个包都触发中断是合理的;但当流量达到10Gbps甚至更高时,这种模式会导致CPU被中断淹没。这就是NAPI(New API)机制要解决的核心问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 硬件层面的数据接收
2.1 网卡DMA工作机制
现代网卡都具备DMA引擎,这是高效数据传输的基础。当网卡接收到一个完整的以太网帧后:
- 检查帧校验序列(FCS),确认数据完整性
- 如果启用了校验和卸载(Checksum Offload),会计算L4层的校验和
- 根据当前DMA环形缓冲区的写指针位置,将数据包写入内存
- 更新写指针,为下一个数据包做好准备
DMA区域通常被划分为多个描述符(Descriptor),每个描述符包含:
- 数据缓冲区物理地址
- 数据包长度
- 状态标志位(如是否包含EOP-End of Packet)
关键细节:DMA缓冲区通常按2的幂次方大小分配(如256、512描述符),这样可以通过位运算快速计算环形缓冲区索引,避免昂贵的取模运算。
2.2 中断触发机制
网卡触发中断的条件可通过驱动参数灵活配置,常见模式包括:
- 每个数据包触发中断(低延迟模式)
- 积累一定数量数据包后触发中断(吞吐量模式)
- 定时器中断(混合模式)
在/proc/interrupts中可以看到网卡中断的统计信息:
bash复制$ cat /proc/interrupts | grep eth0
66: 12345678 IR-PCI-MSI-edge eth0-TxRx-0
67
