内核参数全景图
网络核心参数
# /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
面试常见问题
TCP 和 UDP 的区别?
- TCP: 可靠、有序、面向连接
- UDP: 不可靠、无序、无连接
- TCP 适合文件传输,UDP 适合实时应用
如何检测网络丢包?
ping: 检测 ICMP 丢包mtr: 追踪路由并统计丢包ss -s: 查看重传统计
TIME_WAIT 过多如何处理?
- 开启
tcp_tw_reuse - 减小
tcp_fin_timeout - 使用长连接
- 开启
如何优化高并发服务器?
- 增大
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