连接被拒绝错误的原因是啥?

Posted

技术标签:

【中文标题】连接被拒绝错误的原因是啥?【英文标题】:What can be the reasons of connection refused errors?连接被拒绝错误的原因是什么? 【发布时间】:2011-01-20 23:05:48 【问题描述】:

我正在尝试用 C 编写一个服务器程序, 使用另一个客户端,例如,当我尝试通过端口 2080 连接时出现此错误。

connection refused

这个错误的原因是什么?

【问题讨论】:

我刚刚收到此错误,因为我托管我的网站的服务器出现错误。服务器仍然可能是pinged,downforeveryoneorjustme.com 表明它不仅仅是我,我仍然可以通过 FTP 访问它。几分钟后,错误就解决了。 @moose:ping 不会告诉您是否可以访问特定端口进行广告侦听,而只会告诉您 IP 地址是否可以访问。但是connect() 取决于特定的 IP 和端口是否可以使用。 Server Fault 有一个关于 Connection Refused 的规范问题。 这里是Connection Refused的简洁解释。 我在 Ubuntu 上连接被拒绝,因为我试图在 'localhost' 上接收连接,但在我的机器上没有正确配置 'localhost'。将 'localhost' 更改为 '' (Python) 解决了这个问题。 【参考方案1】:

可能有很多原因,但最常见的是:

    目标计算机上的端口未打开。

    目标计算机上的端口已打开,但其待处理连接的积压已满。

    客户端和服务器之间的防火墙阻止访问(同时检查本地防火墙)。

检查防火墙并确保端口打开后,使用 telnet 连接到 ip/port 以测试连通性。这会消除您的应用程序中的任何潜在问题。

【讨论】:

防火墙通常会给出超时错误,因为连接 (SYN) 数据包只是被丢弃。连接被拒绝是因为服务器收到并拒绝了 SYN 数据包。 并非总是如此,因为防火墙可以配置为拒绝而不是丢弃数据包。 connect() 在客户端程序中使用错误的服务器 IP 地址和端口号配置也会导致 errno 111。 另外:当你需要访问https,但是你指定了http://...也会出现这个错误。 @a'r 你怎么知道积压的状态?【参考方案2】:

该错误表示侦听套接字的操作系统识别出入站连接请求,但选择故意拒绝它。

假设中间防火墙没有阻碍,操作系统拒绝入站连接请求只有两个原因(据我所知)。一个原因已经多次提到过——连接的监听端口没有打开。

还有一个尚未提及的原因 - 侦听端口实际上已打开并正在被积极使用,但其排队的入站连接请求的积压已达到最大值,因此没有空间可用于入站连接请求在那一刻排队。服务器代码调用 accept() 的次数还不够多,还没有完成为新队列项清除可用插槽。

稍等片刻,然后再次尝试连接。不幸的是,没有办法区分“端口根本未打开”和“端口已打开但现在太忙”。它们都使用相同的通用错误代码。

【讨论】:

这里还解释了一种极端情况:softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/…。基本上,如果您正在对客户端/服务器应用程序进行压力测试,并且您使用的是 3.6 中提到的幼稚方法,则可能会发生“连接被拒绝”错误,并且与上述两种情况不同。 这需要被赞成。一旦明显的原因(什么都不听)得到解决,那么这实际上是最有可能的解释,而解决它可能是一件复杂的事情。 如果排队入站请求的积压已达到最大值,我们该如何解决? 是IP排队的积压吗?我尝试从 EC2 实例和我的本地机器上使用 telnet email-smtp.eu-west-1.amazonaws.com 25,EC2 实例 telnet 调用在我的本地机器上工作时拒绝连接 "没有东西在听"可能是由于机器启动但服务器(软件)例如Apache 没有运行。【参考方案3】:

如果您尝试打开与另一台主机的 TCP 连接并看到错误“连接被拒绝”,则表示

    您向另一台主机发送了一个 TCP SYN 数据包。 然后您收到了一个 TCP RST 数据包作为回复。

RST 是 TCP 数据包上的一个位,表示应该重置连接。通常这意味着其他主机已收到您的连接尝试并正在积极拒绝您的 TCP 连接,但有时中间的防火墙可能会阻止您的 TCP SYN 数据包并将 TCP RST 发送回给您。

参见https://www.rfc-editor.org/rfc/rfc793 第 69 页:

同步接收状态

如果设置了 RST 位

如果此连接是通过被动 OPEN 启动的(即, 从 LISTEN 状态),然后将此连接返回到 LISTEN 状态 并返回。无需通知用户。如果这个连接是 以主动 OPEN 启动(即,来自 SYN-SENT 状态)然后 连接被拒绝,向用户发出“连接被拒绝”的信号。在 无论哪种情况,重传队列上的所有段都应该是 删除。并在主动打开的情况下,进入关闭状态和 删除 TCB,然后返回。

【讨论】:

很好的答案。这应该是被接受的!【参考方案4】:

连接被拒绝意味着您尝试连接的端口实际上并未打开。

所以要么你连接到了错误的 IP 地址,要么连接到了错误的端口,要么服务器监听了错误的端口,或者实际上并没有运行。

一个常见的错误是在以网络字节顺序绑定或连接时未指定端口号...

【讨论】:

这只是可能导致错误的几种可能情况之一。 端口可以打开,但仍可能出现此错误。 服务器未实际运行是开发环境中非常常见的场景,团队更加关注生产服务器。【参考方案5】:

在服务器端检查它是否正在侦听端口 2080。 首先尝试在服务器机器上通过向该端口发出 telnet 来确认它:

远程登录本地主机 2080

如果它正在监听,它能够响应。

【讨论】:

【参考方案6】:

1.检查您的服务器状态。

2.检查端口状态。

例如 3306 netstat -nupl|grep 3306

3. 检查您的防火墙。 例如添加 3306

vim /etc/sysconfig/iptables
# add
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT

【讨论】:

netstat -a 帮助【参考方案7】:

虽然您的情况似乎并非如此,但有时连接被拒绝错误也可能表明您的网络上存在 ip 地址冲突。您可以通过运行搜索可能的 ip 冲突:

 arp-scan -I eth0 -l | grep <ipaddress>

arping <ipaddress>

ThisAskUbuntu 问题也有更多信息。

【讨论】:

【参考方案8】:

我的工作电脑也遇到了同样的问题。 问题是,当您输入 localhost 时,它会转到代理的地址而不是本地地址,您应该按照以下步骤绕过它

Chrome => 设置 => 更改代理设置 => LAN 设置 => 检查绕过代理服务器获取本地地址。

【讨论】:

这解决了我的问题。但在我的 Chrome 版本上,它被称为“打开计算机的代理设置”,它打开了我的 MacOS 代理设置。从那里我在“绕过主机和域的代理设置”下为我的本地地址添加了一个通配符(*.test)【参考方案9】:

从检查点防火墙的角度来看,如果您实际选择拒绝作为操作,您将看到来自防火墙的消息,从而向潜在的攻击者暴露服务器前面存在防火墙。防火墙将静默丢弃所有与策略不匹配的连接。连接被拒绝几乎总是来自服务器

【讨论】:

【参考方案10】:

在 Ubuntu 中,尝试 sudo ufw allow &lt;port_number&gt; 允许防火墙访问您的服务器和数据库。

【讨论】:

【参考方案11】:

在我的情况下,当网站在我的国家/地区被阻止并且我不使用 *** 时,就会发生这种情况。 例如,当我尝试从被阻止的印度尼西亚访问 vimeo.com 时。

【讨论】:

【参考方案12】:

我收到了同样的消息,但原因完全不同:找不到wsock32.dll::socket(PF_INET, SOCK_STREAM, 0); 调用一直返回 INVALID_SOCKET 但原因是 winsock dll 未加载。

最后,我启动了 Sysinternals 的进程监视器,发现它“到处”搜索 dll,但没有找到。

沉默的失败很棒!

【讨论】:

INVALID_SOCKET 与“连接被拒绝”无关。只有当您的代码缺少所需的错误处理时,才会发生“静默失败”。 你的意思是我应该检查一下 dll 是否已加载?你可能是对的。

以上是关于连接被拒绝错误的原因是啥?的主要内容,如果未能解决你的问题,请参考以下文章

UDP 接收错误:连接被拒绝

oracle 数据库 显示新建数据库连接失败 错误原因ora-01017:用户名 口令无效 登陆被拒绝

打开网页时出现403Forbidden是啥意思

HTTP 400 错误是啥原因

wifi连接被拒绝是啥意思家里wifi拒绝接入

WIFI密码正确但总提示密码错误是啥原因?