热搜:前端 nest neovim nvim

Connection refused问题总结

lxf2023-06-16 04:17:11

之前有一篇在雪球的时候遇见TCP的:

TCP的CLOSE_WAIT和TIME_WAIT问题汇总

TCP连接问题排查

目录

case1

case2

case3

case4 tcpkill 断开源端连接

case5 模拟网络波动


这次接着进行汇总:

case1

在进行部署服务时候,线上日志有报错:

NETWORK_ERROR:

Connect to xxx.xxx.com:443  failed: Connection refused

发现是安全拦截导致,因为在安全的IP封禁里面的规则对于别人是不可见的,部分出口防火墙的公网被安全封禁,在开发人员你那边是不清楚底层网络通信被转了几手,中间通过了哪些个节点,所以可以询问下网络同事

case2

如在申请完网络权限之后发现业务仍不能正常访问,请按照如下步骤进行测试。

1、进行ping的联通性测试,如果ping不通可联系网络查看,ping正常可进行第2步测试。(有些第三方机构有可能禁ping,ping不通的情况下可进行第二步测试)

2、进行nc -zv 端口的测试,返回succeeded则表示网络权限已开通;如果返回connection refused则表示链接被server端拒绝,可检查server应用端口是否启用或是否有iptables限制;nc测试返回connect timeout一般是网络权限的限制,联系网络开通。

  • [supdev@JXQ-23-58-2 ~]$ nc -zv x.x.x.x 80

Connection to 172.23.58.4 80 port [tcp/http] succeeded!    权限无问题,请检查应用。

  • [supdev@JXQ-23-58-2 ~]$ nc -zv x.x.x.x 81

nc: connect to 172.23.58.4 port 81 (tcp) failed: Connection refused  检查server应用端口是否启用或是否有iptables限制。

  • [supdev@JXQ-23-58-2 ~]$ nc -zv x.x.x.x 80 

nc: connect to 172.23.254.125 port 80 (tcp) failed: Connection timed out 一般是网络权限限制,联系网络开通。

注:

有关connection refused和connection timeout的问题解释请参考如下链接:

Linux TCP连接Connection Refused和Connection timed out的问题 - TypeCodes

3 问题的总结

到这里问题已经解决了,但是自己对于tcp出现Connection timed out的错误认识不足,只想到是自己服务端close_wait引起的问题。下面是自己对tcp握手过程中出现Connection refusedConnection timed out的总结。

3.1 Connection refused

使用telnet来检查tcp链路时,如果遇到"Connection refused"的错误,那么表示从本地客户端到目标IP地址的路由是正常的,但是该目标端口没有进程在监听,然后服务端拒绝掉了连接。

一个成功的tcp链接将会看到SynSyn-AckAck,这也就是我们预期的TCP三次握手。当使用tcpdumpwireshark抓包工具来探测发送过来的请求报文包时,Connection refused将会看到Syn,Rst

3.2 Connection timed out

如果telnet的时候,TCP路由不正常,那么会得到一个Connection timed out的错误。"Couldn't connect"原因有很多,可能是服务器无法ping通,可能是服务器(防火墙等)丢弃了该请求报文包,也可能是服务器应答太慢,又或者存在间歇性的问题(这种情况很难从日志文件中排查问题)。

case3

访问慢大概率可能的原因:

  • 网络丢包
  • 服务端慢

排查:

以客户端x.x.x.1访问服务端x.x.x.2:80/aaa/bbb/adsdf 为例。

步骤1、在x.x.x.1上:ping x.x.x.2,查看是否有丢包(packet loss),1%以上确认中间网络的链路就有丢包故障。

步骤2:在x.x.x.1上:telnet x.x.x.2 80,查看response速度,正常应该是瞬间返回,人为几乎感知不到延迟。

                                                 如果出现“refused”字样,说明服务端应用端口未开启;

                                                 如果出现“timeout”字样,但能ping通,说明端口不可达,中间控制(网络或服务端系统)未放开;

步骤3:在x.x.x.1上:time curl x.x.x.2 80,无参数或者其他参数时的访问时延。

                                                如果访问无参数或者其他参数时的时间非常快,证明网络没问题,需要排查服务端延时较大应用的状态(逻辑和性能负荷)。

case4 tcpkill 断开源端连接

命令:  tcpkill -i any -9 host 192.168.56.101 port 53054

表现: 进程退出

case5 模拟网络波动

操作: 使用tc工具模拟源端网络延迟与丢包

#延迟1s``tc qdisc add dev enp0s8 root netem delay 1000ms``#``8``%丢包``tc qdisc add dev enp0s8 root netem loss ``8``%``#删除延迟与丢包规则``tc qdisc del dev enp0s8 root

case6 断开源端连接

命令:kill -15

表现: kill -15 普通连接(SrcConn) 数据同步正常,无提示

            kill -15 xxx ,进程退出,报错为收到用户请求关闭连接

本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!