首 页
手机版

CONNECTION_RESET报错怎么办?CONNECTION_RESET连接重置错误原因、排查与解决方法

发布时间:2026-10-01 19:35:57

ERR_CONNECTION_RESET / connection reset by peer 是TCP层RST复位包引发的常见网络错误:TCP连接建立成功后,通信一方主动发送RST包强制断开会话,而非正常四次挥手关闭。浏览器、后端接口、Socket程序都会出现该报错。

d5269c09-a582-40ee-a86f-bd4659071550.png

一、报错核心成因

  • 客户端侧:本地防火墙/杀毒拦截、代理/VPN链路异常、Winsock协议栈损坏

  • 中间链路:路由器/网关空闲超时、MTU不匹配、运营商/企业网关限流

  • 服务端侧:安全组/WAF拦截、Nginx超时配置过小、TCP半连接队列溢出、SSL握手失败

  • 应用层:客户端无超时重试、并发请求突增、Socket未正常关闭连接

二、快速排查命令

Windows(管理员CMD)

# 刷新DNS缓存
ipconfig /flushdns

# 重置Winsock协议栈
netsh winsock reset

# 重置IP配置
netsh int ip reset

# 测试MTU分片(-f禁止分片)
ping example.com -f -l 1472

Linux 服务器

# 查看TCP连接状态
ss -ti

# tcpdump抓包筛选443端口,保存pcap,后续Wireshark分析RST包
tcpdump -i any port 443 -w reset.pcap

# 查看内核TCP参数
sysctl net.core.somaxconn

抓包后使用Wireshark过滤:tcp.flags.reset==1,根据RST包源IP判断故障点:源IP为服务器=服务端问题;源IP为网关=链路问题;源IP本机=本地客户端拦截。

1ab29f51-0c5b-4618-8000-514399afe9f0.png

三、服务端修复案例

案例1:Nginx 优化解决连接重置

频繁出现连接重置大多和keepalive、缓冲区配置相关。修改nginx.conf:

http {
   keepalive_timeout 65;
   keepalive_requests 100;
   client_body_buffer_size 10M;
   client_header_buffer_size 4k;
   large_client_header_buffers 4 16k;

   server {
       listen 443 ssl;
       server_name example.com;
       ssl_certificate fullchain.pem;
       ssl_certificate_key privkey.pem;
       ssl_session_cache shared:SSL:10m;
   }
}

校验并重载Nginx:nginx -t && nginx -s reload

案例2:Linux内核TCP参数调优

编辑 /etc/sysctl.conf,增大半连接队列,缓解高并发下RST重置:

net.core.somaxconn = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1

生效:sysctl -p

四、Python 代码案例

案例1:requests 带自动重试,处理 connection reset by peer

import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def get_retry_session():
   retry_opts = Retry(
       total=3,
       backoff_factor=1,
       allowed_methods=["GET", "POST"]
   )
   adapter = HTTPAdapter(max_retries=retry_opts)
   session = requests.Session()
   session.mount("https://", adapter)
   session.mount("http://", adapter)
   return session

if __name__ == "__main__":
   session = get_retry_session()
   try:
       resp = session.get("https://example.com/api", timeout=10)
       print(resp.status_code)
   except requests.exceptions.ConnectionError as e:
       print("连接重置/网络异常:", e)

案例2:原生Socket极简示例,复现 connection reset by peer

下面代码分为两部分:服务端(主动发送RST,强制断开连接) 和 客户端(读取数据触发 connection reset by peer)。 > 注意:仅用于本地测试学习,不要在公网环境运行。

服务端代码(server.py):

import socket

def start_server():
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
   s.bind(("127.0.0.1", 8888))
   s.listen(1)
   print("服务端监听 127.0.0.1:8888")
   conn, addr = s.accept()
   print("客户端已连接", addr)
   # 直接关闭底层socket,不优雅关闭,会发送RST包
   conn.close()
   s.close()

if __name__ == "__main__":
   start_server()

客户端代码(client.py):

import socket

def start_client():
   s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
   s.connect(("127.0.0.1", 8888))
   try:
       # 服务端已经RST断开,读取会抛出 connection reset by peer
       data = s.recv(1024)
   except OSError as e:
       print("捕获异常:", e)
       # 输出: [Errno 104] Connection reset by peer
   finally:
       s.close()

if __name__ == "__main__":
   start_client()

运行方式:先启动 server.py,再启动 client.py。客户端 recv 时直接抛出 [Errno 104] Connection reset by peer,也就是 CONNECTION_RESET。 原理:服务端调用 close 后没有等待四次挥手,直接释放连接,向客户端发送TCP RST复位包。

五、故障定位判断逻辑

  1. 仅本机报错,手机热点访问正常:本地环境(防火墙、代理、Winsock)问题

  2. 同局域网所有设备报错:光猫/路由器/运营商链路问题

  3. 所有网络访问均报错:服务端WAF、安全组、Nginx或内核TCP参数问题

  4. 仅高并发场景出现:TCP队列、限流、服务性能瓶颈

CONNECTION_RESET 的本质是TCP RST包强制中断会话。优先使用抓包工具定位RST来源;普通客户端优先重置网络栈、关闭代理;服务端优化Nginx超时与内核TCP队列;开发代码层面增加超时、重试、异常捕获,规避临时网络抖动导致的连接重置。


以上就是小编给玩家们带来的教程内容,更多教程请关注趣游软件园。