Linux网络包接收(RX)路径与时间戳 (自下而上)

用户空间
内核空间
硬件
用户空间

11. 应用处理

应用程序从recvmsg()返回,获得数据包内容和精确的接收时间戳,可以进行后续的业务逻辑处理。

10. 数据与时间戳拷贝

内核响应系统调用,将Socket接收缓冲区中的数据拷贝到用户提供的buffer中,并将存储的硬件/软件时间戳通过控制消息(cmsg)拷贝给应用程序。

9. 应用发起系统调用

应用程序调用recvmsg()系统调用来读取数据。使用recvmsg()是因为它能同时接收数据和“控制消息”(ancillary data)。

内核空间

8. 放入Socket接收队列

根据IP和端口号,内核找到匹配的Socket,并将数据包放入该Socket的接收缓冲区(sk_receive_queue)。时间戳作为元数据与数据包一同存储。

7. 协议栈处理

包含时间戳的sk_buff被传递给netif_receive_skb()gro_receive(),进入通用网络协议栈。它会依次经过L2(链路层), L3(IP层), L4(TCP/UDP层)的处理。

6. NAPI Poll & sk_buff创建

在软中断上下文(NET_RX_SOFTIRQ)中,驱动的poll函数被调用。它从Ring Buffer中取出数据包,为其创建一个核心数据结构sk_buff

捕获点: 软件时间戳

SOF_TIMESTAMPING_RX_SOFTWARE

内核调用ktime_get_real()获取系统时钟,记录下软件层面的接收时间。此时包已完全进入内核掌控。

5. 中断处理 & NAPI调度

CPU响应中断,执行简短的驱动中断处理程序。它会禁用中断并调度NAPI(软中断),将耗时的工作延迟处理。

硬件 (NIC)

4. 发送中断 (IRQ)

数据写入完成后,NIC向CPU发起一个硬件中断,通知有新数据到达。

3. DMA传输

NIC通过DMA引擎将数据包内容和附带的硬件时间戳写入内核预先分配的内存区域(Ring Buffer)。

2. 帧解析与时间戳

NIC的PHY/MAC层解析信号,识别出以太网帧的边界 (如SFD: Start Frame Delimiter)。

捕获点: 硬件时间戳

SOF_TIMESTAMPING_RX_HARDWARE

NIC内部时钟在识别到帧的特定点时,记录下当前时间。这是**最精确**的时间戳。

1. 物理信号接收

网卡从物理介质(如网线、光纤)接收到电信号或光信号。

时间戳捕获点深度解析

SOF_TIMESTAMPING_RX_HARDWARE

SOF_TIMESTAMPING_RX_SOFTWARE