当前位置: 首页 > 面试题库 >

104,“对等连接重置”套接字错误,或者何时关闭套接字会导致RST而不是FIN?

艾宏远
2023-03-14
问题内容

我们正在并行开发一个Python
Web服务和一个客户端网站。当我们从客户端向服务发出HTTP请求时,一个调用始终在socket.py中引发socket.error,其读取方式为:

(104,“对等方重置连接”)

当我用wireshark收听时,“好”和“坏”的响应看起来非常相似:

  • 由于OAuth标头的大小,该请求被分为两个数据包。服务以ACK响应
  • 该服务发送响应,每个报头一个数据包(HTTP / 1.0 200 OK,然后是Date报头,等等)。客户端使用ACK响应每个请求。
  • (良好请求)服务器发送FIN,ACK。客户端以FIN ACK响应。服务器响应ACK。
  • (错误请求)服务器发送RST,ACK,客户端未发送TCP响应,套接字错误在客户端引发。

Web服务和客户端都在运行glibc-2.6.1的Gentoo Linux x86-64机器上运行。我们在同一virtual_env中使用Python
2.5.2。

客户端是Django 1.0.2应用,正在调用httplib2
0.4.0发出请求。我们正在使用OAuth签名算法对请求进行签名,并且OAuth令牌始终设置为空html" target="_blank">字符串。

该服务正在运行Werkzeug
0.3.1,该版本使用Python的wsgiref.simple_server。我通过wsgiref.validator运行了WSGI应用程序,没有任何问题。

看起来这应该很容易调试,但是当我在服务端通过一个好的请求进行跟踪时,看起来就像在socket._socketobject.close()函数中的坏请求一样,将委托方法变成了伪方法。当send或sendto(不记得哪个)方法关闭时,将发送FIN或RST,然后客户端开始处理。

“通过对等方重置连接”似乎应该归咎于服务,但是我也不信任httplib2。客户会错吗?

进一步调试-看起来像Linux上的服务器

我有一台MacBook,所以我尝试在一个上运行该服务,在另一个上运行客户端网站。Linux客户端调用OS X服务器时不会出现错误(FIN ACK)。OS
X客户端使用错误(RST
ACK和(54,“对等重置连接”))调用Linux服务。因此,看起来好像是在Linux上运行的服务。是x86_64吗?坏glibc?wsgiref?还在寻找…

进一步测试-wsgiref看起来不整洁

我们已经使用Apache和mod_wsgi进行了生产,并且连接重置已消失。请参阅下面的答案,但我的建议是记录连接重置并重试。这样一来,您的服务器就可以在开发模式下正常运行,并在生产环境中稳定运行。


问题答案:

我有这个问题。请参阅Python“对等连接重置”问题。

您(很可能)遇到了基于Python全局解释器锁定的小计时问题。

您可以(有时)从time.sleep(0.01)策略上更正此问题。

“哪里?” 你问。打败我。这个想法是为了在客户端请求之内和周围提供更好的线程并发。尝试 发出请求 之前
放好它,以便重置GIL,Python解释器可以清除所有未决线程。



 类似资料:
  • 当使用Python2.7和从API检索数据时,我得到了错误

  • 连接错误:写入套接字时出错104。连接由对等重置。 环境: ubuntu: 16.04 python: 3.6 PC总内存: 32G 我已经安装了redis'3.0.6'。 当您尝试插入500000个数据时,它会成功,但当您尝试插入4000万个大数据时,它会失败。 当尝试将Python数据帧插入redis时,由于容量太大而失败。 数据插入成功: 数据插入失败: ConnectionResetErr

  • 到目前为止,每当我遇到问题时,我都会使用这个网站,我也找到了解决方案,但这次我甚至不知道发生了什么。 我正在开发一款基于1对1多人模式的游戏。到目前为止,我已经创建了一个服务器和我的客户端程序。 我的服务器为每个与服务器连接的客户端创建一个带有套接字的新线程,当在游戏中按下“新游戏”按钮时,线程会搜索另一个正在寻找新游戏的线程,一旦它找到他,创建一个单独的线程,向两个线程发送消息,向它们发出游戏已

  • 我的servlet程序是 如何解决这个问题?

  • 我使用HttpClient4.4发送get和post请求。并且我刚刚创建了一个httpclient的simpile包装器以方便使用: 当我使用这个类发送post请求时。奇怪的事情发生了: 第一次,我向服务器发送一个post请求,一分钟后就可以了,我向服务器发送一个同样的请求,也可以了。但几分钟后,我发出了一个同样的请求,有些不对劲: 但是,我仍然向服务器发送一个相同的请求,它又可以了。 每次我按照

  • 问题内容: 我有一个使用简单套接字在两个系统之间传递某些字符的应用程序。我的Java应用程序作为服务器运行。我建立了良好的连接,甚至传递了一条消息。但是,发送完一条消息后,我的连接关闭。 从我可以看出来的好像是在关闭时,套接字本身正在关闭吗?!这很不好,因为我有多个要在同一连接上发送的消息。 我吃饱了吗?如何在Java中维护此连接? 问题答案: 是的,关闭任何作家/读者将关闭他们包装的所有其他作家