Linux 网络栈
数据包从用户态应用经过 socket 层、传输层、网络层、netfilter 钩子,最终到达网卡驱动。理解这一路径对排查延迟、丢包和连接问题至关重要。
网络栈分层
用户态应用(nginx, redis ...)
↓
Socket 层(BSD socket API) ← connect/accept/read/write
↓
传输层(TCP / UDP) ← 端口号、可靠传输、拥塞控制
↓
网络层(IPv4 / IPv6) ← 路由、分片
↓
netfilter(iptables/nftables) ← 过滤、NAT、mangle
↓
邻居子系统(ARP / NDP) ← MAC 地址解析
↓
设备驱动(网卡) ← ring buffer、DMA
核心概念
Sockets — 用户态与内核网络栈的接口,每个 TCP 连接对应一个 socket,内核维护发送/接收缓冲区和状态机。
Network Namespaces — 网络栈隔离单元,每个 namespace 拥有独立的接口、路由表和 iptables 规则。Docker 和 Kubernetes Pod 依赖此机制。
veth pair — 虚拟以太网设备对,一端发的数据从另一端收,用于连接不同 namespace。Bridge 是虚拟交换机,将多个接口桥接在一起。Docker 默认使用 docker0 bridge。
ss -s # socket 统计概览
ss -tnp # 所有 TCP 连接及状态
ss -tlnp # 监听端口
ip netns list # 列出所有命名空间
ip netns exec test-ns ip addr # 命名空间内执行命令
iptables / nftables
netfilter 是内核包过滤框架,用户通过 iptables 或 nftables 配置规则。
四表:filter(过滤)、nat(地址转换)、mangle(修改包头)、raw(连接跟踪豁免)
五链:PREROUTING → INPUT / FORWARD → OUTPUT → POSTROUTING
iptables -L -n -v --line-numbers # 查看 filter 表规则
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -j DROP
nft list ruleset # nftables 查看规则集
nft add rule inet filter input tcp dport 22 accept
网络排查工具
# ss — Socket 统计
ss -tan state time-wait | wc -l # TIME_WAIT 连接数
ss -tnp | grep :8080 # 特定端口连接
ss -tmi # socket 缓冲区使用
# ip — 网络配置
ip addr show # 接口和地址
ip route show # 路由表
ip -s link show eth0 # 接口统计(丢包、错误)
# tcpdump — 抓包
tcpdump -i eth0 port 80 -nn # 特定端口流量
tcpdump -i eth0 host 10.0.0.5 -w /tmp/capture.pcap
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0' -nn # 只抓 SYN
SRE 常见网络问题
TIME_WAIT 堆积
短连接场景下主动关闭方进入 TIME_WAIT,占用端口资源:
ss -tan state time-wait | wc -l # 统计数量
sysctl -w net.ipv4.tcp_tw_reuse=1 # 允许复用
sysctl -w net.ipv4.tcp_fin_timeout=30 # 缩短 FIN_WAIT_2 超时
端口耗尽
客户端大量出站连接可能耗尽临时端口:
sysctl net.ipv4.ip_local_port_range # 查看范围
sysctl -w net.ipv4.ip_local_port_range="1024 65535"
conntrack 表满
netfilter 连接跟踪表满后新连接被丢弃:
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
sysctl -w net.netfilter.nf_conntrack_max=262144
conntrack -L | head -20 # 查看跟踪表
延迟排查路径
1. ping — 基础连通性和 RTT
2. mtr — 逐跳延迟定位
3. ss -tnp — 确认连接状态
4. tcpdump — 抓包分析握手
5. ip -s link — 网卡丢包计数
6. dmesg | grep net — 内核网络告警