Python 如何调试导致连接被拒绝或连接超时的原因?

Python 如何调试导致连接被拒绝或连接超时的原因?,python,networking,Python,Networking,我有以下代码,已经工作了大约一年: import urllib2 req = urllib2.Request('https://somewhere.com','<Request></Request>') data = urllib2.urlopen(req) print data.read() 在被拒绝的连接上: $telnet somewhere.com 443 正在尝试XXX.YY.ZZZ.WWW。。。 telnet:无法连接到远程主机:连接被拒绝 超时时: $

我有以下代码,已经工作了大约一年:

import urllib2

req = urllib2.Request('https://somewhere.com','<Request></Request>')
data = urllib2.urlopen(req)
print data.read()
在被拒绝的连接上:

$telnet somewhere.com 443
正在尝试XXX.YY.ZZZ.WWW。。。
telnet:无法连接到远程主机:连接被拒绝
超时时:

$telnet somewhere.com 443
正在尝试XXX.YY.ZZZ.WWW。。。
telnet:无法连接到远程主机:连接超时
使用a截获发送至
somewhere.com
的数据包。研究这些数据包应该能告诉你发生了什么

超时或连接被拒绝可能意味着远程主机太忙。

问题 问题出在网络层。以下是已解释的状态代码:

  • 连接被拒绝
    :对等方未监听您试图连接到的相应网络。这通常意味着防火墙正在主动拒绝连接,或者其他站点上的相应服务未启动或过载

  • 连接超时
    :在尝试建立TCP连接的过程中,在给定的时间限制内,另一端没有响应。在urllib的上下文中,这也可能意味着HTTP响应没有及时到达。这有时也是由防火墙引起的,有时是由远程(甚至本地)站点上的网络拥塞或重负载引起的

在上下文中 也就是说,这可能不是脚本中的问题,而是远程站点上的问题。如果偶尔发生这种情况,则表明另一个站点存在负载问题,或者到另一个站点的网络路径不可靠

另外,由于这是一个网络问题,您无法判断另一端发生了什么。数据包可能在一个方向上传输良好,但在另一个方向上被丢弃(或错误路由)

这也不是(直接的)DNS问题,它会导致另一个错误(名称或服务未知或类似)。但是,DNS可能被配置为在每个请求上返回不同的IP地址,这将在每次连接尝试时将您(DNS缓存放在一边)连接到不同的主机地址。反过来,这些主机中的一些可能配置错误或过载,从而导致上述问题

调试这个 正如另一个答案中所建议的,使用数据包分析器可以帮助调试问题。但是,除了能准确反映错误消息内容的数据包外,您不会看到太多

要排除网络拥塞的问题,您可以使用类似或甚至可以查看数据包是否丢失到远程站点的工具。注意,如果你看到MTR中丢失的东西(和任何跟踪工具),你必须总是考虑第一个主机丢失的地方(在从你的路由到远程)作为一个丢弃包,因为这种方式工作。如果数据包在很长一段时间内(比如100个数据包)仅在最后一跳丢失,那么该主机肯定有问题。如果您发现此行为持续(超过几天),您可能需要与管理员联系

中途丢失通常会导致网络拥塞(可能是由于维护),对此您无能为力(除了向ISP抱怨缺少冗余)


如果网络拥塞不是问题(例如,丢失的数据包不超过5%),则应与远程服务器管理员联系,找出问题所在。他可以在系统日志中看到相关信息。在远程站点上运行数据包分析器也可能比在本地站点上更具启发性。因此,明确建议使用
netstat-tlp
检查端口是否打开。

在linux终端上尝试
telnet somewhere.com 443
,并检查其名称解析失败或连接失败的位置。使用Try-and-catch语句,然后在catch语句中打印错误可能会揭示更多信息信息。telnet告诉您的IP地址是否始终相同?是的,每个telnet requestServer故障的IP地址都相同。我正在运行mtr,在特定主机上,大约10%的数据包丢失。这是否意味着此特定主机有问题?取决于数据包丢失的位置。请参阅我答案的
mtr
段中添加的文本。所谓“重载”,是指RAM还是CPU?