主动发起关闭TCP链接端状态转换图
上图是tcp连接主动关闭端的状态转换图:
(1)应用层调用close函数发起关闭连接请求
(2)发送FIN到对端,关闭写通道,自己进入FIN_WAIT1状态
(3)等待对端的确认ACK到来,接受到ACK后进入FIN_WAIT2状态;如果在超时时间内没有收到确认ACK直接进入CLOSED状态
(4)如果在FIN_WAIT1状态时收到了对端的FIN则进入CLOSING状态(双发都发出了关闭连接请求)
(5)在FIN_WAIT2接受到了对端FIN后进入TIME_WAIT状态;如果在超时时间内没有收这个FIN则直接进入CLOSED状态
(6)在TIME_WAIT状态等待2个MSL(2个报文最长存活周期)后进入CLOSED状态
被动关闭TCP链接端状态转换图
上图是tcp连接被动关闭方的状态转换图
(1)收到对端FIN后,关闭读通道进入CLOSE_WAIT状态
(2)在CLOSE_WAIT状态等待应用层调用close函数关闭连接
(3)如果在超时时间内调用了close,则进入LAST_ACK状态;否则直接进入CLOSED状态
(4)在LAST_ACK状态,发送FIN到对端并等待对端的确认ACK
(5)如果在超时时间内收到了确认ACK则进入CLOSED状态,否则直接进入CLOSED状态
状态分析
FIN_WAIT1
主动方调用close函数关闭连接后立刻进入FIN_WAIT1状态,此时只要收到对端确认ACK后马上会进入FIN_WAIT2状态。
出现场景:主动方等待ACK过程中网络断掉了,导致长时间收不到ACK,主动方就会停留在CLOSE_WAIT1状态上(超时时间:一般默认60s超时)。此时我们可以使用netstat -anpt 命令看到这种状态。这个状态在实际的工作中很少见。
FIN_WAIT2
主动端在等待对端FIN到来过程中,会一你直保持这个状态(超时时间:一般默认是60s)。由于网络中断,或者对端很忙还没来得及发送FIN、或者对端有bug忘记关闭连接等都会导致主动端长时间处于FIN_WAIT2状态。如果主动方发现大量FIN_WAIT2状态时,应该引起相关人员的注意,这可能是网络不稳、对端程序bug的表现。
这个状态比较常见。
TIME_WAIT
主动方收到对端的FIN后进入TIME_WAIT状态。然后发送最后一个确认ACK到对端。之后等待2个最大的报文存活周期,正常的关闭流程客户端TCP连接都会经过这个状态,最终进入CLOSED状态。所以我们使用netstat -anpt命令发现客户端有很多的TIME_WAIT,一般这是正常的现象。
这个状态最常见。
CLOSING
双发几乎同时都调用了close接口主动关闭连接,此时都进入了FIN_WAIT1状态。如果在FIN_WAIT1状态期望收到对方的ACK但却收到了对方的FIN,这时候双方都进入CLOSING状态。然后都给对方一个ACK确认,收到了ACK后就会进入CLOSED状态了。
CLOSE_WAIT
这个状态表明TCP连接等待被关闭。只可能在被动方出现。如果被动方存在大量的CLOSE_WAIT状态需要因为我们的特别注意了。我们要仔细研究确认为什么被动方迟迟不愿关闭连接(或许是我们程序中的bug开启了连接,用完后却忘记关闭)
目前开发过程中遇到如下这个场景导致被动方有很多的CLOSE_WAIT状态:
A是一个应用程序,B是一个tomcat服务器
A开了一个连接Conn,发送请求给B
A接受相应数据后没有调用Conn.close关闭连接,在A端垃圾回收这些Conn对象前,这些连接一直保持着
B端的连接超时后会主动发起关闭连接请求给A,此时A进入了CLOSE_WAIT状态,B进入了FIN_WAIT2状态,由于A迟迟不发送FIN给B,B端触发timeout直接进入了CLOSED状态。
这样一个场景B端由于有超时设置一个为60s,不会存在大量的FIN_WAIT2状态
但是A端就会残留大量的CLOSE_WAIT状态(CLOSE_WAIT状态也有超时,但是太大,默认为43200s,详情见tcp_timeout_close_wait系统配置)。还好A端的java虚拟机的最大对内存配置较小,由于CLOSE_WAIT状态连接同样占用了内存资源,数量很多后就会触发垃圾回收,此时A端的CLOSE_WAIT的连接Conn对象就会被销毁了(同时内存和句柄、端口等资源也被释放了)
LAST_ACK
当被动端调用close接口关闭连接后便会进入这个状态,同时发送一个FIN给对端。在接受对端的ACK确认后便会进入CLOSED状态,这个状态一般不易出现,除非网络中断,一般对端会很快给与响应的。这个状态只可能在被动端出现。
状态总结
主动端可能出现的状态:FIN_WAIT1、FIN_WAIT2、CLOSING、TIME_WAIT
被动端可能出现的状态:CLOSE_WAIT LAST_ACK
NOTE:
(1)主动端出现大量的FIN_WAIT1时需要注意网络是否畅通、出现大量的FIN_WAIT2需要仔细检查程序为何迟迟收不到对端的FIN(可能是主动方或者被动方的bug)、出现大量的TIME_WAIT需要注意系统的并发量/socket句柄资源/内存使用/端口号资源等。
(2)被动端出现大量的 CLOSE_WAIT 需要仔细检查为何自己迟迟不愿调用close关闭连接(可能是bug,socket打开用完没有关闭)
- 大小: 91 KB
- 大小: 64.2 KB
分享到:
相关推荐
TCP 连接状态详解 TCP 连接状态是指在 TCP 协议中,连接的不同阶段所对应的状态。这些状态包括 LISTEN、SYN-SENT、SYN-RECEIVED、ESTABLISHED、FIN-WAIT-1、FIN-WAIT-2、CLOSE-WAIT、CLOSING、LAST-ACK、TIME-WAIT...
- 客户端回应ACK报文确认连接关闭。 #### 3. IP协议详解 - **IP**(Internet Protocol)协议是网络层的核心协议,负责将数据包从源主机传输到目标主机。 - **IP地址**:用于唯一标识网络中的每一台设备,分为IPv4...
第18章 TCP连接的建立与终止 174 18.1 引言 174 18.2 连接的建立与终止 174 18.2.1 tcpdump的输出 174 18.2.2 时间系列 175 18.2.3 建立连接协议 175 18.2.4 连接终止协议 177 18.2.5 正常的tcpdump输出 177 18.3 ...
1. **TCP连接管理**:包括三次握手建立连接和四次挥手断开连接的过程。源码中会展示如何处理SYN、ACK、FIN等不同类型的报文段,以及超时重传和半关闭状态的处理。 2. **滑动窗口机制**:TCP使用滑动窗口来控制流量...
1. **TCP连接**:TCP是一种面向连接的协议,sock小程序可以模拟客户端和服务器的连接过程。通过三次握手建立连接,首先是SYN(同步序列编号)阶段,然后是SYN+ACK(同步+确认)回应,最后是ACK(确认)来完成连接。 ...
* TCP 连接关闭:发送方主机和目的主机建立 TCP 连接并完成数据传输后,会发送一个将结束标记置 1 的数据包,以关闭这个 TCP 连接,并同时释放该连接占用的缓冲区空间。 * TCP 重置:TCP 允许在传输的过程中突然中断...
6. **TCP连接建立与终止**:TCP的三次握手和四次挥手过程是连接管理的关键。三次握手确保了连接的可靠性,而四次挥手则确保了连接的正确关闭,防止半开连接。 7. **IP分片与重组**:当数据包过大无法通过某些网络时...
第18章 TCP连接的建立与终止 174 18.1 引言 174 18.2 连接的建立与终止 174 18.2.1 tcpdump的输出 174 18.2.2 时间系列 175 18.2.3 建立连接协议 175 18.2.4 连接终止协议 177 18.2.5 正常的tcpdump...
T/TCP是针对TCP协议的一个扩展,它为TCP添加了事务特性,使得TCP能够更加高效地处理短连接请求,特别是在需要频繁打开和关闭连接的Web应用中。T/TCP能够减少TCP三次握手的延迟,从而加快数据传输的开始。 随后,书...
此外,书中可能还会介绍TCP的连接管理、半关闭状态、全双工通信等高级主题。 通过阅读这三卷书,读者将能够全面理解TCP/IP协议栈的工作原理,掌握网络编程的基本技能,并了解如何利用TCP/IP进行高效、可靠的通信。...
TCP/IP详解——Linux版sock源码分析 TCP/IP协议栈是计算机网络通信的核心,它定义了数据在网络中传输的标准和规则。Linux操作系统以其开源、灵活的特性,成为了研究TCP/IP协议实现的重要平台。本篇文章将深入探讨...
T/TCP通过合并三次握手和四次挥手过程,减少了TCP连接中的分组数量,从而降低了延迟。书中通过对比UDP和TCP的客户-服务器程序,展示了T/TCP如何在保持TCP可靠性的前提下,提升性能。 2. UDP上的客户-服务器 UDP...
第18章 TCP连接的建立与终止 174 18.1 引言 174 18.2 连接的建立与终止 174 18.2.1 tcpdump的输出 174 18.2.2 时间系列 175 18.2.3 建立连接协议 175 18.2.4 连接终止协议 177 18.2.5 正常的tcpdump输出 177 18.3 ...
TCP连接采用三次握手建立,确保双方都准备好发送和接收数据。结束后,通过四次挥手释放连接,防止半关闭状态造成资源浪费。 7. **TCP流量控制与拥塞控制**: 通过滑动窗口机制实现流量控制,防止接收方来不及处理...
在TCP连接建立中,三次握手确保了双方都能正确建立连接,避免了半连接状态的出现。而四次挥手则确保了连接的可靠关闭,防止“死连接”占用资源。 此外,书中还介绍了TCP的流量控制和拥塞控制机制,如滑动窗口协议、...