Kort antwoord
Wat betekent Connection reset by peer (ECONNRESET) bij een proxy?
Connection reset by peer betekent dat de andere kant de TCP-verbinding abrupt heeft verbroken met een reset in plaats van een normale sluiting. Via CrawlRelay residentiële proxies zijn de gebruikelijke oorzaken een hergebruikte keep-alive verbinding die verlopen is, een wegvallende exit, of een firewall bij het doel die verbindingen doorsnijdt. Probeer veilige verzoeken opnieuw op een nieuwe verbinding en houd idle verbindingen niet te lang open.
Connection reset by peer (ECONNRESET) in één oogopslag
| Fout | Connection reset by peer (ECONNRESET) |
|---|---|
| Type | Socketfout |
| Verzonden door | De netwerkstack, nadat de andere kant de verbinding abrupt heeft gesloten |
| Gedefinieerd in | TCP reset (RST segment): RFC 9293 |
| Opnieuw proberen? | Ja, voor veilige verzoeken, op een nieuwe verbinding |
| Eerst controleren | Bekijk of resets volgen op niet-gebruikte hergebruikte verbindingen of nieuwe |
Wat betekent Connection reset by peer (ECONNRESET)?
TCP kan een verbinding netjes beëindigen of met een reset. Een reset vertelt je systeem dat de andere kant de verbinding heeft weggegooid, waardoor alle data in transit verloren gaat. Python genereert ConnectionResetError; Node.js geeft ECONNRESET of 'socket hang up'.
De 'peer' is degene met wie je socket direct praat, namelijk de proxy-gateway. De reset kan nog steeds verderop in de keten ontstaan en worden doorgegeven.
Hoe ziet a connection reset eruit in Python, curl, Node.js en browsers?
Dezelfde fout verschijnt anders in elk hulpmiddel. Dit zijn de berichten om in je logs te zoeken:
- Python:
ConnectionResetError: [Errno 104] Connection reset by peer, of[WinError 10054]op Windows - requests:
ConnectionError(ProtocolError('Connection aborted.', ConnectionResetError(...))) - Node.js:
Error: socket hang upofread ECONNRESET - curl:
curl: (56) Recv failure: Connection reset by peer
Wat veroorzaakt a connection reset?
Waarschijnlijk eerst:
- Verlopen keep-alive verbindingen. Een verbinding uit de pool lag ongebruikt en werd aan de andere kant gesloten; het volgende verzoek daarop mislukt direct.
- Een wegvallende exit, die iedere verbinding beëindigt die hem gebruikte.
- Een firewall bij het doel die verbindingen reset die hij niet toestaat.
- Lange uploads of downloads die afgebroken worden door een idle limiet ergens op het pad.
Hoe diagnosticeer ik a connection reset stap voor stap?
- Controleer of resets plaatsvinden bij het eerste verzoek van een verbinding of na idle hergebruik.
- Tel het aantal resets per host: één host betekent het doel; alle hosts wijzen op het pad of de pool.
- Let op de timing: resets na precies N seconden idle wijzen op een idle limiet.
# 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_URLHoe los ik a connection reset op?
- Probeer idempotente verzoeken opnieuw (GET, HEAD) eenmaal op een nieuwe verbinding.
- Verkort het idle hergebruik: sluit gepoolde verbindingen die langer dan enkele seconden inactief zijn, of open per verzoek een nieuwe verbinding als je toch een nieuw IP wilt.
- Beëindig een sticky sessie die steeds reset en start een nieuwe.
- Vertraag op hosts die onder belasting resetten.
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))Moet ik opnieuw proberen na a connection reset?
Probeer een reset eenmaal opnieuw voor veilige verzoeken zoals GET. Herhaal niet blindelings POST verzoeken die data wijzigen: het eerste verzoek kan al verwerkt zijn. Een reeks resets op een host betekent dat die host je afsnijdt; verlaag daar het tempo.
Hoe geldt Connection reset by peer (ECONNRESET) voor CrawlRelay?
Bij CrawlRelay draait rotatie om iedere nieuwe verbinding. Een client die één verbinding openhoudt, houdt dezelfde exit voor elk verzoek daarop, dus een wegvallende exit reset die verbinding. Open de verbinding opnieuw om een verse exit te krijgen; de sessions guide laat patronen zien.
Gateway: gw.crawlrelay.com, poort 7777 (HTTP, HTTPS via CONNECT) en poort 7778 (SOCKS5). Gebruikersnaamformaat: USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}. Gerelateerd: 502 Bad Gateway · Read timed out · Sessions guide.
Connection reset by peer (ECONNRESET): vragen die ontwikkelaars stellen
Waarom krijg ik 'socket hang up' in Node.js met een proxy?
De verbinding sloot voordat een antwoord arriveerde. Bij gebruik van een proxy zijn gangbare oorzaken een hergebruikte keep-alive socket die verlopen is, een wegvallende exit, of een doel dat de verbinding verbrak. Probeer GET verzoeken opnieuw op een nieuwe socket en beperk hoe lang idle sockets in de pool blijven.
Is een connection reset een teken dat ik geblokkeerd word?
Soms. Firewalls kunnen verbindingen resetten van clients die ze weigeren, maar resets gebeuren ook om onschuldige redenen op elke residentiële netwerk. Bekijk het patroon: resets beperkt tot één host en stijgend met het aantal verzoeken suggereren dat die host tegenwerkt.
Moet ik keep-alive uitschakelen voor scraping?
Niet helemaal. Keep-alive bespaart tijd bij het sturen van meerdere verzoeken naar dezelfde host via één sticky exit. Wil je voor elk verzoek een nieuw IP, dan is een nieuwe verbinding per verzoek schoner. Onzorgvuldig beide mixen veroorzaakt verlopen verbinding resets.
Andere proxyfouten in deze referentie
HTTP-statuscodes
- 401 Unauthorized vs 407
- 403 Forbidden
- 407 Proxy Authentication Required
- 429 Too Many Requests
- 502 Bad Gateway
- 503 Service Unavailable
- 504 Gateway Timeout
Browser- en clientfouten
Verbindings- en TLS-fouten
Residentiële proxy's met documentatie die de faalgevallen beschrijft
CrawlRelay residentiële proxy's van US$ 0,50/GB, verkeer dat nooit verloopt.