Resposta rápida
O que Connection reset by peer (ECONNRESET) significa com um proxy?
Conexão resetada pelo par significa que o outro lado fechou a conexão TCP abruptamente, com um reset ao invés de um fechamento normal. Através dos proxies residenciais do CrawlRelay, as causas comuns são uma conexão keep-alive reutilizada que ficou obsoleta, uma saída que caiu ou um firewall do destino que corta conexões. Refaça requisições seguras em uma nova conexão e não mantenha conexões ociosas por muito tempo.
Connection reset by peer (ECONNRESET) de relance
| Erro | Connection reset by peer (ECONNRESET) |
|---|---|
| Tipo | Erro de socket |
| Enviado por | A pilha de rede, depois que o outro lado fechou a conexão abruptamente |
| Definido em | TCP reset (RST segment): RFC 9293 |
| Tentar novamente? | Sim, para requisições seguras, em uma nova conexão |
| Primeira verificação | Verifique se os resets ocorrem após conexões reutilizadas ociosas ou em conexões novas |
O que Connection reset by peer (ECONNRESET) significa?
O TCP pode encerrar uma conexão graciosamente ou com um reset. Um reset informa à sua máquina que o outro lado descartou a conexão, então qualquer dado em trânsito é perdido. Python gera ConnectionResetError; Node.js gera ECONNRESET ou 'socket hang up'.
"Par" é quem seu socket contata diretamente, que é o gateway proxy. O reset pode se originar mais adiante na cadeia e ser repassado.
Como a connection reset aparece em Python, curl, Node.js e navegadores?
A mesma falha aparece de forma diferente em cada ferramenta. Estas são as mensagens para buscar nos seus logs:
- Python:
ConnectionResetError: [Errno 104] Connection reset by peer, ou[WinError 10054]no Windows - requests:
ConnectionError(ProtocolError('Connection aborted.', ConnectionResetError(...))) - Node.js:
Error: socket hang upouread ECONNRESET - curl:
curl: (56) Recv failure: Connection reset by peer
O que causa a connection reset?
Mais provável inicialmente:
- Conexões keep-alive obsoletas. Uma conexão em pool ficou ociosa e foi fechada no outro lado; a próxima requisição nessa conexão falha imediatamente.
- Uma saída derrubada, que encerra todas as conexões que a usavam.
- Um firewall no destino que reseta conexões que não gosta.
- Uploads ou downloads longos cortados por um limite de inatividade em algum ponto do caminho.
Como diagnosticar a connection reset passo a passo?
- Verifique se os resets acontecem na primeira requisição de uma conexão ou após reutilização ociosa.
- Conte os resets por host: um host indica o destino; todos os hosts indicam o caminho ou o pool.
- Observe o tempo: resets após exatamente N segundos ociosos indicam um limite de ociosidade.
# 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_URLComo corrigir a connection reset?
- Refaça requisições idempotentes (GET, HEAD) uma vez em uma nova conexão.
- Reduza a reutilização ociosa: feche conexões em pool que ficaram ociosas por mais de alguns segundos, ou abra uma nova conexão por requisição quando você precisa de um novo IP de qualquer forma.
- Encerre uma sessão fixa que reseta repetidamente e inicie uma nova.
- Desacelere em hosts que resetam sob carga.
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))Devo tentar novamente após a connection reset?
Refaça um reset uma vez para requisições seguras como GET. Não repita automaticamente requisições POST que alteram dados: a primeira pode já ter sido processada. Uma série de resets em um host significa que ele está cortando sua conexão; diminua o ritmo lá.
Como Connection reset by peer (ECONNRESET) se aplica ao CrawlRelay?
No CrawlRelay, a rotação acontece por nova conexão. Um cliente que mantém uma conexão viva mantém a mesma saída em todas as requisições nela, então uma saída derrubada reseta essa conexão. Abra a conexão novamente para obter uma saída nova; o guia de sessões mostra os padrões.
Gateway: gw.crawlrelay.com, porta 7777 (HTTP, HTTPS via CONNECT) e porta 7778 (SOCKS5). Formato do usuário: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Relacionado: 502 Bad Gateway · Read timed out · Guia de sessões.
Connection reset by peer (ECONNRESET): perguntas que desenvolvedores fazem
Por que recebo 'socket hang up' em Node.js com um proxy?
A conexão foi fechada antes da resposta chegar. Com proxy, causas comuns são um socket keep-alive reutilizado que ficou obsoleto, uma saída derrubada ou um destino que cortou a conexão. Refaça requisições GET em um socket novo e limite o tempo que sockets ociosos ficam no pool.
Um reset de conexão é sinal de que estou bloqueado?
Às vezes. Firewalls podem resetar conexões de clientes que rejeitam, mas resets também ocorrem por motivos inofensivos em qualquer rede residencial. Veja o padrão: resets limitados a um host e que crescem com sua taxa de requisições indicam que o host está bloqueando.
Devo desabilitar keep-alive para scraping?
Não completamente. Keep-alive economiza tempo quando você envia várias requisições ao mesmo host por uma saída fixa. Quando você quer um IP novo em cada requisição, uma nova conexão por requisição é a escolha mais limpa. Misturar ambos sem cuidado produz resets por conexão obsoleta.
Outros erros de proxy nesta referência
Códigos de status HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Erros no navegador e cliente
Erros de conexão e TLS
Proxies residenciais com documentação que cobre os casos de falha
CrawlRelay proxies residenciais a partir de US$ 0,50/GB, tráfego que nunca expira.