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状态并等待关闭。