TCP之有限状态机

上图为TCP状态变迁,其各个状态含义如下:
  1. CLOSE:状态机初始状态;
  2. LISTEN:被动打开,服务器端的状态变为LISTEN(监听);
    1. 被动打开:连接的一端的应用程序通知操作系统,希望建立一个传入的连接。这时候操作系统为这一端建立一个连接;
    2. 主动连接:应用程序通过主动打开请求来告诉操作系统建立一个连接;
  3. SYN_RCVD:服务器端收到SYN后,状态为SYN,发送SYN ACK;
  4. SYN_SENT:应用程序发送SYN后,状态为SYN_SENT;
  5. ESTABLISHED:SYN_RCVD收到ACK后,状态变为ESTABLISHED;SYN_SENT在收到SYN ACK,发送ACK后,状态变为ESTABLISHED;
  6. CLOSE_WAIT:服务器端在收到FIN后,发送ACK,状态变为CLOSE_WAIT;如果此时服务器端还有数据要发送,那么就发送,直到数据发送完毕,此时服务器发送FIN,状态变为LAST_ACK;
  7. FIN_WAIT_1:应用程序端发送FIN,准备断开TCP连接,状态从ESTABLISHED->FIN_WAIT_1;
  8. FIN_WAIT_2:应用程序端只收到服务器端的ACK,并没有收到FIN,说明服务器还有数据要传输,那么此时为半连接;
  9. TIME_WAIT:有如下两种方式进入该状态。TIME_WAIT是为了实现TCP全双工连接的可靠性关闭,用来重发可能丢失的ACK报文;需要持续2个MSL(最大报文生存时间)时间;假设应用程序端口在进入TIME_WAIT后,2个MSL后并没有收到FIN,说明应用程序最后发出的ACK已经被收到了;否则,会在2个MSL内再次收到ACK报文。
    1. FIN_WIAT_1状态进入:此时应用程序端口收到FIN ACK(而不是像FIN_WAIT_2那样只收到ACK,说明数据已发送完毕)并向服务器端发送ACK;
    2. FIN_WAIT_2状态进入:此时应用程序端口收到FIN,然后向服务器端发送ACK;
 
客户端应用程序的状态迁移路线:
  CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
以上流程是在程序正常的情况下应该有的流程,从上图中可以看到,在建立连接时,当客户端收到SYN报文的ACK以后,客户端就打开了数据交互地连接。而结束连接则通常是客户端主动结束的,客户端结束应用程序以后,需要经历FIN_WAIT_1,FIN_WAIT_2等状态。
 
服务器的状态迁移路线:
  CLOSED->LISTEN->SYN收到->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED
在建立连接的时候,服务器端是在第三次握手之后才进入数据交互状态,而关闭连接则是在关闭连接的第二次握手以后(注意不是第四次)。而关闭以后还要等待客户端给出最后的ACK包才能进入初始的状态。
 
其他状态迁移:
  上图中还有一些其他的状态迁移,这些状态迁移针对服务器和客户端两方面的总结如下 :
    • LISTEN->SYN_SENT,对于这个解释就很简单了,服务器有时候也要打开连接的嘛。  
    • SYN_SENT->SYN_RCVD,服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态调整到SYN_RCVD状态,准备进入ESTABLISHED
    • SYN_SENT->CLOSED,在发送超时的情况下,会返回到CLOSED状态。
    • SYN_RCVD->LISTEN,如果受到RST包,会返回到LISTEN状态。
    • SYN_RCVD->FIN_WAIT_1,这个迁移是说,可以不用到ESTABLISHED状态,而可以直接跳转到 FIN_WAIT_1状态并等待关闭。
 
原文地址:https://www.cnblogs.com/Jummyer/p/11068068.html