Risposta rapida
Cosa significa Connection reset by peer (ECONNRESET) con un proxy?
Connessione ripristinata dal peer significa che l'altra estremità ha chiuso la connessione TCP bruscamente con un reset invece di una chiusura normale. Attraverso proxy residenziali CrawlRelay, le cause usuali sono una connessione keep-alive riutilizzata e scaduta, un'uscita caduta o un firewall del target che taglia le connessioni. Riprova le richieste sicure su una nuova connessione e non mantenere inattive troppe a lungo.
Connection reset by peer (ECONNRESET) a colpo d'occhio
| Errore | Connection reset by peer (ECONNRESET) |
|---|---|
| Tipo | Errore socket |
| Inviato da | Lo stack di rete, dopo che l'altro lato ha chiuso la connessione bruscamente |
| Definito in | TCP reset (RST segment): RFC 9293 |
| Riprovarlo? | Sì, per richieste sicure, su una nuova connessione |
| Prima verifica | Verifica se i reset seguono connessioni riutilizzate inattive o nuove |
Cosa significa Connection reset by peer (ECONNRESET)?
TCP può terminare una connessione in modo corretto o con un reset. Un reset indica alla tua macchina che l'altra parte ha scartato la connessione, quindi qualsiasi dato in transito è perso. Python genera ConnectionResetError; Node.js genera ECONNRESET o 'socket hang up'.
Il 'peer' è chiunque il socket contatti direttamente, ovvero il gateway proxy. Il reset può comunque originare più avanti nella catena e essere trasmesso.
Com'è a connection reset in Python, curl, Node.js e browser?
Lo stesso errore si presenta in modo diverso in ogni strumento. Questi sono i messaggi da cercare nei log:
- Python:
ConnectionResetError: [Errno 104] Connection reset by peer, o[WinError 10054]su Windows - requests:
ConnectionError(ProtocolError('Connection aborted.', ConnectionResetError(...))) - Node.js:
Error: socket hang uporead ECONNRESET - curl:
curl: (56) Recv failure: Connection reset by peer
Cosa causa a connection reset?
Probabilmente prima:
- Connessioni keep-alive scadute. Una connessione in pool è rimasta inattiva ed è stata chiusa dall’altra parte; la successiva richiesta su essa fallisce subito.
- Una uscita caduta, che termina ogni connessione che la usava.
- Un firewall del target che resetta connessioni indesiderate.
- Upload o download lunghi interrotti da un limite di inattività lungo il percorso.
Come diagnostico a connection reset passo dopo passo?
- Verifica se i reset accadono sulla prima richiesta di una connessione o dopo un riutilizzo inattivo.
- Conta i reset per host: uno significa il target; tutti indicano percorso o pool.
- Nota il timing: reset dopo esattamente N secondi inattivi indicano un limite di inattività.
# 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_URLCome risolvo a connection reset?
- Riprova richieste idempotenti (GET, HEAD) una volta su nuova connessione.
- Riduci il riutilizzo inattivo: chiudi connessioni in pool inattive da più di pochi secondi, oppure apri una nuova connessione per ogni richiesta se ti serve un nuovo IP.
- Termina una sessione sticky che resetta ripetutamente e avviane una nuova.
- Rallenta sugli host che effettuano reset sotto carico.
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 riprovare dopo a connection reset?
Riprova un reset una volta per richieste sicure come GET. Non riprovare ciecamente POST che modificano dati: la prima potrebbe essere stata processata. Una raffica di reset su un host indica che ti sta tagliando fuori; rallenta lì.
Come si applica Connection reset by peer (ECONNRESET) a CrawlRelay?
Su CrawlRelay, la rotazione avviene ad ogni nuova connessione. Un client che mantiene viva una connessione usa la stessa uscita per ogni richiesta su essa, quindi un’uscita caduta resetta la connessione. Riapri la connessione per ottenere una nuova uscita; la guida alle sessioni mostra i pattern.
Gateway: gw.crawlrelay.com, porta 7777 (HTTP, HTTPS tramite CONNECT) e porta 7778 (SOCKS5). Formato username: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Correlato: 502 Bad Gateway · Read timed out · Guida alle sessioni.
Connection reset by peer (ECONNRESET): domande frequenti dagli sviluppatori
Perché ottengo 'socket hang up' in Node.js con un proxy?
La connessione è stata chiusa prima che arrivasse una risposta. Con un proxy, le cause comuni sono un socket keep-alive riutilizzato ma scaduto, un’uscita caduta, o un target che ha tagliato la connessione. Riprova richieste GET su un nuovo socket e limita quanto a lungo i socket inattivi restano nel pool.
Un reset di connessione è segno che sono bloccato?
A volte. I firewall possono resettare connessioni da client che respingono, ma i reset accadono anche per motivi innocui su qualsiasi rete residenziale. Guarda il modello: reset limitati a un host e in aumento con il tuo ritmo di richieste indicano che l’host si difende.
Devo disabilitare il keep-alive per scraping?
Non completamente. Il keep-alive fa risparmiare tempo inviando più richieste allo stesso host tramite una stessa uscita sticky. Se vuoi un nuovo IP per ogni richiesta, una nuova connessione per richiesta è la scelta più pulita. Mischiare entrambi senza cura causa reset da connessioni scadute.
Altri errori proxy in questo riferimento
Codici di stato HTTP
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Errori del browser e client
Errori di connessione e TLS
Proxy residenziali con documentazione che copre i casi di errore
Proxy residenziali CrawlRelay da 0,50 USD/GB, traffico che non scade mai.