クイックアンサー
プロキシでのConnection reset by peer (ECONNRESET)とは何を意味していますか?
connection reset by peerとは、相手側が通常のクローズではなくリセットで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'を発生します。
「peer」とは、ソケットが直接通信する相手であり、プロキシゲートウェイを指します。リセットはその先のチェーンのどこかで発生して伝搬されることもあります。
a connection resetはPython、curl、Node.js、ブラウザではどのように表示されますか?
同じ失敗でもツールごとに異なる表示になります。ログ検索用のメッセージは以下の通りです:
- 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_URLa connection resetをどう修正しますか?
- 冪等リクエスト(GET、HEAD)を新しい接続で1回再試行する。
- アイドルの再利用時間を短くする:数秒以上アイドル状態の接続は閉じるか、新しい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(HTTP、HTTPSはCONNECT経由)、ポート7778(SOCKS5)。ユーザー名形式:USERNAME-country-{cc}-state-{state}-city-{city}-zip-{zip}-asn-{asn}-session-{id}-ttl-{minutes}。関連情報:502 Bad Gateway · Read timed out · Sessions guide。
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エラー
失敗ケースを網羅したドキュメント付きレジデンシャルプロキシ
$0.50/GB発のCrawlRelayレジデンシャルプロキシ、期限切れがないトラフィック。