关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况。前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接。将关闭部分的状态转移摘出来,就得到了下图:
发生原因
通过图上,我们来分析,什么情况下,连接处于CLOSE_WAIT状态呢?
在被动关闭连接情况下,在已经接收到FIN,但是还没有发送自己的FIN的时刻,连接处于CLOSE_WAIT状态。
通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态。但是在一些特殊情况下,就会出现连接长时间处于CLOSE_WAIT状态的情况。
出现大量close_wait的现象,主要原因是某种情况下对方关闭了socket链接,但是我方忙与读或者写,没有关闭连接。代码需要判断socket,一旦读到0,断开连接,read返回负,检查一下errno,如果不是AGAIN,就断开连接。
more:
起初每个socket都是CLOSED状态,当客户端初使化一个连接,他发送一个SYN包到服务器,客户端进入SYN_SENT状态。服务器接收到SYN包,反馈一个SYN-ACK包,客户端接收后返馈一个ACK包客户端变成ESTABLISHED状态,如果长时间没收到SYN-ACK包,客户端超时进入CLOSED状态。
当服务器绑定并监听某一端口时,socket的状态是LISTEN,当客户企图建立连接时,服务器收到一个SYN包,并反馈SYN-ACK包。服务器状态变成SYN_RCVD,当客户端发送一个ACK包时,服务器socket变成ESTABLISHED状态。
当一个程序在ESTABLISHED状态时有两种图径关闭它,第一是主动关闭,第二是被动关闭。如果你要主动关闭的话,发送一个FIN包。当你的程序closesocket或者shutdown(标记),你的程序发送一个FIN包到peer,你的socket变成FIN_WAIT_1状态。peer反馈一个ACK包,你的socket进入FIN_WAIT_2状态。如果peer也在关闭连接,那么它将发送一个FIN包到你的电脑,你反馈一个ACK包,并转成TIME_WAIT状态。 TIME_WAIT状态又号2MSL等待状态。MSL意思是最大段生命周期(Maximum+Segment+Lifetime)表明一个包存在于网络上到被丢弃之间的时间。每个IP包有一个TTL(time_to_live),当它减到0时则包被丢弃。每个路由器使TTL减一并且传送该包。当一个程序进入TIME_WAIT状态时,他有2个MSL的时间,这个充许TCP重发最后的ACK,万一最后的ACK丢失了,使得FIN被重新传输。在2MSL等待状态完成后,socket进入CLOSED状态。
被动关闭:当程序收到一个FIN包从peer,并反馈一个ACK包,于是程序的socket转入CLOSE_WAIT状态。因为peer已经关闭了,所以不能发任何消息了。但程序还可以。要关闭连接,程序自已发送给自已FIN,使程序的TCP socket状态变成LAST_ACK状态,当程序从peer收到ACK包时,程序进入CLOSED状态。
http://blog.csdn.net/shootyou/article/details/6622226
相关推荐
TCP状态机是TCP连接的变化过程 :Tcp在三次握手和四次挥手的过程,就是一个tcp的状态说明,由于tcp是一个面向连接的,可靠的传输,每一次的传输都会经历连接,传输,关闭的过程,无论是哪个方向的传输,必须建立连接...
- **查看输出**:TcpTrace会实时输出捕获到的数据包信息,包括源/目标IP、端口、TCP状态变化等。 - **停止捕获**:当不再需要捕获时,使用控制命令停止TcpTrace进程。 - **分析结果**:使用文本编辑器或专用的...
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。本资源是TCP协议的状态变化图,不同状态收到不同包时的状态切换。
TCP/IP协议的状态迁移图是理解TCP/IP工作原理的关键,它展示了TCP连接从建立到终止会经过的各种状态,以及触发这些状态变化的事件。 首先,让我们详细解释各个状态: 1. LISTEN:监听状态。在这种状态下,服务器端...
3. TCP状态变化与应用程序交互 应用程序通过Socket API与TCP协议层交互,如`connect()`发起连接请求,TCP发送SYN段;`read()`返回0表示收到FIN段,表示对方关闭连接。阻塞的Socket函数返回意味着TCP协议层发生了对应...
因为这5个状态相互关 联,相互纠缠,而且状态变化触发都是由应用触发,但是又涉及操作系统和网 络,所以正确的理解TCP 在关闭时网络状态变化情况,为我们诊断网络中各种 问题,快速定位故障有着非常重要的作用和意义...
总结来说,状态模式在TCP连接案例中的应用展示了如何利用设计模式来管理复杂对象的行为变化。通过将TCP连接的不同阶段抽象为独立的状态类,我们可以更好地组织代码,提高代码的可读性和可扩展性。`StateTest`文件...
为了确保数据传输的可靠性与完整性,TCP采用了有限状态机(Finite State Machine, FSM)的概念来管理连接的状态变化过程。理解TCP有限状态机对于深入学习TCP的工作原理至关重要。 #### 二、TCP有限状态机的状态 ...
TCP(Transmission Control Protocol)是一种...总结来说,TCP状态转换图展示了TCP连接生命周期中的各种状态变化,这些状态确保了连接的可靠性,以及数据的准确传输。理解这些状态对于理解和调试网络连接问题至关重要。
【TCP状态变化】TCP连接经历了多个状态,如SYN_SENT、SYN_RCVD、ESTABLISHED、FIN_WAIT1、FIN_WAIT2等,总共11种状态。这些状态反映了数据的建立、传输、结束过程。理解这些状态对于排查网络问题和优化通信效率至关...
在网络游戏中,TCP连接的流量和时间序列特征可以被LSTM模型用来学习和预测状态变化。LSTM模型能够从大量的历史网络数据中学习模式,并预测未来可能出现的TCP状态,从而帮助游戏服务器做出更快速、更准确的响应。 在...
本文将详细介绍如何利用T-DIAG指令对S7通信和TCP通信进行连接状态诊断。 T-DIAG指令是西门子PLC编程软件SIMATIC Step 7中的一个功能强大的工具,它用于检测和报告通信连接的状态。这个指令可以提供详细的诊断信息,...
这些修改包括允许在SYN_SENT状态下发送多个报文段(前提是知道对等端也支持T/TCP),以及引入新的隐藏状态标志,如TH_SYN和TH_FIN,以更灵活地控制报文段的发送。 9.2 tcp_output函数 9.2.1 新的自动变量 在tcp_...
2. 监听`TcpClient`对象的`Connected`属性变化,以便检测连接状态。 3. 设置异常处理机制,捕获并处理`SocketException`等网络相关的错误。 4. 使用第三方库如`log4net`或`NLog`进行日志记录和分析。 5. 创建定时...
17. **TCP 状态变化**:当 B 机器重启,A 机器的状态会从 ESTABLISHED 转为 TIME_WAIT,等待足够时间确保 B 机器的确认信息到达。 18. **React setState 同步与异步**:在组件实例方法内(如事件处理器)直接调用 ...
6. **日志分析**:通过分析TCPTrace生成的日志文件,开发者可以查看连接状态的变化,找出导致错误或性能问题的原因。例如,如果频繁出现重传,可能表明网络不稳定或存在数据包丢失;如果窗口大小经常调整,可能意味...
3. **组织输出**:TCPAnalyser将解析的信息以结构化的方式输出,可能包括时间戳、源和目的地址、TCP状态变化、数据传输速率等。这使得用户能更容易地追踪TCP连接的完整生命周期。 4. **分析与应用**:根据输出结果...
5. **测试记录图**:除了文字日志,软件还提供图形化的测试记录,使用户能够直观地看到数据变化和通信状态,这对于理解和分析数据趋势很有帮助。 使用ModbusTCP_Master V2.0,工程师和技术人员可以有效地测试和诊断...
5. **日志记录**:为了便于分析,工具可能会保存所有交互的历史记录,包括发送的数据、接收的响应以及连接状态的变化。 6. **命令行参数**:高级的TCP发包工具可能支持命令行参数,允许自动化测试脚本调用工具,...