Linux网络协议栈整体架构
1. 核心分层结构
bash
应用程序层 (User Space)
↓
系统调用接口 (Socket Layer)
↓
协议无关层 (Protocol Agnostic Layer)
↓
具体协议层 (TCP/UDP/IP)
↓
网络设备层 (Network Device Layer)
↓
设备驱动层 (Device Drivers)
↓
物理硬件
2. 主要模块详解
Socket层
bash
// net/socket.c
- sys_socket() // 创建socket
- sys_bind() // 绑定地址
- sys_listen() // 监听连接
- sys_accept() // 接受连接
- sys_connect() // 发起连接
协议族模块
-
AF_INET (IPv4协议族)
-
AF_INET6 (IPv6协议族)
-
AF_UNIX (Unix域套接字)
-
AF_PACKET (包套接字)
3. 关键协议实现
TCP模块 (net/ipv4/tcp_*.c)
bash
// TCP状态机
- TCP_ESTABLISHED // 连接已建立
- TCP_LISTEN // 监听状态
- TCP_SYN_SENT // 主动打开
- TCP_SYN_RECV // 收到SYN
- TCP_FIN_WAIT1 // 主动关闭
- TCP_TIME_WAIT // 等待状态
// 核心功能
- tcp_v4_do_rcv() // TCP接收处理
- tcp_sendmsg() // TCP数据发送
- tcp_rcv_established() // 已连接状态处理
UDP模块 (net/ipv4/udp.c)
bash
- udp_sendmsg() // UDP数据发送
- udp_rcv() // UDP接收处理
- udp_queue_rcv_skb() // 放入接收队列
IP层 (net/ipv4/ip_*.c)
bash
// 主要函数
- ip_rcv() // IP包接收
- ip_forward() // IP转发
- ip_output() // IP输出
- ip_fragment() // IP分片
// 路由查找
- ip_route_input() // 输入路由查找
- ip_route_output() // 输出路由查找
4. Netfilter框架
bash
// 钩子点位置
enum nf_inet_hooks {
NF_INET_PRE_ROUTING, // 路由前
NF_INET_LOCAL_IN, // 本地输入
NF_INET_FORWARD, // 转发
NF_INET_LOCAL_OUT, // 本地输出
NF_INET_POST_ROUTING // 路由后
};
// 注册钩子函数
nf_register_hook()
nf_register_net_hook()
5. 数据包处理流程
接收路径
bash
1. 网卡驱动接收数据包
2. 触发中断处理
3. netif_receive_skb() - 协议栈入口
4. ip_rcv() - IP层处理
5. {tcp/udp}_rcv() - 传输层处理
6. socket队列
7. 用户空间读取
发送路径
bash
1. socket系统调用
2. {tcp/udp}_sendmsg() - 传输层封装
3. ip_output() - IP层封装
4. dev_queue_xmit() - 设备队列
5. 驱动发送
6. 关键数据结构
socket结构
bash
struct socket {
socket_state state; // 套接字状态
short type; // 套接字类型
unsigned long flags;
struct file *file; // 关联的文件
struct sock *sk; // 底层协议控制块
const struct proto_ops *ops; // 协议操作函数集
};
sock结构
bash
struct sock {
struct sk_buff_head sk_receive_queue; // 接收队列
struct sk_buff_head sk_write_queue; // 发送队列
int sk_rcvbuf; // 接收缓冲区大小
int sk_sndbuf; // 发送缓冲区大小
struct proto *sk_prot; // 协议操作
struct socket *sk_socket; // 上层socket
};
sk_buff结构
bash
struct sk_buff {
struct sk_buff *next; // 链表指针
struct sk_buff *prev;
struct sock *sk; // 所属socket
unsigned int len; // 数据长度
unsigned int data_len; // 数据长度
unsigned int truesize; // 总内存大小
unsigned char *head, *data, *tail, *end; // 指针
struct net_device *dev; // 网络设备
};
7. 性能优化模块
RPS/RFS (Receive Packet Steering/Flow Steering)
- 多队列负载均衡
- CPU亲和性设置
- 流局部性优化
BUSY POLL
- 减少中断开销
- 低延迟应用优化
GRO/GSO (Generic Receive/Segmentation Offload)
- 批量处理小包
- 减少协议栈处理次数
8. 调试和监控
bash
// /proc文件系统
/proc/net/tcp // TCP连接信息
/proc/net/udp // UDP连接信息
/proc/net/sockstat // socket统计
// 内核参数
/proc/sys/net/ipv4/tcp_rmem // TCP接收缓冲区
/proc/sys/net/ipv4/tcp_wmem // TCP发送缓冲区
/proc/sys/net/core/rmem_max // 最大接收缓冲区
9. 常见问题排查
-
丢包排查: netstat -s, /proc/net/snmp
-
延迟分析: tcpdump, perf工具
-
缓冲区溢出: 调整socket缓冲区大小
-
连接跟踪: conntrack工具
这个协议栈是一个高度模块化的设计,各层之间通过标准接口交互,便于扩展和维护。