Linux 网络协议栈模块

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工具

这个协议栈是一个高度模块化的设计,各层之间通过标准接口交互,便于扩展和维护。