首页
学习
活动
专区
工具
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]错误的发生,提高网络请求的稳定性和可靠性。

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

相关·内容

ConnectionRefusedError: Connection Refused:连接被拒绝的完美解决方法

ConnectionRefusedError: [Errno 111] Connection Refused:连接被拒绝的完美解决方法 摘要 大家好,我是默语,一名专注于全栈开发、运维和人工智能技术的博主...当我们试图在Python中连接一个远程服务时,ConnectionRefusedError 表示目标服务器拒绝了我们的连接请求。这通常是由服务器未启动、端口未开放或防火墙设置等原因导致的。...当客户端尝试连接服务器时,如果服务器没有响应或者拒绝连接请求,就会抛出此错误。...A1: ConnectionRefusedError 表示服务器拒绝连接请求,而 ConnectionResetError 通常表示连接已建立但被远程服务器意外关闭。...如果你有任何疑问或希望我讨论特定主题,欢迎在评论区留言!期待与你们在技术社区中共同进步! 默语 让我们在技术的海洋中乘风破浪,共同进步!

1.3K10
  • 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 在传输任何数据之前发生的信号。

    11620

    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.8K21

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

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

    1.6K43

    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.6K30

    硬核干货: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.8K61

    不要往 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 反而更有优势,完善的流程更容易暴露问题。 要适当地了解重点依赖的技术细节。

    59330

    【干货】你想了解的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.7K30

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

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

    1.6K30

    无线攻防: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 针对的无线工作频道,这里是

    7.4K41

    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

    30K1215

    【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.3K22

    使用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.8K00

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

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

    33530

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

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

    79150

    好知识 | TCP中的两类故障模式

    可惜大多数时候并不是如此,在没有 ICMP 报文的情况下,TCP 程序并不能理解感应到连接异常。如果程序是阻塞在 read 调用上,那么很不幸,程序无法从异常中恢复。...Linux 系统的 TCP 协议栈会不断尝试将发送缓冲区的数据发送出去,大概在重传 12 次、合计时间约为 9 分钟之后,协议栈会标识该连接异常,这时,阻塞的 read 调用会返回一条 TIMEOUT...如果此时程序还执着地往这条连接写数据,写操作会立即失败,返回一个 SIGPIPE 信号给应用程序。2、系统崩溃造成的对端无 FIN 包当系统突然崩溃,如断电时,网络连接上来不及发出任何东西。...不过还有一种情况需要考虑,那就是系统在崩溃之后又重启,当重传的 TCP 分组到达重启后的系统,由于系统中没有该 TCP 分组对应的连接数据,系统会返回一个 RST 重置分节,TCP 程序通过 read...如果是阻塞的 read 调用,会立即返回一个错误,错误信息为连接重置(Connection Reset)。如果是一次 write 操作,也会立即失败,应用程序会被返回一个 SIGPIPE 信号。

    11510
    领券