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