在Linux系统中,网络包的发送和接收流程涉及内核协议栈、网络设备驱动及硬件协作。以下是详细流程分析:
硬件接收(NIC)
rx_ring
)中断处理(驱动层)
NAPI
(New API)混合中断和轮询机制:
NET_RX_SOFTIRQ
)rx_ring
批量处理数据包协议栈处理(内核层)
netfilter/iptables
,否则上传传输层sk_buff
)用户态交付
recv()
)从Socket缓冲区拷贝数据到用户空间epoll
等异步机制,由内核通知应用就绪事件用户态发起
send()
等API,数据通过系统调用进入内核协议栈封装(内核层)
队列管理与驱动处理
pfifo_fast
)队列tx_ring
获取数据包,触发DMA传输到网卡硬件发送(NIC)
接收方向优化
发送方向优化
零拷贝技术
sendfile()
/splice()
减少用户态与内核态拷贝场景 | 工具/命令 |
---|---|
接收丢包 | ethtool -S eth0 (查看rx_missed_errors ) |
发送队列积压 | ip -s link show eth0 (TX dropped计数) |
协议栈统计 | netstat -s 或 nstat -az |
数据包追踪 | tcpdump 、bpftrace |
中断均衡 | cat /proc/interrupts |
调整缓冲区大小:
# 接收缓冲区
sysctl -w net.core.rmem_max=16777216
# 发送缓冲区
sysctl -w net.core.wmem_max=16777216
启用多队列:
ethtool -L eth0 combined 8
关闭反向路径过滤(如需高性能):
sysctl -w net.ipv4.conf.all.rp_filter=0
理解此流程可帮助诊断网络延迟、丢包等问题,并根据场景选择优化策略(如低延迟场景关闭NAPI,高吞吐启用TSO)。