服务器返回 RST(Reset)包 是 TCP 协议层主动终止连接的信号,可能由多种原因触发。以下是常见原因分类及详细说明:
一、协议层原因
连接不存在或异常
- 客户端访问未监听的端口时,服务器直接回复 RST(如
curl 192.168.1.1:9999
)。
- TCP 半开连接(一方异常崩溃后,另一方发送数据会触发 RST)。
- 客户端访问未监听的端口时,服务器直接回复 RST(如
序列号/状态不匹配
- 收到非期望的 TCP 序列号(如网络延迟导致旧数据包到达)。
- 对方在
SYN_SENT
/FIN_WAIT
等中间状态收到非法报文。
- 收到非期望的 TCP 序列号(如网络延迟导致旧数据包到达)。
快速释放资源
- 应用设置
SO_LINGER
选项且超时为0时,关闭连接直接发 RST(避免 TIME_WAIT)。
- 应用设置
二、应用层原因
服务进程崩溃或重启
- 进程退出时未正常关闭 Socket(如 Kill -9),内核代发 RST。
主动拒绝连接
// 示例:服务端代码显式发送 RST int fd = accept(...); setsockopt(fd, SOL_SOCKET, SO_LINGER, &(struct linger){ .l_onoff=1, .l_linger=0 }, sizeof(...)); close(fd); // 立即触发 RST
防护机制触发
- IDS/IPS/WAF 拦截恶意流量后强制断开。
- SYN Cookie 机制丢弃非法握手请求。
- IDS/IPS/WAF 拦截恶意流量后强制断开。
协议不兼容
- HTTP/2、WebSocket 等协议协商失败时可能回 RST。
三、运维/配置问题
防火墙/安全组规则
iptables -A INPUT -p tcp --dport 80 -j REJECT --reject-with tcp-reset
明确配置 REJECT with RST。
负载均衡器行为
- AWS ALB/Nginx upstream 在健康检查失败时对后端发 RST。
- AWS ALB/Nginx upstream 在健康检查失败时对后端发 RST。
内核参数影响
sysctl net.ipv4.tcp_abort_on_overflow=1 # SYN队列满时返回RST
四、排查工具与方法
(1)抓包分析
tcpdump -i eth0 'tcp[tcpflags] & (tcp-rst) !=0' # 捕获RST包
- Wireshark过滤语法:
tcp.flags.reset == 1
(2)系统日志关联
dmesg | grep TCP
(检查内核丢包事件)
- Nginx/Apache错误日志(如
recv() failed (104: Connection reset by peer)
)
(3)网络设备检查
- Conntrack表状态:
conntrack -L | grep RST
总结:高频场景速查表
现象 | 可能原因 | 验证方法 |
---|---|---|
端口不可达 | 服务未监听或防火墙拦截 | telnet IP PORT +抓包 |
健康检查失败 | 负载均衡器策略 | 检查LB日志 |
偶发性RST | TCP序列号漂移/中间设备干扰 | 统计RST时间规律 |
大数据传输中断 | SO_LINGER设置或进程OOM Killer | Strace跟踪进程 |
若需进一步定位,可提供具体场景(如触发时的HTTP请求、服务架构拓扑等)。
内容由零声教学AI助手提供,问题来源于学员提问