徐中民 2025-07-14 16:05 采纳率: 98.9%
浏览 22
已采纳

问题:**[Errno 104] ECONNRESET 是什么?如何解决?**

**问题描述:** 在进行网络编程或使用 Python 的 socket、requests 等库时,经常会遇到报错信息:`[Errno 104] ECONNRESET`。这个错误表示**对端(服务器或客户端)异常关闭了连接**,导致当前端在读写时发现连接已被重置。常见于 HTTP 请求、WebSocket 通信、长连接服务等场景。该问题可能由服务器崩溃、超时断开、主动关闭连接或防火墙干预等多种原因造成。理解其成因并掌握排查与应对策略,是保障网络通信稳定的关键。
  • 写回答

1条回答 默认 最新

  • 大乘虚怀苦 2025-07-14 16:05
    关注

    1. 现象描述

    [Errno 104] ECONNRESET 是 Linux/Unix 系统中 socket 编程中的一个常见错误码,表示“Connection reset by peer”。在 Python 的 socket、requests 或其他基于 TCP 协议的网络库中,当程序试图读写一个已经被对端异常关闭的连接时,就会触发该错误。

    例如,在使用 requests.get() 发起 HTTP 请求时,如果服务器在返回响应之前主动断开连接,客户端会抛出如下异常:

    requests.exceptions.ConnectionError: [Errno 104] ECONNRESET

    2. 错误本质

    ECONNRESET 属于系统级错误码,其值为 104。它通常发生在以下几种情况:

    • 对方主机强制关闭了连接(如进程崩溃)
    • TCP 连接被防火墙或代理设备中断
    • 服务器端设置了超时机制,长时间未收到数据后主动断开连接
    • SSL/TLS 握手失败或证书问题导致连接中断

    从协议层面看,ECONNRESET 是由 TCP 协议栈发出的一个 RST(Reset)标志位引起的。当接收方收到 RST 包时,内核会立即终止当前连接,并向用户态程序报告 ECONNRESET 错误。

    3. 常见场景与排查流程

    以下是几个典型场景及其排查思路:

    场景可能原因排查建议
    HTTP 请求服务器提前关闭连接、负载过高、反爬策略检查服务端日志,增加重试逻辑,设置合理超时时间
    WebSocket 通信心跳机制失效、连接空闲超时、Nginx 配置不当启用心跳包,配置 proxy_read_timeout,捕获异常并重新连接
    长连接服务连接池未复用、中间件配置错误、TCP Keepalive 未启用启用 keepalive,优化连接池策略,监控连接状态

    排查流程图如下:

    graph TD A[收到 ECONNRESET 异常] --> B{是否频繁发生?} B -- 是 --> C[检查服务端日志] B -- 否 --> D[临时网络波动] C --> E[查看是否有异常堆栈] C --> F[检查防火墙/Nginx规则] E --> G[修复服务端代码] F --> H[调整中间件配置]

    4. 解决方案与最佳实践

    针对不同的使用场景,可以采取如下策略来缓解或避免 ECONNRESET 错误:

    1. 增加请求重试机制:在网络不稳定或偶发故障的情况下,适当加入重试逻辑可提高健壮性。
    2. 设置合理的超时时间:避免因等待响应太久而引发连接中断。
    3. 启用 TCP Keepalive:用于检测死连接,适用于长连接服务。
    4. 使用连接池管理连接:如 requests.Session(),减少重复握手开销。
    5. 处理 SSL/TLS 握手异常:确保证书有效,支持现代加密套件。
    6. 优化中间件配置:如 Nginx 设置 proxy_read_timeoutproxy_send_timeout

    示例代码:使用 requests 捕获异常并进行重试

    import requests
    from requests.adapters import HTTPAdapter
    from urllib3.util.retry import Retry
    
    session = requests.Session()
    retries = Retry(total=5, backoff_factor=1, status_forcelist=[500, 502, 503, 504])
    session.mount('https://', HTTPAdapter(max_retries=retries))
    
    try:
        response = session.get('https://example.com')
    except requests.exceptions.ConnectionError as e:
        print("Connection error occurred:", e)

    5. 监控与自动化预警

    对于生产环境中的网络服务,应建立完善的监控体系,及时发现和定位 ECONNRESET 问题:

    • 记录每次连接异常发生的频率和上下文信息
    • 集成到 Prometheus + Grafana 等监控平台,设置阈值告警
    • 利用日志分析工具(如 ELK Stack)识别高频异常来源
    • 自动触发运维动作,如重启服务、切换节点等

    通过这些手段,可以将原本被动的问题发现过程转化为主动预警机制,从而提升整体系统的稳定性与可靠性。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 7月14日