RK3588 kernel-6.1 net 网络架构与协议栈分析
1. 分析范围
本文基于:
rk3588/kernel-6.1/net
目标:
- 梳理
net子系统总体分层架构 - 解释 Linux 网络协议栈主数据路径(收包、发包、转发)
- 给出 TCP/UDP 在 IPv4 栈中的关键调用链
- 说明 Netfilter、路由子系统在主路径中的切入点
2. net 目录的总体分层
从 net/Makefile 可见网络栈是模块化分层组织:
- 套接字与核心层
socket.c、core/- 提供 socket 系统调用入口、
sk_buff收发调度、NAPI/软中断处理。
- 协议层
ipv4/、ipv6/、tcp/udp等协议实现- 负责 L3/L4 协议处理、连接管理、分片重组、拥塞控制等。
- 策略与过滤层
netfilter/、xfrm/- 提供防火墙/NAT/连接跟踪/IPsec 等路径钩子和策略。
- 链路与扩展层
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() 的关键动作:
- 根据
family/type/protocol选择协议族(如PF_INET) - 通过
net_families[family]找到net_proto_family - 调用该 family 的
create()(IPv4 对应inet_create())
因此 socket 层只是统一门面,真正协议实例化由各协议族完成。
4. IPv4 协议族装配(net/ipv4/af_inet.c)
af_inet.c 中定义了 IPv4 的协议族与协议分发表:
inet_family_ops.create = inet_createinetsw_array[]注册SOCK_STREAM/SOCK_DGRAM等与tcp_prot/udp_prot的映射inet_add_protocol()把tcp_v4_rcv、udp_rcv挂到 IPv4 协议号分发表
inet_init() 初始化时会完成:
proto_register(&tcp_prot)/proto_register(&udp_prot)sock_register(&inet_family_ops)- 协议处理函数与传输协议绑定
这一步决定了“协议号 -> 处理函数”的分发关系。
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_finiship_rcv_finish_core()做路由查找(ip_route_input_noref)、选项处理、early demux
然后按路由类型分流:
- 目的本机:
ip_local_deliver() - 需要转发:
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)是三层转发核心:
- TTL 检查与递减
- MTU/分片约束检查
- 路由与策略校验
- 通过
NF_INET_FORWARD钩子 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_ROUTING(ip_rcv)NF_INET_LOCAL_IN(ip_local_deliver)NF_INET_FORWARD(ip_forward)NF_INET_LOCAL_OUT(ip_local_out)NF_INET_POST_ROUTING(ip_output)
这五个点构成了防火墙/NAT/conntrack 的核心挂载面。
11. 架构总结
RK3588 kernel-6.1 的 net 架构可总结为:
- 统一入口层:
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 抽象 + 协议栈处理 + 设备数据平面 + 策略钩子”协同工作的分层体系。
正在加载留言…