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状态并等待关闭。
     
  • 相关阅读:
    hadoop中namenode发生故障的处理方法
    开启虚拟机所报的错误:VMware Workstation cannot connect to the virtual machine. Make sure you have rights to run the program, access all directories the program uses, and access all directories for temporary fil
    Hbase的安装与部署(集群版)
    分别用反射、编程接口的方式创建DataFrame
    用Mapreduce求共同好友
    SparkSteaming中直连与receiver两种方式的区别
    privot函数使用
    Ajax无刷新显示
    使用ScriptManager服务器控件前后台数据交互
    数据库知识
  • 原文地址:https://www.cnblogs.com/Jummyer/p/11068068.html
Copyright © 2011-2022 走看看