首页/网络/抓包与流量分析速查/TCP 抓不到 SYN-ACK 的原因
TCP 流分析82 条

TCP 抓不到 SYN-ACK 的原因

有 SYN 无 SYN-ACK 时逐项排查:目标端口无监听(应回 RST)、中间设备静默丢弃、服务端收到但队列满、或抓包点不覆盖回程路径。

抓不到建连应答怎么判

客户端发了 SYN 却没有收到服务端应答,是一个高频现象,但原因有四五种可能:目标端口没有进程监听(这种情况应当回重置,不是静默)、路径上被防火墙静默丢弃、服务端收到但连接队列已满、服务端回了但回程路径丢失、或者抓包点根本没覆盖到那条路径。把这些可能排成一张检查清单,按顺序核对,就能从「连不上」推到具体责任方,避免在没有证据的情况下猜。关键是每一问都要有对应位置的抓包或状态命令作支撑。

基本信息

现象有 SYN 无 SYN-ACK,也无 RST
核心手段两端抓包对照,加服务端监听与统计核对
服务端自检ss -lnt 看监听地址与端口
丢包统计netstat -s 里与 listen 相关的丢弃计数
辅助证据ICMP 不可达报文有时会伴随出现

典型使用场景

  • 用户报连接超时:先确认是没发出、没到达还是没回应
  • 策略变更后验证:确认新策略是否真的放行了目标端口
  • 排查负载均衡后的服务:确认请求是否被转发到后端
  • 核实队列压力:服务端收到大量 SYN 却不回应
  • 定位回程问题:服务端确认已回应而客户端没收到

排查顺序

排查顺序
# 第 1 步:服务端是否在监听,监听地址是否覆盖该来源
ess -lnt | grep ':443'
# 第 2 步:服务端抓包是否看到 SYN
tcpdump -i eth0 -nn 'tcp[tcpflags] = tcp-syn and dst port 443' -c 10
# 第 3 步:服务端是否发出应答
tcpdump -i eth0 -nn 'tcp[tcpflags] = tcp-syn|tcp-ack and src port 443' -c 10
# 第 4 步:客户端侧是否收到应答
tcpdump -i eth0 -nn 'src port 443 and tcp[tcpflags] & tcp-syn != 0' -c 10

结论与对应责任方

观察结果结论下一步
服务端没看到 SYN请求在路径上被丢弃核对中间设备策略与会话表
服务端看到 SYN 但未回应监听异常或队列已满核对监听状态与内核丢弃计数
服务端已回应而客户端没收到回程路径丢失查反向链路与客户端侧策略
客户端收到重置目标端口无监听或被明确拒绝核对端口与策略配置
两端都没有任何报文抓包点不覆盖该路径重新确定抓包位置
看到 ICMP 不可达报文能显著加快定位:它通常携带被拒绝的原始报文片段,直接指出是哪一跳、以什么原因拒绝了连接,比仅看 SYN 超时信息量更大。
单向抓包点的「没有看到」不等于「没有发生」。抓包点位置决定了你能得出什么结论,跨设备排查务必先固定两侧抓包位置并核对时钟。

服务端侧统计核对

服务端侧统计核对
netstat -s | grep -i -A2 listen        # 因队列满而丢弃的建连计数
sysctl net.core.somaxconn net.ipv4.tcp_max_syn_backlog   # 队列相关参数
ss -s | head -5                        # 连接总体状态分布

判读要点

  • 服务端收到 SYN 却看不到应答时,优先核对监听地址是否绑定到了正确的网卡
  • 容器或虚拟化环境中要抓容器网卡,宿主机上桥接口的报文视角不同
  • 负载均衡后端不应答时,先确认请求是否真的被转发到了后端节点
  • 只有个别客户端超时,优先查这些客户端的出口链路与本地策略,而不是服务端

易错点

  • 把单向抓包的缺失当作事实,得出服务端未响应的错误结论
  • 只检查监听端口不检查监听地址,服务可能只绑定了回环或内网地址
  • 忽略队列溢出造成的静默丢弃,现象与策略拦截完全一样
  • 在容器环境中抓宿主机物理网卡,看不到容器转发后的报文
  • 两端抓包未校时,无法把同一时刻的报文对应起来

数据来源与参考

  • RFC 9293(TCP)
  • RFC 792(ICMP 不可达)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌