TCP状态流转图详解

描述

接下来再看一下著名的 TCP 状态流转图。

连接

CLOSED状态:表示初始状态。

LISTEN状态:表示服务器端的某个 socket 处于监听状态,可以接受连接。

SYN_SENT状态:在服务端监听后,客户端 socket 执行 CONNECT 连接时,客户端发送 SYN 报文,此时客户端就进入 SYN_SENT
状态,等待服务端的确认。

SYN_RCVD状态:表示服务端接收到了SYN 报文,在正常情况下,这个状态是服务器端的 socket 在建立 TCP连接时的三次握手会话过程中的一个中间状态,很短暂,基本上用网络查询工具 netstat 是很难看到这种状态的。因此这种状态时,当收到客户端的 ACK报文后,它会进入到 ESTABLISHED 状态。

ESTABLISHED状态:表示连接已经建立了。

FIN_WAIT_1状态:这个是已经建立连接之后,其中一方请求终止连接,等待对方的 FIN 报文 。

FIN_WAIT_1 状态是当 socket 在 ESTABLISHED 状态时,它想主动关闭连接,向对方发送了 FIN 报文,此时该 socket即进入到 FIN_WAIT_1 状态。而当对方回应 ACK 报文后,则进入到 FIN_WAIT_2 状态。

当然在实际的正常情况下,无论对方处于何种情况,都应该马上回应 ACK 报文,所以 FIN_WAIT_1 状态一般是比较难见到的,而FIN_WAIT_2 状态还可以用 netstat 看到。

FIN_WAIT_2状态:实际上 FIN_WAIT_2 状态下的 socket,表示半连接,即有一方要求关闭连接,但另外还告诉对方:我暂时还有点数据需要传送给你,请稍后关闭连接。

TIME_ WAIT状态:表示收到了对方的 FIN 报文,并发送出了 ACK 报文,就等 2MSL 后即可回到 CLOSED 可用状态了。如果在FIN_WAIT_1 状态下,收到了对方同时带 FIN 标志和 ACK 标志的报文时,可以直接进入到 TIME_WAIT 状态,而无需经过 FIN_WAIT_2状态。

CLOSING状态:这种状态比较特殊,实际情况中应该是很少见。正常情况下,当发送 FIN 报文后,按理来说是应该先收到(或同时收到)对方的ACK报文,再收到对方的 FIN 报文 。但是 CLOSING 状态表示你发送 FIN 报文后,并没有收到对方的 ACK 文,反而收到了对方的 FIN 报文。

如果双方几乎在同时关闭一个 socket 的话,那么就出现了双方同时发送 FIN 报文的情况,就会出现 CLOSING 状态,表示双方都正在关闭
socket 连接。

CLOSE_WAIT状态:表示在等待关闭。当对方关闭一个 socket 后发送 FIN 报文给自己时,系统将毫无疑问地会回应 ACK报文给对方,此时则进入到 CLOSE_WAIT 状态。

接下来呢,实际上你真正需要考虑的事情是察看你是否还有数据发送给对方,如果没有,那么你也就可以关闭这个socket了,发送 FIN报文给对方,即关闭连接 。CLOSE _WAIT 状态下,需要完成的事情是等待你去关闭连接。

LAST_ACK状态:这个状态还是比较好理解的,它是被动关闭 方在发送 FIN 报文后,最后等待对方的 ACK 报文。

CLOSED状态:当收到 ACK 报文后,也即可以进入到 CLOSED 可用状态了。

2MSL 等待状态:在 FIN_WAIT_2 发送了最后一个 ACK 数据报以后,要进入 TIME_WAIT
态,这个状态是防止最后一次握手的数据报没有传送到对方那里而准备的。

由于 socket 2MSL 状态,使得应用程序在 2MSL 时间内无法再次使用同一个 socket ,对于客户程序还好些,但是对于服务程序(httpd),它总是要使用同一个端口来进行服务,而在 2MSL 时间内,启动 httpd 就会出现错误(插口被使用)。

为了避免这个错误,服务器给出了一个平静时间的概念,这是说在 2MSL的时间内,虽然可以重新启动服务器,但是这个服务器还是要平静地等待 2MSL的时间才能进行下一次连接。

FIN WAIT_2 状态:这就是著名的半关闭状态了,这是在关闭连接时,客户端和服务器两次握手之后的状态 。

在这个状态下,应用程序还有接收数据的能力。已经无法发送数据,但是也有一种可能是,客户端处于FIN_WAIT_2 状态,而服务器则一直处于WAIT_CLOSE 状态,直到应用层来决定关闭这个状态。

RST 同时打开和同时关闭:RST 是另一种关闭连接的方式,应用程序应该可以判断RST 包的真实性,即是否为异常中止而同时打开和同时关闭则是两种特殊的 TCP 状态,发生的概率很小。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分