第10周:网络数据包旅程——从网卡到 socket
目标:理解一个网络数据包从网卡硬件到用户态 socket 的完整路径,掌握 sk_buff 结构体和中断/软中断机制。
1. 数据包接收路径全貌
1 | 硬件层面: |
2. 中断处理与 NAPI
2.1 硬中断(Top Half)
1 | 收到数据包 → 网卡 DMA 到内存 → 触发中断 → CPU 暂停当前任务 → 执行 IRQ handler |
2.2 NAPI(New API)机制
1 | 问题:高流量时,每个包都触发硬中断 → 中断风暴 → CPU 卡在中断处理 |
2.3 软中断与 ksoftirqd
1 | 软中断优先级(高→低): |
1 | # 查看 NAPI 统计 |
3. sk_buff 结构体(核心中的核心)
3.1 结构体图示
1 | struct sk_buff { |
1 | 数据指针关系: |
3.2 sk_buff 操作函数
1 |
|
3.3 sk_buff 变体
1 | // struct sk_buff — 完整版(大对象,用在关键路径) |
4. 发送路径详解
1 | 用户态:write(buf, len) |
4.1 关键数据结构
1 | // tcp_sock — TCP socket 专用结构 |
5. 接收路径详解
1 | 网卡 DMA → 内存 |
6. 实践:ftrace 跟踪数据包路径
6.1 ftrace 基础
1 | # 挂载 tracefs |
6.2 跟踪 netif_receive_skb
1 | cd /sys/kernel/tracing |
6.3 跟踪网络完整路径
1 | cd /sys/kernel/tracing |
6.4 kprobe 动态跟踪
1 | # kprobe 可以在运行时跟踪任意函数,无需重新编译内核 |
7. perf 分析网络栈
1 | # === CPU 性能分析 === |
8. 跟踪工具总结
| 工具 | 用途 | 层次 |
|---|---|---|
tcpdump |
抓包分析 | 数据平面(包内容) |
ftrace |
内核函数跟踪 | 内核函数调用 |
perf |
性能分析 | CPU 指令级 |
bpftrace |
动态 eBPF 跟踪 | 内核/用户态事件 |
systemtap |
深度内核跟踪 | 内核任意位置 |
etrace |
网络栈跟踪 | 特定于网络 |
8.1 bpftrace 跟踪示例
1 | # 跟踪 skb 分配 |
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/07/18/第10周:网络数据包旅程——从网卡到 socket/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!