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

客户端侧:本地防火墙/杀毒拦截、代理/VPN链路异常、Winsock协议栈损坏
中间链路:路由器/网关空闲超时、MTU不匹配、运营商/企业网关限流
服务端侧:安全组/WAF拦截、Nginx超时配置过小、TCP半连接队列溢出、SSL握手失败
应用层:客户端无超时重试、并发请求突增、Socket未正常关闭连接
# 刷新DNS缓存
ipconfig /flushdns
# 重置Winsock协议栈
netsh winsock reset
# 重置IP配置
netsh int ip reset
# 测试MTU分片(-f禁止分片)
ping example.com -f -l 1472
# 查看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本机=本地客户端拦截。

频繁出现连接重置大多和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
编辑 /etc/sysctl.conf,增大半连接队列,缓解高并发下RST重置:
net.core.somaxconn = 2048
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
生效:sysctl -p
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)
下面代码分为两部分:服务端(主动发送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复位包。
仅本机报错,手机热点访问正常:本地环境(防火墙、代理、Winsock)问题
同局域网所有设备报错:光猫/路由器/运营商链路问题
所有网络访问均报错:服务端WAF、安全组、Nginx或内核TCP参数问题
仅高并发场景出现:TCP队列、限流、服务性能瓶颈
CONNECTION_RESET 的本质是TCP RST包强制中断会话。优先使用抓包工具定位RST来源;普通客户端优先重置网络栈、关闭代理;服务端优化Nginx超时与内核TCP队列;开发代码层面增加超时、重试、异常捕获,规避临时网络抖动导致的连接重置。
以上就是小编给玩家们带来的教程内容,更多教程请关注趣游软件园。