引言
Linux 内核网络栈是操作系统中最复杂、最精妙的子系统之一。一个简单的 send() 调用背后,涉及 socket 层、协议栈(TCP/IP)、网络设备层、驱动层等多个层次的协同工作。本文将深入剖析数据包从用户空间到网卡硬件的完整路径,揭示内核网络子系统的核心机制与性能优化策略。
一、网络栈整体架构概览
Linux 网络栈大致分为三层:
- Socket 层:用户空间与内核的接口,提供 BSD Socket API
- 协议层:TCP/UDP/ICMP 等传输层协议,IP 网络层,以及邻居子系统(ARP)
- 设备层:网络设备抽象层(net_device)与具体网卡驱动
数据流向分为两条路径:发送路径(用户 → 网卡)和 接收路径(网卡 → 用户)。两条路径在内核中的处理方式截然不同,发送路径相对直接,而接收路径涉及 NAPI、软中断等复杂机制。
二、发送路径:从 send() 到线缆
2.1 Socket 层入口
用户调用 send() 或 write() 后,系统调用进入内核的 sys_sendto(),再通过 socket 文件描述符找到对应的 struct socket,调用其 ops-

发表评论 取消回复