TCP 状态变化

网络 网络管理
关闭socket分为主动关闭和被动关闭两种情况。前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接。

TCP 状态变化

关闭socket分为主动关闭(Active closure)和被动关闭(Passive closure)两种情况。前者是指有本地主机主动发起的关闭;而后者则是指本地主机检测到远程主机发起关闭之后,作出回应,从而关闭整个连接。将关闭部分的状态转移摘出来,就得到了下图:

TCP 状态变化

 

发生原因

通过图上,我们来分析,什么情况下,连接处于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状态。

 

责任编辑:林琳 来源: iteye
相关推荐

2023-12-01 14:57:22

TCP连接

2010-07-05 17:04:42

Netstat TCP

2023-11-29 16:29:09

线程java

2015-10-13 15:09:31

2023-10-26 07:15:46

2020-02-18 23:53:19

TCP网络协议

2012-12-26 13:26:38

Android开发飞行模式

2014-08-22 09:10:46

2019-02-25 17:42:43

TCP协议状态转换

2014-09-19 09:46:46

TCPIP

2015-10-10 09:51:51

TCP网络协议客户端

2015-10-12 08:33:06

TCP网络协议服务端

2019-09-02 10:39:15

TCPWindows连接

2023-05-08 23:20:49

WebYARN管理

2011-08-08 16:45:02

iPhone NSLog Release

2010-08-09 13:05:24

Flex4beta

2023-07-24 16:28:51

@State@Observed装饰器监听

2015-03-27 10:18:25

TCP协议CLOSE_WAIT状服务器异常

2011-07-08 18:34:34

iOS Debug Release

2020-06-29 14:50:47

TCP状态ACK
点赞
收藏

51CTO技术栈公众号