检查tcp连接状态异常需先统计time_wait、close_wait、syn_recv数量,重点排查close_wait过多;再用tcpdump分析握手与重传行为;接着验证tcp_slow_start_after_idle、tcp_timestamps等内核参数;最后通过mtr、中断统计和拥塞算法排查链路与资源问题。

检查TCP连接状态是否异常
网络延迟高时,先确认是否存在大量TIME_WAIT、CLOSE_WAIT或SYN_RECV连接。这些状态堆积往往意味着连接未正常释放或服务响应慢。
运行 ss -tan | awk '{print $1}' | sort | uniq -c | sort -nr 查看各状态连接数;重点关注 CLOSE_WAIT 过多——这通常说明应用没主动关闭socket,可能因代码未调用 close() 或异常退出导致资源滞留。
抓包分析TCP握手与重传行为
用 tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-rst|tcp-fin) != 0 or tcp[12] & 0xf0 > 0x40' 捕获控制报文,观察三次握手是否延迟、FIN/RST是否突增、是否有重复SYN或重传ACK。
若发现SYN重发间隔不断拉长(如1s→2s→4s→8s),说明对端无响应,需排查目标主机负载、防火墙拦截或路由问题;若客户端发出ACK后长时间无数据,可能是服务端应用卡在业务逻辑中,未进入read()或write()阶段。
验证内核TCP参数是否合理
延迟敏感场景下,以下参数容易成为瓶颈:
• net.ipv4.tcp_slow_start_after_idle=0:避免空闲后重置拥塞窗口,减少首包延迟
• net.ipv4.tcp_timestamps=1 且 net.ipv4.tcp_tw_reuse=1:启用时间戳可支持PAWS机制防序列号回绕,tw_reuse允许TIME_WAIT套接字快速复用于新连接(仅客户端有效)
• net.core.somaxconn 和 net.ipv4.tcp_max_syn_backlog 应设为一致且足够大(如65535),防止SYN队列溢出丢包
排除中间链路与本机资源干扰
延迟不一定是TCP层问题,需交叉验证:
• 用 mtr -T -P 443 example.com 定位哪一跳延迟突增,区分是本地、运营商还是远端问题
• 检查本机CPU软中断(cat /proc/interrupts | grep eth)、网卡ring buffer是否溢出(ethtool -S eth0 | grep -i "drop\|over")
• 确认未开启tcp_bic或tcp_htcp等激进拥塞算法(sysctl net.ipv4.tcp_congestion_control),生产环境推荐使用cubic或bbr(需内核4.9+)











