Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Linux 网络子系统(Networking)

下面是一份 「Linux 内核核心子系统:网络子系统(Networking)」的系统级、内核级完整梳理

定位是:内核原理 -> 数据路径 -> 性能 -> 容器 / 虚拟化 / 云 / 调优

适用于 RHEL / AlmaLinux / Debian / Ubuntu

一、Linux 网络子系统在内核中的位置

用户态应用
Socket API(glibc)
系统调用(send / recv)
Socket Layer
TCP / UDP / ICMP / IP
Netfilter / Routing
qdisc / TC
NIC Driver
网卡 / DMA

📌 Linux 网络 = 一条“分层 + 旁路 + 钩子”的复杂流水线

二、核心设计目标

Linux 网络子系统要同时满足:

  1. 通用协议栈(TCP/IP)
  2. 高性能(10G / 100G / DPDK)
  3. 可扩展(模块化、Hook)
  4. 虚拟化(namespace / veth)
  5. 安全(iptables / nftables)

三、Socket 层(用户与内核的分界线)

1️⃣ Socket 的本质

Socket = 内核对象,不是文件

  • 每个 socket 都是 struct sock
  • 文件描述符只是索引

2️⃣ Socket 类型

类型 协议
SOCK_STREAM TCP
SOCK_DGRAM UDP
SOCK_RAW 原始包
SOCK_PACKET 已废弃

3️⃣ 系统调用路径

send()
 -> sys_sendto()
   -> sock_sendmsg()
     -> tcp_sendmsg()

📌 glibc 只是封装,真正逻辑在内核

四、协议栈(TCP / UDP / IP)

1️⃣ IP 层(L3)

职责:

  • 路由查找
  • 分片 / 重组
  • TTL
  • checksum

核心结构:

  • struct sk_buff(skb)

📌 skb 是网络子系统的“核心数据结构”

2️⃣ TCP(L4)

职责:

  • 可靠传输
  • 拥塞控制
  • 重传
  • 流控

关键组件:

  • send buffer / recv buffer
  • RTT
  • cwnd
  • RTO

TCP 拥塞控制算法

  • cubic(默认)
  • bbr
  • reno

📌 云环境强烈建议 BBR

3️⃣ UDP

  • 无连接
  • 无可靠
  • 几乎零开销

📌 DNS / QUIC / 游戏 / 监控

五、sk_buff(skb)详解(核心)

struct sk_buff {
  data
  len
  protocol
  dev
  cb
  next / prev
}

作用:

  • 封装数据
  • 在协议栈中流转
  • 每一层 push / pull header

📌 所有性能问题,最后都会落在 skb 上

六、路由子系统(Routing)

1️⃣ 路由查找流程

目的 IP
 -> FIB(路由表)
   -> nexthop
     -> 设备

内核结构:

  • FIB trie
  • hash cache

2️⃣ policy routing

  • 多路由表
  • fwmark / source-based

📌 容器 / VPN 必备

七、Netfilter(iptables / nftables)

1️⃣ 五大 Hook 点

PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING

📌 这是 Linux 防火墙、NAT、K8S 的根基

2️⃣ conntrack(连接跟踪)

  • stateful firewall
  • TCP 状态机

❌ conntrack 爆满 = 全网卡死

八、TC / qdisc(流量控制)

1️⃣ qdisc 是什么?

包排队与调度器

  • pfifo_fast
  • fq_codel
  • cake

2️⃣ 常见用途

  • 限速
  • 延迟注入
  • QoS

九、NIC Driver 与 DMA

1️⃣ RX 路径(收包)

NIC -> DMA -> ring buffer
 -> NAPI
   -> netif_receive_skb()

2️⃣ NAPI(中断合并)

  • 低流量:中断
  • 高流量:轮询

📌 防止中断风暴

十、网络命名空间(Network Namespace)

网络世界的“平行宇宙”

每个 namespace 拥有:

  • 网卡
  • 路由表
  • iptables
  • conntrack

📌 容器网络基础

十一、veth / bridge / overlay

veth

  • 成对虚拟网卡
  • namespace 连接器

bridge

  • 二层转发
  • MAC 学习

overlay(VXLAN)

  • L2 over L3
  • 云 / K8S 默认

十二、eBPF:网络子系统的“外挂系统”

用途:

  • XDP
  • TC BPF
  • tracing

📌 现代 Linux 网络调优核心

XDP(最早拦包)

NIC driver
 -> XDP
   -> DROP / PASS / REDIRECT

性能:

  • 百万 PPS
  • 绕过协议栈

十三、DPDK / 用户态网络

  • 完全绕过内核
  • poll + hugepage
  • 极致性能

❌ 管理复杂

十四、网络性能瓶颈地图

常见瓶颈
Socket buffer 太小
TCP 拥塞控制
IP 路由
Netfilter conntrack
qdisc 队列
Driver ring buffer
NIC offload

十五、生产级调优要点(速览)

net.core.somaxconn
net.ipv4.tcp_tw_reuse
net.ipv4.tcp_fin_timeout
net.core.netdev_max_backlog

📌 调优永远是“从 skb 走向 NIC”

十六、云 / 容器环境的网络特点

  • 虚拟 NIC
  • Overlay 网络
  • 高 RTT
  • conntrack 依赖重

十七、总结

Linux 网络子系统本质是:skb 在协议栈、路由、Hook、队列、驱动之间的高性能流转系统。


一、Linux 网络子系统整体架构

┌─────────────────────────────┐
│          应用层              │
│  nginx / ssh / mysql / curl │
└─────────────┬───────────────┘
              │ socket API
┌─────────────▼───────────────┐
│         Socket 层           |
│  AF_INET / AF_INET6 / UNIX  │
└─────────────┬───────────────┘
              │ protocol
┌─────────────▼───────────────┐
│       协议栈(TCP/IP)       |
│   TCP / UDP / ICMP / RAW    │
└─────────────┬───────────────┘
              │ routing
┌─────────────▼───────────────┐
│      路由 & 邻居子系统        |
│     route / arp / ndp       │
└─────────────┬───────────────┘
              │ netfilter
┌─────────────▼───────────────┐
│     Netfilter / XDP / TC    │
│      防火墙 / NAT / 限速      |
└─────────────┬───────────────┘
              │ driver
┌─────────────▼───────────────┐
│         网络设备驱动          │
│    virtio / e1000 / ixgbe   │
└─────────────┬───────────────┘
┌─────────────▼───────────────┐
│          硬件(NIC)         |
└─────────────────────────────┘

二、Socket 层(应用与内核的接口)

1️⃣ Socket 是什么?

Socket = 应用访问网络的“文件描述符”

fd = socket(AF_INET, SOCK_STREAM, TCP)

Linux 的设计哲学

  • 一切皆文件
  • 网络 = 文件描述符
ls -l /proc/$$/fd

2️⃣ 地址族(Address Family)

AF 含义
AF_INET IPv4
AF_INET6 IPv6
AF_UNIX 本地进程通信
AF_PACKET 二层抓包

3️⃣ Socket 类型

类型 用途
SOCK_STREAM TCP
SOCK_DGRAM UDP
SOCK_RAW 原始包

三、协议栈(TCP/IP Stack)

1️⃣ TCP

核心机制

  • 三次握手
  • 滑动窗口
  • 重传
  • 拥塞控制(cubic / bbr)
sysctl net.ipv4.tcp_congestion_control

2️⃣ UDP

  • 无连接
  • 不保证可靠性
  • 低延迟

典型场景:

  • DNS
  • 视频
  • 日志采集

3️⃣ ICMP

  • ping
  • path MTU
  • 网络错误报告

四、路由子系统(Routing)

1️⃣ 路由表

ip route

路由匹配规则

  1. 最长前缀匹配
  2. metric
  3. scope

2️⃣ 多路由表(Policy Routing)

ip rule
ip route show table 100

📌 用于多网卡 / VPN / 容器

3️⃣ 邻居表(ARP / NDP)

ip neigh
  • IPv4 -> ARP
  • IPv6 -> NDP

五、网络设备(Netdevice)

1️⃣ 网卡类型

类型 场景
eth0 物理
ens33 可预测命名
lo 本地
br0
veth 容器
tun/tap VPN

2️⃣ 队列与中断

  • TX/RX queue
  • softirq
  • NAPI
cat /proc/interrupts

六、Netfilter(防火墙 / NAT)

1️⃣ 五个 Hook 点

PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING

2️⃣ 表(Table)

作用
raw 连接追踪
mangle 修改
nat 地址转换
filter 防火墙

3️⃣ nftables vs iptables

iptables nftables
时代
性能 一般 更高
推荐

七、连接追踪(conntrack)

conntrack -L
  • NAT
  • 防火墙
  • 会话保持

📌 conntrack 爆满 = 网络雪崩

八、Traffic Control(TC)

内核级流量控制

  • 限速
  • 延迟
  • 丢包
tc qdisc show

九、XDP / eBPF(高性能网络)

XDP

  • 驱动层
  • 万兆 / 百万 PPS

eBPF

  • 动态注入
  • 无需改内核

十、IPv4 / IPv6 共存机制

  • dual stack
  • IPv4-mapped IPv6
  • IPv6 socket fallback

📌 这也是 禁 IPv6 出问题 的根本原因之一

十一、网络命名空间(Namespace)

ip netns add test
ip netns exec test ip a
  • Docker
  • K8S
  • VPN

十二、性能指标 & 排查

常用工具

工具 作用
ss 连接
tcpdump 抓包
iperf 吞吐
ethtool 网卡
nstat TCP

排查思路(非常重要)

  1. 链路通吗?
  2. IP 对吗?
  3. 路由对吗?
  4. 防火墙拦了吗?
  5. 内核参数异常吗?

十三、发行版差异(配置层)

项目 RHEL / AlmaLinux Debian / Ubuntu
网络管理 NetworkManager netplan
防火墙 nftables / firewalld nftables
DNS systemd-resolved resolved

十四、一句话总结

Linux 网络不是一个模块,而是一整套从

Socket -> 协议栈 -> 路由 -> 防火墙 -> 驱动 -> 硬件

的“数据通路系统”。