TCP 三次握手和四次挥手图解(有限状态机) (3)

服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为 seq=w,此时,服务器就进入了 LAST-ACK(最后确认)状态,等待客户端的确认。

客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是 seq=u+1,此时,客户端就进入了 TIME-WAIT(时间等待)状态。注意此时 TCP连接还没有释放,必须经过 2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入 CLOSED 状态。

服务器只要收到了客户端发出的确认,立即进入 CLOSED 状态。同样,撤销 TCB 后,就结束了这次的 TCP 连接。可以看到,服务器结束 TCP 连接的时间要比客户端早一些。

TCP 状态机

TCP 三次握手和四次挥手图解(有限状态机)

 

上图是 TCP 的状态机。

CLOSED:状态时初始状态。

LISTEN:被动打开,服务器端的 状态变为 LISTEN (监听)。被动打开的概念:连接的一端的应用程序通知操作系统,希望建立一个传入的连接。这时候操作系统为连接的这一端建立一个连接。与之对应的是主动连接:应用程序通过主动打开请求来告诉操作系统建立一个连接。

SYNRECVD:服务器端收到 SYN 后,状态为 SYN;发送 SYN ACK;

SYN_SENTY:应用程序发送 SYN 后,状态为 SYN_SENT;

ESTABLISHED:SYNRECVD 收到 ACK 后,状态为 ESTABLISHED; SYN_SENT 在收到 SYN ACK,发送 ACK,状态为 ESTABLISHED;

CLOSE_WAIT:服务器端在收到 FIN 后,发送 ACK,状态为 CLOSE_WAIT;如果此时服务器端还有数据需要发送,那么就发送,直到数据发送完毕;此时,服务器端发送FIN,状态变为 LAST_ACK;

FIN_WAIT_1:应用程序端发送 FIN,准备断开 TCP 连接;状态从 ESTABLISHED -> FIN_WAIT_1;

FIN_WAIT_2:应用程序端只收到服务器端得 ACK 信号,并没有收到FIN信号;说明服务器端还有数据传输,那么此时为半连接;

TIME_WAIT:有两种方式进入该状态:

FIN_WAIT_1进入:此时应用程序端口收到 FIN+ACK(而不是像 FIN_WAIT_2 那样只收到 ACK,说明数据已经发送完毕)并向服务器端口发送 ACK;

FIN_WAIT_2进入:此时应用程序端口收到了 FIN,然后向服务器端发送 ACK;TIME_WAIT 是为了实现 TCP 全双工连接的可靠性关闭,用来重发可能丢失的 ACK 报文;需要持续 2 个 MSL (最大报文生存时间):假设应用程序端口在进入 TIME_WAIT后,2 个 MSL 时间内并没有收到FIN,说明应用程序最后发出的 ACK 已经收到了;否则,会在 2 个 MSL 内在此收到ACK报文;

客户端应用程序的状态迁移图

客户端的状态可以用如下的流程来表示:

CLOSED -> SYN_SENT -> ESTABLISHED -> FIN_WAIT_1 -> FIN_WAIT_2 -> TIME_WAIT -> CLOSED

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfsys.html