RST 是明确的拒绝信号
RST 的意思是立即终止连接,它不带任何协商余地,收到就说明这条连接无法继续。常见触发场景包括目标端口没有监听、收到不属于任何已有连接的报文、在已经半开的连接上收到数据、防火墙用拒绝策略回应,以及应用把 SO_LINGER 设为 0 主动关闭。收到 RST 与完全没有响应是完全不同的信号,前者说明对端或中间设备明确拒绝,后者更像被静默丢弃。
基本信息
| 端口没人监听 | 本机内核直接回 RST,客户端表现为 Connection refused |
|---|---|
| 连接已不存在 | 收到无法归属到任何连接的报文时回 RST |
| 半开连接 | 对端进程已消失,本地继续发数据会招来 RST |
| 防火墙拒绝 | 拒绝策略常回 RST;丢弃策略则表现为超时 |
| 应用主动关闭 | SO_LINGER 置 0 时关闭连接会直接发 RST 并丢弃发送缓冲 |
| 规范依据 | RFC 9293 第 3.5.2 节定义了 RST 的生成规则 |
抓 RST 并定位
抓 RST 并定位
tcpdump -nn 'tcp[tcpflags] & tcp-rst != 0' -c 20 # 只看带 RST 标志的包
tcpdump -nn -i any 'tcp port 8080 and (tcp[tcpflags] & tcp-rst != 0)' -c 10 # 只看某个端口上的 RST
ss -tan | awk '{print $1}' | sort | uniq -c # 先看各状态分布
ss -tanp state established | head # 对照当前活跃连接,判断是谁在拒绝
nc -vz -w 3 10.0.0.9 8080 # 快速判断是 refused 还是 timeout现象与含义对照
| 现象 | 网络层含义 | 处置方向 |
|---|---|---|
| Connection refused | 收到 RST | 检查端口监听、绑定地址与防火墙拒绝策略 |
| timeout 超时 | 报文被静默丢弃 | 查安全组、路由与丢弃类规则 |
| Connection reset by peer | 建连后收到 RST | 查对端进程是否崩溃或重启、LB 是否摘除后端 |
| 批量短连接大量 RST | 健康检查或连接快速关闭 | 属于可预期行为,结合连接数曲线判断 |
| RST 只出现在某个上游 | 该上游节点异常 | 逐个上游验证,必要时先摘除异常节点 |
典型使用场景
- 客户端报连接被重置,需要判断是对端崩溃还是中间设备干预
- 发布重启期间出现成批 refused,确认后端是否完成了监听恢复
- 负载均衡健康检查造成大量短连接与 RST,评估是否属于正常现象
- 容器环境里偶发 reset,排查是否由连接数限制或内核参数引起
- 排查 TLS 握手阶段被打断,判断是否由中间设备重置连接
RST 与 DROP 的区别决定了排查方向:refused 说明对端明确拒绝,要查端口与策略;timeout 说明报文被丢弃,要查安全组、路由与中间设备,两者不能按同一套思路处理。
用命令行的 -vz 探测端口时,refused 与 timeout 的提示就是 RST 与丢弃两种结果的直接映射,先用它把问题分层再去抓包,效率更高。