首页/网络/协议速查/TCP 连接问题排查清单
TCP 与 UDP54 条

TCP 连接问题排查清单

从本机栈到远端按层排查:状态分布 → 监听与队列 → 抓包看握手 → 对比两端视角,90% 的问题能定位到某一段。

协议速查网络更新于 2026-10-13

为什么按层排查

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)后再离线分析。

易错点

  • 只看应用日志判断「网络不通」,忽略 ss 显示 Recv-Q 长期非 0 的 accept 队列溢出,真正的瓶颈在应用处理速度
  • 防火墙用 DROP 而非 REJECT,客户端只能看到 SYN 超时,耗时与「对端宕机」完全相同,容易误判方向
  • 连接跟踪表满时新连接被静默丢弃,只在内核日志里有提示,不查 nf_conntrack_count 会完全找不到原因
  • 容器环境下在宿主机抓 em1 与容器 veth 看到的是两个视角,抓错网卡会得出「包没到」的错误结论
  • 把 TIME_WAIT 堆积当成故障并重启服务,实际它由主动关闭方产生且属正常回收过程,调 net.ipv4.tcp_tw_reuse 前需先确认复用语义

数据来源与参考

  • RFC 9293
  • Linux 网络排障实践

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌