TCP close-wait 状态分析

这篇具有很好参考价值的文章主要介绍了TCP close-wait 状态分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

分析过程:根据TCP建立连接和断开连接的过程,如下图:

TCP close-wait 状态分析

close wait状态一般是在服务端出现的。执行:ss -tnp | grep CLOSE-WAIT | wc -l命令可查看有多少close wait连接状态;执行:ss -tnp | grep CLOSE-WAIT | more,根据第三、四列可以看出,由谁向谁发起socket连接(客户端发起请求的端口是随机的,服务端提供服务的端口比较有规律)。根据TCP断开连接的状态变换过程,基本可以判断close wait堆积是因为客户端发出FIN包,服务端回了ACK包,但是服务端没发出FIN包导致。

        分析代码后发现,客户端有调用关闭socket方法去主动关闭socket连接,但是服务端没有调用关闭socket方法发送FIN包结束连接,导致服务端大量close wait堆积。

解决方法:服务端加上调用关闭socket方法发送FIN给客户端。上新版本后,连续几天到服务端执行ss -tnp | grep CLOSE-WAIT | wc -l命令,没发现有大量close wait了。

另附如下tcp连接相关内容:

        TCP建立连接(三次握手)都是由客户端发起的,但是断开连接视情况而定。一般由客户端主动断开连接比较好,因为由服务端发起断开连接,服务器会产生time-wait状态的连接,而time wait占用的资源不会被内核释放。SSH、数据库等断开连接由客户端主动发起,如果超时了,断开连接可能由服务端发起。

HTTP(S)断开连接有时由服务端主动发起,如下情况:

1、客户端请求头带content-length时,响应体body长度可知,接收完数据后,客户端主动断开连接

2、响应头中的Transfer-encoding为chunked传输,body会被分成多个块,每块的开始会标识出当前块的长度,body就不需要通过content-length来指定了。也可以知道body的长度,客户端主动断开连接

3、响应头中的Transfer-encoding为非chunked传输,而且有content-length,则按照content-length来接收数据,接收完数据后,客户端主动断开连接

4、响应头中的Transfer-encoding非chunked且不带content-length,客户端无法知道要接收多少数据,直到服务端主动断开连接。

即 :如果客户端知道服务器传来的长度,客户端在接收完成后,会主动断开;如果不知道,客户端就一直接收数据,直到服务端断开连接。

在TCP的三次握手、数据传输以及四次挥手的过程中,给Client和Server定义了很多状态用于描述整个流程,结合上面的状态转换图来理解这些状态定义:

  • LISTEN(Server): 正在侦听来自Client的TCP端口的连接请求,服务端启动后处于LISTEN 状态用于监听不同客户端的TCP请求并建立连接
  • SYN-SENT(Client): 三次握手时,Client在发送SYN后处于等待建立连接的状态
  • SYN_RCVD(Server):三次握手时,当Server收到Client的SYN时,将ACK和SYN发送给 Client后到建立连接之前,Server处于SYN_RCVD状态
  • ESTABLISHED(Server And Client):三次握手成功以后,Client和Server处于数据传输的状态
  • FIN-WAIT-1(Client):四次挥手时,Client 端发送中断请求FIN到收到Server端的中断确认的过程
  • CLOSE_WAIT(Server):四次挥手时,Server接收到Client的FIN请求后回复ACK确认到发送FIN包的状态
  • FIN-WAIT-2(Client):四次挥手时,当Client接收到Server对于FIN的响应ACK后到收到 Server端的FIN包的状态
  • LAST_ACK(Server):四次挥手时,Server发送FIN请求关闭连接到关闭连接前的状态
  • TIME_WAIT(Client):四次挥手时,Client对于Server的FIN回复ACK到连接关闭前的状态,又称 2MSL 状态
  • CLOSE(Server And Client):Server和CLient关闭连接后的状态

客户端的状态转换流程如下:

大部分情况下:CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

少数情况:CLOSED -> SYN_SENT -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

服务端的状态转换流程如下:

大部分情况下:CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED -> CLOSE_WAIT -> LAST_ACK -> CLOSED

少数情况:CLOSED -> LISTEN -> SYN_RCVD -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

为何服务器上存在CLOSE_WAIT?

  1. 在数据库连接过程中,客户端(或发起请求的应用)提交或回滚事务时,忘记关闭(即没发送FIN)与数据库的连接,导致数据库因为连接超时而主动关闭连接(即数据库主动发送FIN),此时,发起请求的应用服务器(客户端),就会出现大量CLOSE_WAIT状态。
  2. 例2,客户端发送了FIN,但是服务端忙于读或者写(处理未完成的客户端请求),没有及时发送FIN,此时可能会有少量的close wait。代码需要判断socket连接,一旦读到0,断开连接。

总之,被动关闭的一方(一般是服务端)要调用关闭 socket方法,才会发送FIN给主动关闭的一方(一般是客户端),自己的状态才会变LAST_ACK文章来源地址https://www.toymoban.com/news/detail-464069.html

到了这里,关于TCP close-wait 状态分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 97-TCP为什么要有一个“TIME_WAIT“的状态

    \\\"TIME_WAIT\\\"状态存在的原因主要有两点: 假设上图中用于确认服务器结束报文段6的TCP报文段7丢失,那么服务器将重发结束报文段,因此客户端需要停留在某个状态以处理重复收到的结束报文段.否则客户端将以复位报文段来回应服务器,服务器则认为这是一个错误,因为他期望的是一

    2024年02月01日
    浏览(63)
  • 根据验证过程,远程证书无效。未能为 SSL/TLS 安全通道建立信任关系。

    提示:这里简述项目相关背景: 例如:项目场景:vs2022,HttpClient调用接口出现错误(根据验证过程,远程证书无效。未能为 SSL/TLS 安全通道建立信任关系。) 缺少证书,需要在安装证书 点击安装证书=》本地计算机=》下列存储,选择受信任的根证书颁发机构,安装完成之后

    2024年02月11日
    浏览(63)
  • 建立和终止TCP连接过程

    http 和 https 区别: http 使用过程中存在安全性问题:http 使用明文通信,容易被窃听。由于 http 不验证通信方的身份,攻击者可以伪装成合法的通信方进行欺骗。并且 http 无法提供报文的完整性验证,因此报文有可能被篡改。 https 使用 SSL(Secure Sockets Layer) 或 TLS(Transport Layer

    2024年02月15日
    浏览(38)
  • 根据验证过程,远程证书无效。未能为 SSL-TLS 安全通道建立信任关系。

    提示:这里简述项目相关背景: 例如:项目场景:vs2022,HttpClient调用接口出现错误(根据验证过程,远程证书无效。未能为 SSL/TLS 安全通道建立信任关系。) 缺少证书,需要在安装证书 点击安装证书=》本地计算机=》下列存储,选择受信任的根证书颁发机构,安装完成之后

    2024年03月22日
    浏览(59)
  • 实战 OSPF建立连接的过程7中状态?通俗易懂

    【OSPF的邻居状态有7种】 Down--Init--2-Way--Exstart--Exchange--Loading--Full OSPF邻居建立过程:A---B之间建立连接。 这里假设A的router ID为172.16.1.1,B的172.16.1.2  1.首先当双方没有开始建立关系之前,双方的状态为 DOWN 2.如下图,路由A想要和B建立关系,首先A会发送Hello报文(报文里面包含

    2024年02月09日
    浏览(35)
  • SNMP 计算机网络管理 实验1(二) 练习与使用Wireshark抓取SNMP数据包抓包之 任务三分析并验证TCP三次握手建立连接时三次握手工作过程

    ⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu 🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝​ 🙉联系作者🙈by QQ:813942269🐧 🌈致亲爱的读者:很高兴你能看到我的文章,希望我的文章可以帮助到你,祝万事

    2024年02月12日
    浏览(58)
  • 简述TCP/IP建立连接过程(附流程和代码)

    前言: TCP/IP 定义了计算机操作系统如何连入互联网,以及数据传输的标准。 TCP和IP是属于不同协议栈层的,只是这两个协议属于协议族里最重要的协议,所以协议栈或者模型以之命名了。 本段转载C语言中文网:TCP/IP 不是指一个协议,也不是 TCP 和 IP 这两个协议的合称,而

    2024年02月04日
    浏览(94)
  • TCP,SSL以及HTTPS的连接建立过程详解

    可以参考B站的一个视频,把TLS/SSL的连接建立过程降解的非常透彻。配合这篇博客食用更佳。一遍不懂请多看几遍,很有用! 1 说明 1.1 对称加密的和非对称加密 在数字加密算法中,通过可划分为对称加密和非对称加密。 什么是对称加密? 在对称加密算法中,加密和解密使用

    2024年04月09日
    浏览(74)
  • 说一下什么是tcp的2MSL,为什么客户端在 TIME-WAIT 状态必须等待 2MSL 的时间?

    1.1 MSL MSL:Maximum Segment Lifetime报文段最大生存时间,它是任何报文段被丢弃前在网络内的最长时间 1.2为什么存在MSL TCP报文段以IP数据报在网络内传输,而IP数据报则有限制其生存时间的TTL字段,并且TTL的限制是基于跳数 1.3MSL大小定义 RFC文档中规定为2分钟,但是实际实现过程中

    2024年02月06日
    浏览(46)
  • TCP/IP客户端和服务器端建立通信过程

    使用Qt提供的类进行基于 TCP 的套接字通信需要用到两个类: QTcpServer 类用于监听客户端连接以及和客户端建立连接,在使用之前先介绍一下这个类提供的一些常用API函数: 构造函数 给监听的套接字设置监听 listen() 函数 在代码中 通过启动监听按钮 设置监听 参数: address :

    2024年02月07日
    浏览(65)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包