首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

我在尝试抓取时ConnectionResetError:[Errno 54]连接被对等重置

基础概念

ConnectionResetError: [Errno 54] 是一个常见的网络错误,表示在尝试建立或维持网络连接时,连接被对端(服务器)重置。这通常发生在以下几种情况:

  1. 服务器端主动关闭连接:服务器可能因为各种原因(如负载过高、安全策略、请求超时等)主动关闭连接。
  2. 网络问题:中间网络设备(如路由器、防火墙)可能因为各种原因(如网络拥塞、配置错误等)重置连接。
  3. 客户端问题:客户端可能在短时间内发送大量请求,导致服务器或中间设备认为这是攻击行为而重置连接。

相关优势、类型、应用场景

类型

  • 客户端重试:在客户端实现重试机制,当遇到连接重置错误时,自动重新发起请求。
  • 连接池:使用连接池管理连接,减少频繁建立和关闭连接的开销。
  • 超时设置:合理设置请求超时时间,避免长时间等待导致连接被重置。

应用场景

  • Web爬虫:在抓取网页时,可能会遇到各种网络问题,需要处理连接重置错误。
  • API调用:在调用远程API时,可能会因为网络问题导致连接被重置。
  • 实时通信:在实时通信应用中,连接重置错误可能导致消息丢失或延迟。

解决方法

1. 客户端重试机制

代码语言:txt
复制
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def requests_retry_session(
    retries=3,
    backoff_factor=0.3,
    status_forcelist=(500, 502, 503, 504, 408),
    session=None,
):
    session = session or requests.Session()
    retry = Retry(
        total=retries,
        read=retries,
        connect=retries,
        backoff_factor=backoff_factor,
        status_forcelist=status_forcelist,
    )
    adapter = HTTPAdapter(max_retries=retry)
    session.mount('http://', adapter)
    session.mount('https://', adapter)
    return session

try:
    response = requests_retry_session().get('https://example.com')
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

2. 使用连接池

代码语言:txt
复制
import requests
from requests.adapters import HTTPAdapter

session = requests.Session()
adapter = HTTPAdapter(pool_connections=100, pool_maxsize=100)
session.mount('http://', adapter)
session.mount('https://', adapter)

try:
    response = session.get('https://example.com')
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

3. 设置合理的超时时间

代码语言:txt
复制
import requests

try:
    response = requests.get('https://example.com', timeout=(3.05, 27))
    response.raise_for_status()
except requests.exceptions.RequestException as e:
    print(f"Error: {e}")

参考链接

通过以上方法,可以有效减少或避免ConnectionResetError: [Errno 54]错误的发生,提高网络请求的稳定性和可靠性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • Py异常处理

    就像写函数肯定是判断异常处理,然后写业务逻辑代码,这样代码才更健壮。 每当发生让Python不知所措的错误时,它都会创建一个异常对象。...| ±- ConnectionError # 与连接相关的异常的基类 | | ±- BrokenPipeError # 另一端关闭尝试写入管道或试图已关闭写入的套接字上写入 | | ±- ConnectionAbortedError...# 连接尝试对等方中止 | | ±- ConnectionRefusedError # 连接尝试对等方拒绝 | | ±- ConnectionResetError # 连接对等重置 | ±-...()) | ±- PermissionError # 尝试没有足够访问权限的情况下运行操作 | ±- ProcessLookupError # 给定进程不存在 | ±- TimeoutError #...下面创建了一个MyError类,基类为Exception,用于异常触发输出更多的信息。

    1.5K30

    深入剖析Linux网络设计中网络IO的重要角色

    失败返回的错误码: 错误码 含义 EACCES,EPERM 用户未启用套接字广播标志的情况下尝试连接到广播地址,或者由于本地防火墙规则,连接请求失败。 EADDRINUSE 本地地址已在使用中。...EADDRNOTAVAIL 套接字未绑定到地址,尝试将其绑定到临时端口,确定临时端口范围内的所有端口号当前都在使用中。...例如,尝试将UNIX域数据报套接字连接到流套接字,可能会发生此错误。 ETIMEDOUT 尝试连接超时。服务器可能太忙,无法接受新连接。...EAGAIN sockfd引用的套接字以前未绑定到地址,尝试将其绑定到临时端口,确定临时端口范围内的所有端口号当前都在使用中。 EBADF 指定的描述符无效。...EconReset 对等重置连接。 EDESTADDRREQ 套接字不是连接模式,并且未设置对等地址。 EFAULT 为参数指定了无效的用户空间地址。 EINTR 传输任何数据之前发生的信号。

    9220

    socket rst_socket通信编程

    大家好,又见面了,是你们的朋友全栈君。 产生RST的三个条件: 1. 目的地为某端口的SYN到达,然而该端口上没有正在监听的服务器; 2. TCP想取消一个已有的连接; 3....此时还是可以write 给server的,write调用只负责把数据交给TCP发送缓冲区就可以成功返回了,所以不会出错,而server收到数据后应答一个RST段,表示服务器已经不能接收数据,连接重置,client...当一个进程向某个已收到RST的套接字执行写操作,(此时写操作返回EPIPE错误)内核向该进程发送一个SIGPIPE信号,该信号的默认行为是终止进程,因此进程必须捕获它以免不情愿地终止; 继续修改客户端程序如下...= 54 #defineECONNRESET 54/* Connection reset by peer */ 当一个进程向某个已收到RST的套接字执行读操作,(此时读操作返回ECONNRESET...错误) 抓包信息如下: 上述情况会引发一个问题:服务器主机进程终止或者崩溃后重启,客户端不write的情况下不会知道,read会返回ECONNRESET错误或者超时; 解决方法用select: 1.

    1.7K30

    Socket Sendto 可以传入不同的目的地址吗

    如果已经预先指定了一个对等地址,则该消息要么发送到由dest_addr指定的地址(覆盖预先指定的对等地址),或者该函数应返回-1并将errno设置为[EISCONN] 如果是连接模式,则dest_addr...数据报可以每次输出操作发送到指定的地址(可能是多播或者广播),可能会从多个源接收到数据报。当接收数据报时,每个数据报的源地址是可以获知的。...相反,您希望sendto和recvfrom系统调用的每个对等方中使用单个未连接的UDP套接字,以便为每个数据包发送和接收具有不同地址的数据包。...启动,您的对等体将创建一个套接字并将其绑定到INADDR_ANY(允许它接收任何接口上的数据包或机器上的广播地址)以及分配给您的特定端口或端口0(允许操作系统选择任何未使用的端口)。...3.是UDP连接,但没有connect过,直接往当前to的地址发送。 对于 lwip 和 zephyr 的处理,也许有一些还没研究到的地方。

    1.7K21

    linux网络编程中的errno处理

    accept接收tcp连接的过程中,可能会遇到以下errno:EAGAIN或EWOULDBLOCK:表示当前没有连接可以接受,非阻塞模式下可以继续尝试接受连接ECONNABORTED:表示连接因为某种原因被终止...,可以重新尝试接受连接EINTR:表示系统调用中断,可以重新尝试接受连接EINVAL:表示套接字不支持接受连接操作,需要检查套接字是否正确其中 EINTR、EAGAIN与EWOULDBLOCK,表示可能遇到了系统中断...EISCONN:表示套接字已经连接,无需再次连接EINTR:表示系统调用中断,可以重新尝试连接ENETUNREACH:表示网络不可达,需要检查网络连接是否正常其中 EINPROGRESS、EALREADY...连接的读写在 Linux 网络编程中,连接读写阶段可能会遇到以下 errno:EINTR:表示系统调用中断,可以重新尝试读写EAGAIN 或 EWOULDBLOCK:表示当前没有数据可读或没有缓冲区可写...,需要等待下一次读写事件再尝试读写,非阻塞模式下可以继续尝试读写ECONNRESET 或 EPIPE:表示连接重置或对端关闭了连接,需要重新建立连接ENOTCONN:表示连接未建立或已断开,需要重新建立连接

    5.5K30

    使用WebRTC开发Android Messenger:第2部分

    使用WebRTC的应用程序可以打开数据通道,该通道允许将文本或二进制数据从对等方传输。数据通道通常用于允许视频通话期间交换文本消息,或在发生某些事件告诉对等方,例如另一个对等方禁用其摄像头。...WebRTC中,地址指针设置为WebRTC使用的SctpTransport实例的地址。 结果是每个SCTP连接期间,此对象在内存中的位置将发送到远程对等方。...重置序列号需要完全等于初始化连接设置的序列号(INIT或COOKIE_ECHO块中),还需要等于SctpTransport指针的低位四个字节。...可以通过发送COOKIE_ECHO块来通过此检查,该块触发错误之前将重置序列号设置为所需的值。 更具挑战性的是TSN上执行的检查。它与累积TSN进行比较,后者最初设置为与重置序列号相同的值。...ASLR布局是Android设备启动确定的,并且重新启动之前不会再次更改。所以我需要一种方法重置序列号设置之后改变累积的TSN。

    1.6K43

    硬核干货:6000字 30张图,带你彻底搞懂BGP动态路由!

    BGP 是 1989 年 6 月首次标准化,在这之前,所谓的 Internet 网关是通过外部网关协议 (EGP)交换网络的,EGP 是为由核心 AS 和直接连接到该核心的多个其他较小 AS 组成的...连接俄罗斯端的设备,中国端的设备发送带有源的数据包IP 是它自己IP 地址,目标 IP 是俄罗斯端设备的 IP 地址,数据包首先到达 AS 101 的网关,那里的路由器判断数据包的目的地不在它自己的网络中...还有一种情况也会让BGP 状态保持空闲状态,那就是关闭连接到邻居的物理接口或关闭 BGP 邻接关系进入 BGP 进程。2、Connect 连接状态连接状态下,BGP 等待三次 TCP 握手完成。...如果成功,连接重置计时器将由已建立的 BGP 会话进程重置,并向邻居发送一个 OPEN 消息,并将进入 OpenSent 状态。如果失败,状态将继续到 Active 状态。...如果连接重置计时器归零并且 Connect 阶段尚未完成,则连接重置计时器将被重置并且 BGP 将尝试新的三次 TCP 握手。

    1.7K61

    【干货】你想了解的BGP的问题都在这里了

    eBGP 对等互联中,下一跳是宣布路由的邻居的 IP 地址。然而,当在多路访问介质(例如,以太网或帧中继)上宣布路由,下一跳通常是连接到该介质的路由器接口的 IP 地址,也是路由的源发地。...16、怎样才能仅在失去与我的主ISP连接才有条件地向另一个ISP宣布前缀 ? 默认情况下,BGP 会向外部对等体宣布其 BGP 表中的路由。...如果没有建立被动TCP会话,BGP进程就会启动新的激活TCP,尝试连接到远程BGP扬声器。 ConnectRetry 计时器此空闲的 120 秒时间内,远程BGP对等体可以与其建立 BGP会话。...它只获取交换的BFD Hello数据包,当有bfd配置更改类似更改发生的会话状态。正常BFD数据包没有由此命令捕获。 33、新的BGP邻居最大前缀配置后,路由器是否必须重新启动?...当AS路径加在前面设置, AS编号将被加在前面添附到AS路径,并且,当更新离开往eBGP对 等体的AS,本地AS编号加在前面到完整AS路径。

    2.6K30

    Kali Linux 网络扫描秘籍 第四章 指纹识别(一)

    准备 为了使用 Netcat 收集服务特征,客户端服务连接,你需要拥有运行开放信息的网络服务的远程系统。提供的例子使用了 Metasploitable2 来执行这个任务。..._sock,name)(*args) socket.error: [Errno 111] Connection refused >>> exit() 如果我们尝试连接 Metasploitable2...如果recv函数调用,但是不提供任何数据给接受者,这个函数会被阻塞。为了使用 Python 自动化收集特征,我们必须使用替代方案来识别是否可以抓取到特征,调用这个函数之前。...脚本遍历每个指定的目标端口地址,并尝试与特定端口初始化 TCP 连接。如果建立了连接并接受到来自目标服务的特征,特征之后会打印脚本的输出中。...也可以尝试连接这 150 个端口,让 Dmitry 抓取任何可用的特征。这可以使用-b选项和-p选项来完成。

    1.6K30

    不要往 AMQP 的 Header 乱塞东西

    我们某一些特殊资源的场景下,celery 任务会直接报错: ConnectionResetError: [Errno 104] Connection reset by peer File "kombu...然而,问题依旧,一间又没了头绪,开始漫无目的重新浏览 Sentry 中的错误堆栈以及相关变量。...蛛丝马迹 无意间,发现在代码中,我们尝试向队列中存储一大段 pickle 过的对象数据,而这些变量 Sentry 中已经长到无法完整显示而省略了。...这里非常明确地指出了,由于我们传递的 frame 大小(245629 bytes) 大于默认的 131064 + 8(frame header) bytes (128KB),所以 RabbitMQ 关闭了连接...但是遇到像这样幽灵般的问题,RabbitMQ 反而更有优势,完善的流程更容易暴露问题。 要适当地了解重点依赖的技术细节。

    50030

    无线攻防:wifi攻防从破解到钓鱼

    用户捕获数据包,可以通过指定监听数据的工作信道为目标AP工作的信道来解决该问题。由于AP工作信道为6,所以这里需要设置无线网卡监听信道为6。...,攻击手段是断开对方的网络,让对方重新连接后,重新抓取握手包,对方重新连接会自动连接进入携带了密码key 出现WPA handshake: F4:6A:92:90:23:6D 代表抓包完成!...选择3,也可以自定义选择 选择3后就开始6个窗口,然后就无法连接FAST_236D了,连接此wifi的全部客户端踢下线,并弹出六个窗口 1、只要输入密码,就会显示第二框白色字体中,包含mac...知道Pin码以后使用如下命令饭计算出wifi连接密码: reaver -i wlan0monmon -b MAC地址 -p Pin码 总结: 此方法受信号强度和WPS保护机置等影响,尝试过几次,均信号...mdk3 wlan0monmon b -g -c 6 -h 7 参数结束 b 用于伪造AP使用的模式; g 伪造诚提供54M即满足802.11g标准的无线网络 -c 针对的无线工作频道,这里是

    6.6K41

    32张图详解BGP路由协议:BGP基本概念、BGP对等体、BGP报文类型、BGP状态机等

    Idle状态下,BGP拒绝对等体发送的连接请求。只有收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态。...Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置BGP过程引起的。...如果连接重传定时器超时,BGP仍没有收到BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。...(3)Active状态 Active状态下,BGP总是试图建立TCP连接。 如果TCP连接成功,那么BGP向对等体发送Open报文,关闭连接重传定时器,并转至OpenSent状态。...路由更新,BGP设备只发送更新的BGP路由 所有对等体发送的路由,BGP设备都会接收 所有EBGP对等传递过程中下一跳改变 所有IBGP对等传递过程中下一跳不变(需要特别注意) 默认EBGP

    26.9K1114

    【HTTP】连接管理--TCP

    每个段的接收者收到完好的段,都会向发送者回送小的确认分组。如果发送者没有指定的窗口时间内收到确认信息,发送者就认为分组已被破坏或损坏,并重发数据。...其实现是将部分数据缓存起来,只有当挂起分组确认或者缓存中积累了足够发送一个全尺寸分组的数据,才会将缓存的数据发送出去。...由于可以源端口的数量有限(比如,6000个),而且2MSL秒内连接是无法重用的,连接率60000/120=500次/秒。 连接的处理 串行连接:TCP的性能延可能会叠加起来; ?...要实现正常关闭的应用程序首先应该关闭它们的输出信道,然后等待连接另一端的对等实体关闭它的输出信道。然后周期性地检查其输入信道的状态(查找数据,或流的末尾)。...# 多条件筛选 and or $ sudo tcpdump -i any -c5 -nn src 192.168.122.98 and port 80 保存抓包数据 使用 -w 选项来保存数据包而不是屏幕上显示出抓取的数据包

    1.3K21

    抢救一台失去网络的VPS过程

    尝试重新安装iptables,没用。换firewall,也没用。然后更新系统,也没用。无奈发TK反馈。...尝试连接,居然连上了!看了一下里面的文件,居然真的是的服务器!!瞬间激动无比,因为这意味着可以通过ssh把里面的文件传出来了,即使必须重装,也不必丢失重要数据。...开始没这样想,是因为是一个菜鸟,对Linux系统只懂些皮毛,很多命令和机制都不会,平常都是需要用什么就去网上搜。...峰回路转 看到yum命令安装软件尝试下载的都是.rpm文件,这是一种软件安装包。...突然想到: 既然现在能通过紧急控制台(应该是VPS宿主机提供的)通过ssh连接到我的VPS,可以向VPS传输文件,那么能不能现在自己电脑上下载好这些安装包,然后把他们传到VPS上,再手动安装呢?

    31130

    使用wireshark抓包分析-抓包实用技巧

    输入配置 20190625192938.png 输入选项卡中可以选择抓取指定接口,在下方过滤器中可以输入过滤条件,比如host 172.17.1.100抓取指定ip的包,或tcp port 9055...若需要根据特定条件大量信息中筛选出想要的信息,则需要通过tshark进行命令行的筛选。 案例:生产环境中发现时常有丢包现象,通过wireshark进行简单分析发现有许多RST的重置连接包。...追踪流查看发现,没有正常建立连接。 20190628201657.png 通过tcp.flags.reset == 1筛选出大量的重置连接。大约占比1%的请求数据量。...实际通过tshark命令过滤发现,使用的都是显示过滤器筛选。而在通过dumpcap -f抓包需要使用捕获过滤器的语法。 简单了解参数之后,开始使用命令筛选出我们需要的包。...比如在软件层面上对网络连接进行异常监控及预警。实时的对包进行分析,有异常连接可以做到即使预警。

    4.6K00

    Linux网络编程“惊群”问题总结

    这个时候有多个进程同时等待网络的连接事件,当这个事件发生,这些进程同时唤醒,就是“惊群”。这样会导致什么问题呢?...我们知道进程唤醒,需要进行内核重新调度,这样每个进程同时去响应这一个事件,而最终只有一个进程能处理事件成功,其他的进程处理该事件失败后重新休眠或其他。...尝试使用多进程模型,创建一个父进程绑定一个端口监听socket,然后fork出多个子进程,子进程们开始循环处理(比如accept)这个socket。...然后fork出4个子进程,worker中调用epoll_wait开始accpet连接。...(当某一个子进程的任务量达到总设置量的7/8,则不会再尝试去申请锁)来均衡各个进程的任务量。

    78350

    外部网关路由协议 BGP

    部署EBGP对等体关系,通常使用直连接口的IP地址作为源地址,如若使用Loopback接口建立EBGP对等体关系,则应注意EBGP多跳问题 一般而言AS内部,网络具备一定的冗余性。...状态名称 用途 Idle 开始准备TCP的连接并监视远程对等体,启用BGP,要准备足够的资源 Connect 正在进行TCP连接,等待完成中,认证都是TCP建立期间完成的。...如果TCP连接建立失败则进入Active状态,反复尝试连接 Active TCP连接没建立成功,反复尝试TCP连接 OpenSent TCP连接已经建立成功,开始发送Open包,Open包携带参数协商对等体的建立...只有收到本设备的Start事件后,BGP才开始尝试和其它BGP对等体进行TCP连接,并转至Connect状态 Start事件是由一个操作者配置一个BGP过程,或者重置一个已经存在的过程或者路由器软件重置...BGP对等体的响应,那么BGP继续尝试和其它BGP对等体进行TCP连接,停留在Connect状态。

    18210
    领券