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 — 内核网络告警