tcp连接出现close_wait状态?可能是代码不够健壮

一、问题概述

今天遇到个小问题。

我们的程序依赖了大数据那边的服务,大数据那边提供了restful接口供我们调用。

测试反映接口有问题,我在本地重现了。找了大数据方的同事,解决了。

刚开始怕对方不认账,就用wireshark抓包了。没想到对方还挺爽快地解决了。

然后我这边重新测试,自己抓包了下,结果反而发现我方程序的一个问题。

下图,是我方和大数据方的交互数据包。

前三个为tcp连接建立,中间(序号4,5,6)为http请求响应,序号7-8为大数据方在请求完毕后关闭连接。

好了,看下面的图:(下面这个tcp状态变迁图网上到处都是,一定要学会看。)

我们重点关注下面红色部分:

当一个tcp实体(以我方为例),当我方和大数据方建立连接后,一直处于下面的established状态。

请求结束后,收到对方的FIN(下图红色的recv:FIN),我方回应ACK。(下图红色的send:ACK)。

然后我方进入了CLOSE_WAIT状态。

于是我就去cmd里面查看下:

果然存在这个close_wait状态的连接。

但是过了没特别久,一两分钟吧,这个状态自己消失了。(猜测是操作系统设置了close_wait超时时间,超时后主动发起fin请求断开连接)

暂时还没找到原因,大佬知道的话,还请告知下(我的是win7 64位)。

二、关于close_wait

这个状态要怎么才能进入下一个状态(LAST_ACK)呢?

看最上面的变迁图可以知道,我方tcp实体只要发起一个FIN即可。这个FIN怎么才能发起呢?

那就需要程序主动去关闭连接。

我看了下代码,果然是我方的httpclient使用完了没关闭。。(右边是我改后的代码,,下面把被关闭的两个变量的完整类名也展示一下)

org.apache.http.impl.client.CloseableHttpClient.CloseableHttpClient httpClient;
org.apache.http.client.methods.CloseableHttpResponse.CloseableHttpResponse response;

再看我上面的抓包的图的最后两行:

过了一定时间后,我方可能是在close_wait状态下持续了一定时间,触发了超时,主动向对方发起了FIN。

但是呢,对方其实已经关闭连接了,所以就返回了RST。(对方已经把连接删除了)

我把程序照上面修改后,重新请求了一次:(已经恢复正常了,如下)

三、close_wait过多怎么办

结论先说:改代码。

我方程序上线的话,部署在服务器上,close_wait过多,会导致新建立连接失败(因为端口未释放的原因。)

这个问题,就是本端tcp实体(被动关闭的一端)没有主动关闭连接,大部分都是程序的问题。

要改的话,还是具体看看哪个程序有问题,找到具体的程序后(通过查看有大量close_wait状态的程序的pid),

再看程序里和哪个远端host的连接处于该状态。

然后再去程序里找对应的代码,修改即可。

部分网上的文章,是运维手动清楚close_wait。或者修改close_wait的超时时间。

这个可以解决问题,但是为了程序的健壮性着想,还是修改程序吧。

在服务器与客户端通信过程中,因服务器发生了socket未关导致的closed_wait发生,致使监听port打开的句柄数到了1024个,且均处于close_wait的状态,最终造成配置的port被占满出现“Too many open files”,无法再进行通信。

这个可以参考:

https://blog.csdn.net/wwd0501/article/details/78674170

https://blog.csdn.net/mnasd/article/details/80496032

原文地址:https://www.cnblogs.com/grey-wolf/p/9945637.html

时间: 2024-11-10 16:21:26

tcp连接出现close_wait状态?可能是代码不够健壮的相关文章

TCP/IP详解--TCP连接中TIME_WAIT状态过多

转载自http://blog.csdn.net/yusiguyuan/article/details/21445883 TIMEWAIT状态本身和应用层的客户端或者服务器是没有关系的.仅仅是主动关闭的一方,在使用FIN|ACK|FIN|ACK四分组正常关闭TCP连接的时候会出现这个TIMEWAIT.服务器在处理客户端请求的时候,如果你的程序设计为服务器主动关闭,那么你才有可能需要关注这个TIMEWAIT状态过多的问题.如果你的服务器设计为被动关闭,那么你首先要关注的是CLOSE_WAIT. 原则

TCP连接的状态详解以及故障排查

转载自CSDN博客:http://blog.csdn.net/hguisu/article/details/38700899 TCP状态 TCP状态迁移路线图 TCP连接建立三次握手 TCP连接的终止四次握手释放 同时打开 同时关闭 TCP通信中服务器处理客户端意外断开 Linux错误信息errno列表 我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助.(总结网络上的内容) 1.TCP状态 了解TCP之前,先了解几个命令:   linux查看tcp的状态命令: 1).netst

转载:TCP连接的状态详解以及故障排查

FROM:http://blog.csdn.net/hguisu/article/details/38700899 该博文的条理清晰,步骤明确,故复制到这个博文中收藏,若文章作者看到且觉得不能装载,麻烦请告知,谢谢. 我们通过了解TCP各个状态,可以排除和定位网络或系统故障时大有帮助.(总结网络上的内容) 1.TCP状态 linux查看tcp的状态命令: 1).netstat -nat  查看TCP各个状态的数量 2).lsof  -i:port  可以检测到打开套接字的状况 3).  sar

TCP连接的状态与关闭方式及其对Server与Client的影响

1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态,表示没有任何连接.LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求.SYN_SENT:发送连接请求后等待确认信息.当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包.SYN

TCP连接(Time_Wait、Close_Wait)说明

修改Time_Wait和CLOSE_WAIT时间 修改Time_Wait参数的方法 (在服务端修改)Windows下在HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Tcpip/Parameters,添加名为TcpTimedWaitDelay的DWORD键,设置为30,以缩短TIME_WAIT的等待时间 解决CLOSE_WAIT的方法:(在客户端修改)1 一般原因都是TCP连接没有调用关闭方法.需要应用来处理网络链接关闭.2 对于Web请

TCP连接的状态与关闭方式,及其对Server与Client的影响

1. TCP连接的状态 首先介绍一下TCP连接建立与关闭过程中的状态.TCP连接过程是状态的转换,促使状态发生转换的因素包括用户调用.特定数据包以及超时等,具体状态如下所示: CLOSED:初始状态,表示没有任何连接. LISTEN:Server端的某个Socket正在监听来自远方的TCP端口的连接请求. SYN_SENT:发送连接请求后等待确认信息.当客户端Socket进行Connect连接时,会首先发送SYN包,随即进入SYN_SENT状态,然后等待Server端发送三次握手中的第2个包.

tcp连接状态以及netstat命令

tcp是可靠的数据传输协议,相对于udp来说,基于udp的通信速度更快,但是没有数据的完整性的保证,更重要的是udp不会保证数据是否到达了目的方. TCP协议建立的tcp连接是有状态的,称之为tcp的有限状态机 SYN_SENT:主动建立连接的一方发起连接建立请求,也就是SYN=1,当发出同步位,状态转换位SYN_SENT SYN_RCVD:服务器端收到了客户端发送的同步报文,按照tcp协议的规定,回复ACK报文同时SYN位至1,此时服务器的状态转换为SYN_RCVD ESTABLISHED:当

TCP/IP协议--TIME_WAIT状态存在的原因

1. 实际问题         初步查看发现,无法对外新建TCP连接时,线上服务器存在大量处于TIME_WAIT状态的TCP连接(最多的一次为单机10w+,其中引起报警的那个模块产生的TIME_WAIT约2w),导致其无法跟下游模块建立新TCP连接. TIME_WAIT涉及到TCP释放连接过程中的状态迁移,也涉及到具体的socket api对TCP状态的影响,下面开始逐步介绍这些概念. 2. TCP状态迁移        面向连接的TCP协议要求每次peer间通信前建立一条TCP连接,该连接可抽

TCP连接

#xiaodeng #TCP连接 #HTTP权威指南 83 #HTTP连接时HTTP报文传输的关键通道.编写http应用程序的程序员需要理解http连接的来龙去脉及如何使用这些连接. #TCP连接: #世界上几乎所有的http通信都是tcp/ip承载.客户端应用横须可以打开一条tcp/ip连接,连接到可能运行在世界任何地方的服务器应用程序.一旦连接建立起来,在客户端和服务器的计算机之间交换的报文就不会丢失. #如:http://www.joes-hardware.com:80/power-too