为什么按层排查
TCP 连接失败可能是本机进程没起、内核队列满、防火墙丢包、中间设备改包或对端应用假死,这些原因在现象上高度相似。按「本机统计 → 状态分布 → 监听与队列 → 抓包看握手 → 两端对照」的顺序推进,每一步都能排除一类可能,绝大多数问题能在前三步定位。
基本信息
| 适用平台 | Linux(iproute2、conntrack-tools、tcpdump) |
|---|---|
| 权限要求 | ss -p 需 root 或同用户;tcpdump 与 conntrack 需 root |
| 关键工具 | ss、tcpdump、conntrack、netstat -s |
| 判断依据 | 状态、队列溢出计数、握手报文三处证据 |
分层排查命令
分层排查命令
ss -s # 1 全局统计:TCP 总数与内存压力
ss -tan | awk '{print $1}' | sort | uniq -c # 2 状态分布
ss -lntp | grep 8080 # 3 监听地址与 Recv-Q/Send-Q
nstat -az | grep -i -E 'drop|overflow' # 4 内核丢包计数
tcpdump -nn -c 20 'tcp port 8080' # 5 抓握手与 RST
conntrack -L 2>/dev/null | wc -l # 6 连接跟踪表用量
cat /proc/sys/net/netfilter/nf_conntrack_count /proc/sys/net/netfilter/nf_conntrack_max信号到方向
| 信号 | 指向 |
|---|---|
| SYN 发出后无任何响应 | 中间设备或对端防火墙丢包 |
| SYN 到达但对端回 RST | 对端端口未监听或被策略拒绝 |
| 三次握手成功但没有数据 | 应用层阻塞或 MTU 黑洞 |
| 大量同序号重传 | 链路误码或中间拥塞 |
| 握手成功、连接瞬间消失 | 对端进程崩溃或被 OOM 杀死 |
| Recv-Q 持续非 0 | 应用 accept 太慢,accept 队列堆积 |
典型使用场景
- 新部署服务端口不通,需要区分「没监听」和「被防火墙拦」
- 高峰期零星超时,要确认是否 accept 队列溢出或连接跟踪表满
- 容器或跨机房调用偶发失败,需要两端同时抓包比对
- 压测后 TIME_WAIT 与 conntrack 计数飙升,需要评估内核参数
- 排查「只有部分客户端连不上」,用于定位 MTU 与路由不对称
两端同时抓包是最高效的交叉验证:一端看到 SYN 重传、另一端根本没收到,问题就在中间链路;两端都收到了 SYN 但没有 SYN-ACK,问题在对端内核或应用。
tcpdump 在高流量网卡上会吃 CPU 并可能丢弃抓包缓冲,抓包时限定过滤条件与包数(-c)或写文件(-w)后再离线分析。