
一、Linux 内核网络知识图谱Linux 网络子系统架构节点核心索引 ├── 用户态层 │ ├── App用户应用程序Web服务器、Ping、Traceroute │ └── Tools配置工具ip、tc、ethtool ├── Socket/接口层 │ ├── SockSocket 系统调用socket、bind、sendmsg │ └── Netlink内核配置总线route、neigh、addr ├── 传输层(L4)│ └── TCP/UDP/ICMPL4 协议处理tcp_v4_rcv、udp_rcv ├── 网络层(L3)—— 核心转发 │ ├── IPIPv4 协议栈ip_rcv、ip_forward、ip_local_deliver、分片重组 │ ├── Route路由表 FIBfib_lookup、fib_nh、fib_trie │ ├── Cache路由缓存 DSTdst_entry、RCU 读锁、垃圾回收 │ └── Neigh邻居子系统 ARP/NDNUD 状态机、arp_queue、代理ARP ├── 链路层(L2)│ ├── Bridge网桥MAC 学习 FDB、生成树 STP、泛洪 │ └── Qdisc流量控制队列HTB、SFQ、qdisc_run、dev_queue_xmit └── 驱动与硬件层 ├── NAPI收包软中断net_rx_action、budget预算、NAPI轮询 ├── TXSoft发包软中断net_tx_action、释放skb、唤醒暂停队列 ├── IRQ硬中断关中断、最小操作、触发napi_schedule ├── Dev网卡驱动注册net_device、hard_start_xmit └── Hw物理网卡DMA传输、发送/接收环形缓冲区 二、十大核心知识模块1. 数据结构基石sk_buff套接字缓冲区Linux网络包的唯一载体。零拷贝设计通过skb_push加头、skb_pull去头、skb_put加数据操作head/data/tail/end四个指针实现各层协议头添加与剥离无数据拷贝。引用计数users结构体引用和dataref数据区引用协同支持skb_clone浅拷贝和skb_copy深拷贝。net_device网络设备物理网卡与虚拟网卡的统一抽象。包含hard_start_xmit发送函数、flags运行状态、features硬件卸载能力如NETIF_F_HW_CSUM、NETIF_F_TSO。2. 收包路径 RX中断/软中断/NAPI硬中断Top Half执行时间极短仅做“关中断”、“记录数据”、“调用napi_schedule”后立即返回。软中断Bottom Halfnet_rx_action处理。引入了NAPINew API。NAPI 核心机制高负载时关闭硬中断转而在软中断中主动轮询网卡。budget预算机制防止单次软中断处理过多包导致 CPU 饿死默认 64/300。process_backlog为非 NAPI 老驱动提供兼容的后备处理函数。RX 路径完整调用链HardIRQ-napi_schedule-net_rx_action-poll-netif_receive_skb-ip_rcv/br_handle_frame。3. 发包路径 TX / QoSdev_queue_xmit所有 L3 协议IP、ARP发送的统一入口。流量控制Qdisc / 队列规则Linux 强大的 QoS 层。通过qdisc-enqueue入队qdisc-dequeue出队支持HTB、SFQ等复杂调度。流控状态机驱动检测到硬件 FIFO 满时调用netif_stop_queue停止发送硬件空间恢复后调用netif_wake_queue唤醒重试。发送软中断net_tx_action负责释放已发送完毕的sk_buff并唤醒因锁竞争而等待发送的设备。4. 路由子系统 FIB / 缓存 / 查找数据分层fib_info转发动作下一跳、出接口。fib_node目的地网络按掩码分组。fib_alias策略TOS、优先级。复用设计多个fib_alias可共享同一个fib_info大幅节省内存。查找逻辑LPM 最长前缀匹配按fn_zone从32到0遍历取掩码最长的路由。双表设计优先查ip_fib_local_table本机地址极小再查ip_fib_main_table。策略路由fib_rules链表优先级决定匹配顺序。支持按iif、fwmark、src_ip选表。路由缓存DST Cache核心是dst_entry结构中的input和output函数指针。RCU 读锁查找几乎无锁性能极高。垃圾回收异步rt_check_expire配合同步rt_garbage_collect双重机制。5. 邻居子系统 ARP / NUD通用基础设施ARPIPv4和 NDIPv6共享同一套neigh_table、struct neighbour代码。NUD 状态机网络不可达检测REACHABLE可达 → 超时 →STALE可能过期。STALE发数据 →DELAY等待上层 TCP ACK 确认优化窗口。窗口过期未确认 →PROBE主动发送单播探测。探测超时 →FAILED解析失败。ARP 核心逻辑代理 ARParp_fwd_proxy检查arp_ignore与arp_filter防震荡。免费 ARP用于 IP 冲突检测与 VIP 迁移后快速收敛。队列arp_queue每个邻居表项拥有独立队列解析期间数据包入队等待。6. 网桥 Bridging / STP二层交换核心基于 MAC 地址学习FDB 表转发。未知单播和广播采用泛洪。STP 生成树协议状态机阻塞 - 监听 - 学习 - 转发。收敛延迟默认通过 30 秒的Forward Delay15秒 * 2重大瓶颈生产环境通常改用 RSTP 或 MSTP。Linux 实现差异br0本身是个虚拟设备绑定物理端口br_add_if并通过br_pass_frame_up将本地 IP 包交回网络栈处理。7. IPv4 核心机制分片与重组ip_fragment发送端分片支持快速路径frag_list零拷贝和慢速路径数据拷贝。ip_defrag接收端重组通过ipq哈希表缓存碎片使用定时器默认30秒清理死碎片。支持重叠碎片处理裁剪旧碎片保留新碎片。IP ID 生成Linux 按目的 IP 在inet_peer中独立维护 ID 计数器而不是全局计数器。校验和设计IP 校验和仅覆盖IP 报头不覆盖负载。L4 层TCP/UDP负责端到端校验。ICMP 与速率限制icmp_send/icmp_rcv使用令牌桶icmp_ratelimit限制错误消息的发送频率防止 ICMP 风暴。8. 用户态配置接口Netlink现代推荐全双工、异步、支持内核主动推送如路由变化。iproute2工具集基于此。ioctl传统弃用单工、同步、扩展性差。net-tools工具集ifconfig、route基于此。/proc 与 /sys实时调优/proc/sys/net/ipv4/全局 IP 配置如ip_forward、ip_local_port_range。/proc/sys/net/ipv4/conf/网卡级配置。/proc/sys/net/ipv4/neigh/邻居子系统ARP调优如base_reachable_time、gc_thresh3。9. 并发与锁机制贯穿全书RCU 锁读-拷贝-更新高频率读操作如路由缓存查找、邻居表查找专用的高性能锁。读端无需加锁仅需rcu_read_lock大幅降低多核竞争。自旋锁Spinlock保护短操作的临界区。软中断中常用spin_lock_bh关底半部或spin_lock_irqsave关硬中断。信号量 / 互斥锁Semaphore允许睡眠保护长耗时的配置操作。核心是rtnl_lock所有路由表、地址、链路配置修改都必须先获取它。10. 常用内核调优参数避免踩坑路由缓存/转发ip_forward全局转发、rp_filter反向路径过滤、net.ipv4.route.max_size缓存上限。邻居子系统ARPbase_reachable_time30秒调大减广播、gc_thresh31024内存大可调大、arp_ignore多网卡防震荡。分片/重组ipfrag_high_thresh256K大流量调大、ipfrag_time30秒低延迟调小。ICMP 限制icmp_ratelimit限制错误消息发送频率、icmp_echo_ignore_broadcasts防 Ping 风暴。️ 三、常用知识点总结与高频排错“避坑”指南知识点核心本质面试/实战极易踩坑点NAPI 机制中断轮询混合解决中断风暴budget用完退出未清空队列时不要调用napi_complete否则网卡会永久卡死。sk_buff 零拷贝四指针head/data/tail/end滑动克隆的skb共享数据区若修改数据必须在克隆体上深拷贝skb_copy否则污染原包。路由查找优先查缓存未命中走 FIB策略路由fib_rules是按优先级顺序匹配的配置不当可能导致流量突然“失踪”。ARP 状态机REACHABLE-STALE-DELAYDELAY是优化窗口默认5秒TCP ACK 在此窗口内可确认邻居可达无需广播探测。STP 收敛时间默认 30~50 秒生产环境尤其是容器网络必须改用RSTP802.1w或MSTP或者直接禁用。IP 分片仅第一个分片含 L4 头端口防火墙/NAT 处理分片包时必须重组才能看见端口易被碎片攻击耗尽内存。ICMP 错误错误消息触发速率限制若大包不通小包通通常是因为防火墙拦截了ICMP_FRAG_NEEDED导致 PMTUD 失败。rtnl_lock串行化路由配置修改锁是信号量可睡眠。绝对不能在软中断上下文如net_rx_action中获取它否则触发might_sleep崩溃。