RK3588 kernel-6.1 net 网络架构与协议栈分析

RK3588 kernel-6.1 net 网络架构与协议栈分析

1. 分析范围

本文基于:

  • rk3588/kernel-6.1/net

目标:

  • 梳理 net 子系统总体分层架构
  • 解释 Linux 网络协议栈主数据路径(收包、发包、转发)
  • 给出 TCP/UDP 在 IPv4 栈中的关键调用链
  • 说明 Netfilter、路由子系统在主路径中的切入点

2. net 目录的总体分层

net/Makefile 可见网络栈是模块化分层组织:

  1. 套接字与核心层
    • socket.ccore/
    • 提供 socket 系统调用入口、sk_buff 收发调度、NAPI/软中断处理。
  2. 协议层
    • ipv4/ipv6/tcp/udp 等协议实现
    • 负责 L3/L4 协议处理、连接管理、分片重组、拥塞控制等。
  3. 策略与过滤层
    • netfilter/xfrm/
    • 提供防火墙/NAT/连接跟踪/IPsec 等路径钩子和策略。
  4. 链路与扩展层
    • packet/bridge/8021q/wireless/
    • 覆盖二层、虚拟网络、隧道、交换与无线子系统。

可概括为:socket API -> L4/L3 协议栈 -> netdevice 数据平面 -> 驱动硬件


3. 用户态到内核网络入口(net/socket.c

socket() 系统调用会进入:

  • SYSCALL_DEFINE3(socket) -> __sys_socket() -> sock_create()
  • sock_create() 最终调用 __sock_create()

__sock_create() 的关键动作:

  1. 根据 family/type/protocol 选择协议族(如 PF_INET
  2. 通过 net_families[family] 找到 net_proto_family
  3. 调用该 family 的 create()(IPv4 对应 inet_create()

因此 socket 层只是统一门面,真正协议实例化由各协议族完成。


4. IPv4 协议族装配(net/ipv4/af_inet.c

af_inet.c 中定义了 IPv4 的协议族与协议分发表:

  • inet_family_ops.create = inet_create
  • inetsw_array[] 注册 SOCK_STREAM/SOCK_DGRAM 等与 tcp_prot/udp_prot 的映射
  • inet_add_protocol()tcp_v4_rcvudp_rcv 挂到 IPv4 协议号分发表

inet_init() 初始化时会完成:

  1. proto_register(&tcp_prot) / proto_register(&udp_prot)
  2. sock_register(&inet_family_ops)
  3. 协议处理函数与传输协议绑定

这一步决定了“协议号 -> 处理函数”的分发关系。


5. 收包主路径(RX Path)

5.1 从驱动到协议栈

驱动/NAPI 把 skb 上送后,核心路径进入 net/core/dev.c

  • netif_receive_skb() -> netif_receive_skb_internal() -> __netif_receive_skb()
  • 核心分发逻辑在 __netif_receive_skb_core()

这里会做:

  • L2 类型分发(packet_type)
  • tc/ingress 等处理
  • ETH_P_IP 包送入 IPv4 入口(ip_rcv

5.2 IPv4 接收处理

net/ipv4/ip_input.c 中:

  • ip_rcv()NF_INET_PRE_ROUTING 钩子后进入 ip_rcv_finish
  • ip_rcv_finish_core() 做路由查找(ip_route_input_noref)、选项处理、early demux

然后按路由类型分流:

  1. 目的本机:ip_local_deliver()
  2. 需要转发:ip_forward()

ip_local_deliver() 会先处理分片重组(ip_defrag),再经 NF_INET_LOCAL_IN,最后进入 ip_local_deliver_finish(),按协议号分发到 tcp_v4_rcv/udp_rcv 等。


6. 发包主路径(TX Path)

6.1 L4 到 IPv4 输出

TCP 发送常见路径:

  • tcp_sendmsg() -> ip_queue_xmit() -> __ip_queue_xmit()

UDP 发送常见路径:

  • udp_sendmsg() -> 路由选择(ip_route_output_flow)-> ip_local_out()

6.2 IPv4 输出与 Netfilter

net/ipv4/ip_output.c 中:

  • ip_local_out() / __ip_local_out() 在发送前构建 IP 头与校验
  • 通过 NF_INET_LOCAL_OUT 钩子
  • ip_output() / ip_finish_output() 经过 NF_INET_POST_ROUTING
  • 最终下沉到邻居子系统与设备发送队列

6.3 进入设备发送队列

net/core/dev.c

  • __dev_queue_xmit() 选择 tx queue/qdisc
  • 调用 qdisc enqueue 或 dev_hard_start_xmit() 进入网卡驱动

这就是从协议栈到 NIC 的统一发送出口。


7. 转发路径(Forwarding)

ip_forward()net/ipv4/ip_forward.c)是三层转发核心:

  1. TTL 检查与递减
  2. MTU/分片约束检查
  3. 路由与策略校验
  4. 通过 NF_INET_FORWARD 钩子
  5. ip_forward_finish() -> dst_output() 发出

因此路由器模式下,转发路径与本机收发路径共享大量基础设施,但在 FORWARD 钩子上分叉。


8. 路由子系统在协议栈中的位置

IPv4 路由核心在 net/ipv4/route.c,关键接口:

  • 入方向:ip_route_input_noref()
  • 出方向:ip_route_output_flow() / ip_route_output_key()
  • FIB 查找:fib_lookup()

路由查找结果(dst/rtable)决定了:

  • 包是本地交付、转发还是丢弃
  • 发包下一跳和输出设备
  • 后续 Netfilter 与邻居子系统行为

9. TCP/UDP 协议栈关键路径

9.1 TCP

  • 收包:tcp_v4_rcv() -> tcp_rcv_established()(快路径)
  • 发包:tcp_sendmsg() -> ip_queue_xmit()
  • 用户态读:tcp_recvmsg()

TCP 复杂度主要在连接状态机、重传、拥塞控制和确认机制;这些都建立在 IPv4 路由与 dev 队列机制之上。

9.2 UDP

  • 收包:udp_rcv() -> __udp4_lib_rcv()
  • 发包:udp_sendmsg()
  • 用户态读:udp_recvmsg()

UDP 路径更短,无连接状态机,但依旧走同一套 IP 路由与 netdevice 发包框架。


10. Netfilter 在主路径的切入点

IPv4 主路径中可见典型钩子:

  • NF_INET_PRE_ROUTINGip_rcv
  • NF_INET_LOCAL_INip_local_deliver
  • NF_INET_FORWARDip_forward
  • NF_INET_LOCAL_OUTip_local_out
  • NF_INET_POST_ROUTINGip_output

这五个点构成了防火墙/NAT/conntrack 的核心挂载面。


11. 架构总结

RK3588 kernel-6.1net 架构可总结为:

  • 统一入口层socket.c 把系统调用映射到具体协议族。
  • 协议分发层af_inet.c 组织 IPv4 协议创建与 L4 分发。
  • 数据平面核心层net/core/dev.c 承担 RX/TX 主循环和与网卡驱动的衔接。
  • 协议处理层ipv4/ 中的 ip_input/ip_output/route/tcp/udp 形成完整 L3/L4 协议栈。
  • 策略控制层:Netfilter/FIB/XFRM 在关键节点插入策略与转发决策。

一句话:net 子系统是“socket 抽象 + 协议栈处理 + 设备数据平面 + 策略钩子”协同工作的分层体系。

文章互动

阅读 --

留言

0 条留言

正在加载留言…