Linux 网络子系统(Networking)
下面是一份 「Linux 内核核心子系统:网络子系统(Networking)」的系统级、内核级完整梳理。
定位是:内核原理 -> 数据路径 -> 性能 -> 容器 / 虚拟化 / 云 / 调优。
适用于 RHEL / AlmaLinux / Debian / Ubuntu。
用户态应用
↓
Socket API(glibc)
↓
系统调用(send / recv)
↓
Socket Layer
↓
TCP / UDP / ICMP / IP
↓
Netfilter / Routing
↓
qdisc / TC
↓
NIC Driver
↓
网卡 / DMA
📌 Linux 网络 = 一条“分层 + 旁路 + 钩子”的复杂流水线
Linux 网络子系统要同时满足:
- 通用协议栈(TCP/IP)
- 高性能(10G / 100G / DPDK)
- 可扩展(模块化、Hook)
- 虚拟化(namespace / veth)
- 安全(iptables / nftables)
Socket = 内核对象,不是文件
- 每个 socket 都是 struct sock
- 文件描述符只是索引
| 类型 | 协议 |
|---|---|
| SOCK_STREAM | TCP |
| SOCK_DGRAM | UDP |
| SOCK_RAW | 原始包 |
| SOCK_PACKET | 已废弃 |
send()
-> sys_sendto()
-> sock_sendmsg()
-> tcp_sendmsg()
📌 glibc 只是封装,真正逻辑在内核
职责:
- 路由查找
- 分片 / 重组
- TTL
- checksum
核心结构:
- struct sk_buff(skb)
📌 skb 是网络子系统的“核心数据结构”
职责:
- 可靠传输
- 拥塞控制
- 重传
- 流控
关键组件:
- send buffer / recv buffer
- RTT
- cwnd
- RTO
- cubic(默认)
- bbr
- reno
📌 云环境强烈建议 BBR
- 无连接
- 无可靠
- 几乎零开销
📌 DNS / QUIC / 游戏 / 监控
struct sk_buff {
data
len
protocol
dev
cb
next / prev
}
作用:
- 封装数据
- 在协议栈中流转
- 每一层 push / pull header
📌 所有性能问题,最后都会落在 skb 上
目的 IP
-> FIB(路由表)
-> nexthop
-> 设备
内核结构:
- FIB trie
- hash cache
- 多路由表
- fwmark / source-based
📌 容器 / VPN 必备
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
📌 这是 Linux 防火墙、NAT、K8S 的根基
- stateful firewall
- TCP 状态机
❌ conntrack 爆满 = 全网卡死
包排队与调度器
- pfifo_fast
- fq_codel
- cake
- 限速
- 延迟注入
- QoS
NIC -> DMA -> ring buffer
-> NAPI
-> netif_receive_skb()
- 低流量:中断
- 高流量:轮询
📌 防止中断风暴
网络世界的“平行宇宙”
每个 namespace 拥有:
- 网卡
- 路由表
- iptables
- conntrack
📌 容器网络基础
- 成对虚拟网卡
- namespace 连接器
- 二层转发
- MAC 学习
- L2 over L3
- 云 / K8S 默认
用途:
- XDP
- TC BPF
- tracing
📌 现代 Linux 网络调优核心
NIC driver
-> XDP
-> DROP / PASS / REDIRECT
性能:
- 百万 PPS
- 绕过协议栈
- 完全绕过内核
- 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、队列、驱动之间的高性能流转系统。
┌─────────────────────────────┐
│ 应用层 │
│ 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 = 应用访问网络的“文件描述符”
fd = socket(AF_INET, SOCK_STREAM, TCP)
Linux 的设计哲学
- 一切皆文件
- 网络 = 文件描述符
ls -l /proc/$$/fd
| AF | 含义 |
|---|---|
| AF_INET | IPv4 |
| AF_INET6 | IPv6 |
| AF_UNIX | 本地进程通信 |
| AF_PACKET | 二层抓包 |
| 类型 | 用途 |
|---|---|
| SOCK_STREAM | TCP |
| SOCK_DGRAM | UDP |
| SOCK_RAW | 原始包 |
核心机制
- 三次握手
- 滑动窗口
- 重传
- 拥塞控制(cubic / bbr)
sysctl net.ipv4.tcp_congestion_control
- 无连接
- 不保证可靠性
- 低延迟
典型场景:
- DNS
- 视频
- 日志采集
- ping
- path MTU
- 网络错误报告
ip route
路由匹配规则
- 最长前缀匹配
- metric
- scope
ip rule
ip route show table 100
📌 用于多网卡 / VPN / 容器
ip neigh
- IPv4 -> ARP
- IPv6 -> NDP
| 类型 | 场景 |
|---|---|
| eth0 | 物理 |
| ens33 | 可预测命名 |
| lo | 本地 |
| br0 | 桥 |
| veth | 容器 |
| tun/tap | VPN |
- TX/RX queue
- softirq
- NAPI
cat /proc/interrupts
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
| 表 | 作用 |
|---|---|
| raw | 连接追踪 |
| mangle | 修改 |
| nat | 地址转换 |
| filter | 防火墙 |
| iptables | nftables | |
|---|---|---|
| 时代 | 老 | 新 |
| 性能 | 一般 | 更高 |
| 推荐 | ❌ | ✅ |
conntrack -L
- NAT
- 防火墙
- 会话保持
📌 conntrack 爆满 = 网络雪崩
内核级流量控制
- 限速
- 延迟
- 丢包
tc qdisc show
XDP
- 驱动层
- 万兆 / 百万 PPS
eBPF
- 动态注入
- 无需改内核
- dual stack
- IPv4-mapped IPv6
- IPv6 socket fallback
📌 这也是 禁 IPv6 出问题 的根本原因之一
ip netns add test
ip netns exec test ip a
- Docker
- K8S
- VPN
| 工具 | 作用 |
|---|---|
| ss | 连接 |
| tcpdump | 抓包 |
| iperf | 吞吐 |
| ethtool | 网卡 |
| nstat | TCP |
- 链路通吗?
- IP 对吗?
- 路由对吗?
- 防火墙拦了吗?
- 内核参数异常吗?
| 项目 | RHEL / AlmaLinux | Debian / Ubuntu |
|---|---|---|
| 网络管理 | NetworkManager | netplan |
| 防火墙 | nftables / firewalld | nftables |
| DNS | systemd-resolved | resolved |
Linux 网络不是一个模块,而是一整套从
Socket -> 协议栈 -> 路由 -> 防火墙 -> 驱动 -> 硬件
的“数据通路系统”。