快速回答
代理中的Connection reset by peer (ECONNRESET)是什么意思?
连接被对等方重置 意味着对端以重置代替正常关闭,突然关闭了 TCP 连接。通过 CrawlRelay 住宅代理,常见原因是复用的保持活动连接变陈旧、出口被断开,或目标防火墙切断连接。在新连接上重试安全请求,且不要让闲置连接保持过久。
Connection reset by peer (ECONNRESET)一览
| 错误 | Connection reset by peer (ECONNRESET) |
|---|---|
| 类型 | 套接字错误 |
| 发送方 | 网络栈在对端突然关闭连接后出现的问题 |
| 定义于 | TCP reset (RST segment): RFC 9293 |
| 要重试吗? | 是的,对于安全请求,使用新连接时会有此情况 |
| 先检查 | 查看重置是发生在闲置复用连接之后还是新连接上 |
Connection reset by peer (ECONNRESET)是什么意思?
TCP 可以被正常关闭或重置。重置告诉你的机器对端丢弃了连接,正在传输的数据都会丢失。Python 会抛出ConnectionResetError;Node.js 抛出 ECONNRESET 或 “socket hang up”。
“对等方”是指你的套接字直接通信的对象,即代理网关。重置仍可能起源于链路更远端并被传递过来。
在Python、curl、Node.js和浏览器中a connection reset是什么样?
每个工具中相同的失败会有不同的提示信息。请在日志中搜索以下信息:
- Python:
ConnectionResetError: [Errno 104] Connection reset by peer,或在 Windows 上为[WinError 10054] - requests:
ConnectionError(ProtocolError('Connection aborted.', ConnectionResetError(...))) - Node.js:
Error: socket hang up或read ECONNRESET - curl:
curl: (56) Recv failure: Connection reset by peer
导致a connection reset的原因是什么?
最可能的首要原因:
- 陈旧的保持活动连接。 连接池中的连接闲置后被对端关闭,下一次请求立即失败。
- 一个断开的出口, 会终止所有通过它的连接。
- 目标防火墙, 会重置它不允许的连接。
- 长时间上传或下载, 被链路某处的闲置限制切断。
如何一步步诊断a connection reset?
- 检查重置是发生在连接的首次请求还是闲置复用后。
- 按主机统计重置次数:单个主机表示目标;所有主机均出现则是路径或连接池问题。
- 注意时间:恰好空闲 N 秒后发生的重置指示闲置限制。
# Use the URL that fails; with https://api.ipify.org instead, you test the gateway alone.
# "HTTP/1.1 200 Connection established" first, then the site's own status: the site answered.
curl -v -x http://USERNAME:[email protected]:7777 https://TARGET_URL
# Same test through the SOCKS5 port, with DNS resolved at the exit
curl -v --socks5-hostname gw.crawlrelay.com:7778 --proxy-user USERNAME:PASSWORD https://TARGET_URL如何修复a connection reset?
- 在新连接上重试幂等请求(GET,HEAD)一次。
- 缩短闲置复用时间: 关闭闲置超过几秒的连接池连接,或在需要新 IP 时每次请求打开新连接。
- 结束反复重置的粘性会话, 重新开启新会话。
- **在会重置的主机上放慢请求速度。
import random
import time
import requests
PROXY = "http://USERNAME:[email protected]:7777"
PROXIES = {"http": PROXY, "https": PROXY}
RETRY_STATUSES = {429, 502, 503, 504}
def fetch(url, attempts=5, timeout=(10, 30)):
for attempt in range(attempts):
try:
r = requests.get(url, proxies=PROXIES, timeout=timeout)
except (requests.exceptions.ConnectionError, requests.exceptions.Timeout):
r = None # dropped exit, reset or timeout: a new connection gets a new exit
if r is not None and r.status_code not in RETRY_STATUSES:
return r
retry_after = r.headers.get("Retry-After", "") if r is not None else ""
if retry_after.isdigit():
wait = int(retry_after)
else:
wait = min(60, 2 ** attempt) + random.uniform(0, 1)
time.sleep(wait)
raise RuntimeError("giving up on %s after %d attempts" % (url, attempts))遇到a connection reset后要重试吗?
对于安全请求如 GET,可重试一次重置。不要盲目重试可能修改数据的 POST 请求:第一次可能已经被处理。某一主机上的高频重置表示该主机切断了连接;应降低请求速度。
Connection reset by peer (ECONNRESET)如何应用于CrawlRelay?
在 CrawlRelay,轮换发生于每个新连接。保持一个连接活跃的客户端每个请求都用同一出口,因此断开出口会导致该连接重置。重新打开连接以获取新的出口;会话指南说明相关模式。
网关:gw.crawlrelay.com,端口7777(通过CONNECT的HTTP、HTTPS)和端口7778(SOCKS5)。用户名格式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。相关内容:502 错误网关 · 读取超时 · 会话指南。
Connection reset by peer (ECONNRESET):开发者常问的问题
为什么我在使用代理时在 Node.js 中看到 “socket hang up”?
响应到来之前连接被关闭。使用代理时,常见原因是复用的保持活动套接字陈旧、断开的出口或目标切断连接。在新套接字上重试 GET 请求,并限制套接字在连接池中的闲置时间。
连接重置意味着我被封锁了吗?
有时是。防火墙可以重置它们拒绝的客户端连接,但在任何住宅网络上无害原因也会导致重置。观察模式:重置仅限于某主机且随请求速率增多,表明主机在拒绝连接。
抓取时应禁用保持活动连接吗?
不完全是。保持活动连接在通过同一粘性出口向同一主机发送多请求时节约时间。若想每次请求使用新 IP,则每个请求新建连接是更合理的选择。混用这两种方式往往导致陈旧连接重置。
本参考中的其他代理错误
HTTP 状态码
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
浏览器和客户端错误
连接和 TLS 错误
带有涵盖失败案例文档的住宅代理
来自US$0.50/GB的CrawlRelay住宅代理,流量永不过期。