内核参数全景图

网络核心参数

# /etc/sysctl.d/99-network-tuning.conf

# TCP 连接优化
net.ipv4.tcp_syncookies = 1           # 防 SYN Flood
net.ipv4.tcp_max_syn_backlog = 65535  # SYN 队列长度
net.core.somaxconn = 65535            # 监听队列长度
net.ipv4.tcp_abort_on_overflow = 0    # 队列满时不直接拒绝

# 端口复用
net.ipv4.tcp_tw_reuse = 1             # TIME_WAIT 端口复用
net.ipv4.tcp_fin_timeout = 15         # FIN_WAIT2 超时时间
net.ipv4.tcp_max_tw_buckets = 65535   # TIME_WAIT 最大数量

# 缓冲区大小
net.core.rmem_max = 16777216          # 接收缓冲区最大值
net.core.wmem_max = 16777216          # 发送缓冲区最大值
net.core.rmem_default = 1048576       # 接收缓冲区默认值
net.core.wmem_default = 1048576       # 发送缓冲区默认值
net.ipv4.tcp_rmem = 4096 1048576 16777216  # TCP 接收缓冲区
net.ipv4.tcp_wmem = 4096 1048576 16777216  # TCP 发送缓冲区

# 连接追踪
net.netfilter.nf_conntrack_max = 262144    # 连接追踪表大小
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 30
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 15
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 30

# UDP 优化
net.ipv4.udp_rmem_min = 81920
net.ipv4.udp_wmem_min = 81920

# 路由优化
net.ipv4.conf.all.rp_filter = 1           # 反向路径过滤
net.ipv4.conf.default.rp_filter = 1
net.ipv4.icmp_echo_ignore_broadcasts = 1  # 忽略广播 ping
net.ipv4.conf.all.accept_redirects = 0    # 拒绝 ICMP 重定向
net.ipv4.conf.all.send_redirects = 0

BBR 拥塞控制

# 检查可用算法
sysctl net.ipv4.tcp_available_congestion_control

# 启用 BBR
echo "net.core.default_qdisc=fq" >> /etc/sysctl.d/99-network-tuning.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.d/99-network-tuning.conf
sysctl -p

# 验证
sysctl net.ipv4.tcp_congestion_control
lsmod | grep bbr

内核网络模块

# 网络相关模块
modprobe tcp_bbr        # BBR 拥塞控制
modprobe tcp_noha       # NOHA 算法
modprobe nf_conntrack   # 连接追踪
modprobe iptable_nat    # NAT

# 查看已加载模块
lsmod | grep -E "tcp|net|ip"

# 开机自动加载
echo "tcp_bbr" >> /etc/modules-load.d/bbr.conf

网络性能压测

iperf3 带宽测试

# 服务端
iperf3 -s

# 客户端
iperf3 -c server_ip

# UDP 测试
iperf3 -c server_ip -u -b 100M

# 并发测试
iperf3 -c server_ip -P 4

# 反向测试(服务端→客户端)
iperf3 -c server_ip -R

netperf 延迟测试

# 安装
apt install netperf

# 服务端
netserver

# 客户端
netperf -H server_ip -t TCP_RR    # 请求响应延迟
netperf -H server_ip -t TCP_STREAM  # 吞吐量

hping3 网络探测

# SYN 扫描
hping3 -S -p 80 server_ip

# UDP 扫描
hping3 --udp -p 53 server_ip

# ICMP 延迟测试
hping3 -1 server_ip

# 带宽测试
hping3 -S -p 80 --flood server_ip

ss 连接分析

# 查看所有连接
ss -s

# 查看 TCP 连接
ss -tnp

# 查看监听端口
ss -tlnp

# 查看 UDP 连接
ss -unp

# 查看状态统计
ss -ant | awk '{print $1}' | sort | uniq -c | sort -rn

# 查看连接队列
ss -lntp | awk '{print $1, $2, $3, $4}'

nstat 网络统计

# 实时统计
nstat

# 关注指标
nstat -z | grep -E "TcpRetrans|TcpExtTCPTimeout|TcpExtTCPSynRetrans"

连接追踪优化

conntrack 表管理

# 查看当前连接数
cat /proc/sys/net/netfilter/nf_conntrack_count

# 查看最大连接数
cat /proc/sys/net/netfilter/nf_conntrack_max

# 查看连接追踪表
conntrack -L

# 统计连接状态
conntrack -L -o extended | awk '{print $4}' | sort | uniq -c | sort -rn

# 优化超时时间
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=3600
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_time_wait=30
sysctl -w net.netfilter.nf_conntrack_tcp_timeout_close_wait=15

常见问题排查

# SYN Flood 防护
dmesg | grep SYN
netstat -s | grep SYN

# 连接数过多
ss -s
netstat -an | wc -l

# TIME_WAIT 过多
netstat -an | grep TIME_WAIT | wc -l

# 连接追踪表满
dmesg | grep conntrack

网络调试工具

tcpdump 抓包

# 基本抓包
tcpdump -i eth0

# 过滤主机
tcpdump -i eth0 host 192.168.1.1

# 过滤端口
tcpdump -i eth0 port 80

# 过滤协议
tcpdump -i eth0 tcp

# 保存到文件
tcpdump -i eth0 -w capture.pcap

# 读取文件
tcpdump -r capture.pcap

# 常用过滤器
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'  # SYN 包
tcpdump -i eth0 'tcp[tcpflags] & tcp-rst != 0'  # RST 包

mtr 路由追踪

# 基本使用
mtr server_ip

# 报告模式
mtr -rw server_ip

# 指定次数
mtr -c 100 server_ip

ip 命令

# 查看网络接口
ip addr show
ip link show

# 查看路由
ip route show

# 查看邻居表
ip neigh show

# 配置接口
ip addr add 192.168.1.100/24 dev eth0
ip link set eth0 up

# 路由操作
ip route add default via 192.168.1.1
ip route del 10.0.0.0/8

性能基准测试

网络吞吐量

# 使用 dd 测试
dd if=/dev/zero of=server_ip bs=1M count=1024

# 使用 netcat
dd if=/dev/zero | nc server_ip 12345
nc -l 12345 > /dev/null

延迟测试

# ping 延迟
ping -c 100 server_ip

# TCP 延迟
hping3 -S -p 80 -c 100 server_ip

# HTTP 延迟
curl -o /dev/null -s -w "time_total: %{time_total}\n" http://server_ip

面试常见问题

  1. TCP 和 UDP 的区别?

    • TCP: 可靠、有序、面向连接
    • UDP: 不可靠、无序、无连接
    • TCP 适合文件传输,UDP 适合实时应用
  2. 如何检测网络丢包?

    • ping: 检测 ICMP 丢包
    • mtr: 追踪路由并统计丢包
    • ss -s: 查看重传统计
  3. TIME_WAIT 过多如何处理?

    • 开启 tcp_tw_reuse
    • 减小 tcp_fin_timeout
    • 使用长连接
  4. 如何优化高并发服务器?

    • 增大 somaxconn
    • 开启 tcp_tw_reuse
    • 调整连接追踪参数
    • 使用 BBR 拥塞控制

实战: 网络性能分析脚本

#!/bin/bash

echo "=== 网络性能分析 ==="

echo "1. 连接状态:"
ss -s

echo ""
echo "2. 重传统计:"
nstat -z | grep -E "TcpRetrans|TcpExtTCPTimeout" | head -10

echo ""
echo "3. 连接追踪:"
echo "当前: $(cat /proc/sys/net/netfilter/nf_conntrack_count)"
echo "最大: $(cat /proc/sys/net/netfilter/nf_conntrack_max)"

echo ""
echo "4. 端口监听:"
ss -tlnp | head -10

echo ""
echo "5. 网络接口:"
ip -s link show eth0