zoukankan      html  css  js  c++  java
  • 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状态并等待关闭。
     
  • 相关阅读:
    C 工具库7:local_pool
    进程间传递文件描述符
    ucontext实现的用户级多线程框架
    ucontext实现的用户级多线程框架2(抢先式多线程)
    网络接收缓存的设计
    利用用户级线程提高多线程应用的性能
    死锁检测
    网络服务器发送封包设计
    C 工具库8:map
    ucontext实现的用户级多线程框架3(实现echo服务器)
  • 原文地址:https://www.cnblogs.com/Jummyer/p/11068068.html
Copyright © 2011-2022 走看看