Connection refused间歇性出现的问题定位

出现Connection refused的问题原因一般有三种:

1. 服务器的端口没有打开       这种直接就是一直会Connection refused,不会间歇出现,可以直接排除;

2. 服务器的防火墙没有开白名单    很多跟外部对接的时候,是需要将公司出口ip加到对方防火墙白名单,这种也会直接Connection refused,不会间歇出现,可以直接排除;

3. 服务器上的backlog设置的太小,导致连接队列满了,服务器可能会报Connection refused,或者Connecttion reset by peer,这个看服务器上的连接队列满时的设置;

详细的异常堆栈信息如下:

看保持方法:

是个native方法,毫不意外。因为是跟第三方云服务商对接,只能让他们查服务器配置的backlog大小,这里回顾一下tcp三次握手的过程。

第一步:client 发送syn到server发起握手;

第二步:  server收到syn后回复syn + ack 给client;

第三步:client收到syn + ack后,回复server一个ack表示收到server的syn + ack;

Tcp连接是有张如下图的:

1. 服务端调用bind()  & listen() 函数后,会监听本地某个端口;

2. 客户端发SYN,服务端收到,连接状态变为SYN_RCVD,将连接放到半连接队列中,同时回复syn+ack给client;

3. 客户端收到syn + ack,客户端连接状态变为ESTABLISHED,回复ack,将连接放到全连接队列。

其中半连接队列的大小看: max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)

上面是我机器上半连接的配置,挺大的,26万。

全连接队列的大小: min(backlog, somaxconn), backlog是在socket创建的时候传入的,somaxconn是一个os级别的系统参数。

代码涉及到Socket这一层的操作时,需要自己传backlog的大小,否则默认值是50.

public ServerSocket(int port, int backlog) throws IOException {
        this(port, backlog, null);
}

所有上面Connection Refused很容易因为backlog设置的太小而发生,例如,nginx的配置就有backlog, 默认是511,Tomcat 默认是100。

一般来说,如果是公司自己的服务器,可以通过TCP建连接的时候全连接队列(accept队列)满了,通过一些命令可以查询队列情况:

netstat -s 命令

通过netstat -s | egrep "listen" 看队列的溢出统计数据,多执行几次,看全连接队列overflow次数有没有增长:

ss 命令

上面看Send-Q的值就是listen端口上全连接队列的最大值,Recv-Q就是当前全连接队列用了多少。

netstat跟ss命令一样也能看到Send-Q、Recv-Q这些状态信息,不过如果这个连接不是Listen状态的话,Recv-Q就是指收到的数据还在缓存中,还没被进程读取,这个值就是还没被进程读取的 bytes;而 Send 则是发送队列中没有被远程主机确认的 bytes 数。

因此如果出现间歇性Connection Refused,检查是否有设置backlog, backlog设置的是否过小。

原文地址:https://www.cnblogs.com/zhengwangzw/p/12219478.html

时间: 2024-10-19 15:37:35

Connection refused间歇性出现的问题定位的相关文章

android 127.0.0.1/localhost connection refused,在模拟器上应该用10.0.2.2访问你的电脑本机

调试中通过android simulator模拟器链接localhost或者127.0.0.1,因为我在电脑上面建立了apache,我的代码大概就是URL url = new URL(urlString);     URLConnection urlconn = url.openConnection(); 但是报错了!! Exception 1:java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused 问题是

com.microsoft.sqlserver.jdbc.SQLServerException: 到主机 的 TCP/IP 连接失败。 java.net.ConnectException: Connection refused: connect

问题描述:最简单的数据库连接报错,到主机  的 TCP/IP 连接失败.(win 7 操作系统) 错误信息: com.microsoft.sqlserver.jdbc.SQLServerException: 到主机  的 TCP/IP 连接失败. java.net.ConnectException: Connection refused: connect package sqlconnect; import java.sql.*; public class sqlconnect { public

[转]android访问网络:java.net.ConnectException: localhost/127.0.0.1:8888 - Connection refused

这对刚学会向tomcat模拟的本地服务器发送请求的同学非常重要! 转自:http://wing123.iteye.com/blog/1873763 描述:在做注册功能的时候,向本地服务器:127.0.0.1发送注册请求,logcat显示出错信息: java.net.ConnectException: localhost/127.0.0.1:8888 - Connection refused 解决办法:弃用127.0.0.1来访问服务器,改用本机的真实IP. 问题解释:摘自:http://80x8

linux下FTP拒绝(ftp: connect: Connection refused,500 OOPS: cannot read config file)

使用Ubunto15.0.4环境下,使用APT命令下载的vsftpd程序 在/etc/vsftpd.conf中开启匿名用户权限(anonymous_enable=YES),重新启动vsftpd后,在用ftp localhost,竟然会报ftp: connect: Connection refused的错误,使用sudo service vsftpd start,或sudo /etc/init.d/vsftpd start,竟然启动不起来.报500 OOPS: cannot read config

“Connection refused” vs “No route to host”

曾经在http://blog.csdn.net/bisal/article/details/42496583这篇博文中提到一个端口连接的验证: "[email protected]$telnet 172.101.19.57 1521Trying 172.101.19.57...telnet: connect to address 172.101.19.57: No route to host如果端口未开,实际报错:[email protected]$telnet 172.27.19.56 152

hive jdbc connection refused

hive jdbc 连接时抛异常: Exception in thread "main" java.sql.SQLException: Could not open client transport with JDBC Uri: jdbc:hive2://192.168.206.128:10000/default: java.net.ConnectException: Connection refused: connect     at org.apache.hive.jdbc.Hiv

Android 蓝牙 java.io.IOException: Connection refused 异常处理笔记

最近在做一个手机和Pad连接音箱的应用,需要用到蓝牙连接发送命令来控制音箱,但是在RfcommSocket连接时, 在pad上会出现一个 java.io.IOException: Connection refused 的异常,纠结好久一直没有解决,连接代码如下: http://www.ehotelier.cn/Thread.jsp?tid=481784 http://www.ehotelier.cn/Thread.jsp?tid=481784 http://www.ehotelier.cn/Th

Android客户端连接tomcat时出错:connect failed: ECONNREFUSED (Connection refused)

public static final String BASE_URL = "http://127.0.0.1:8090/HelloWord/"...; 会抛异常Caused by: libcore.io.ErrnoException: connect failed: ECONNREFUSED (Connection refused) 解决方法: String url = "http://127.0.0.1:8090/HelloWord/"...;  修改成 pub

scp出现ssh port 22: Connection refused 问题解决具体步骤

[root(0)@sys11 09:20:29 /home/work/Code_release/bj]# scp ./release.sh  [email protected]:/Users/a2014102/Downloadsssh: connect to host 192.168.161.151 port 22: Connection refusedlost connection Solution: One possible reason is that because the ssh se