zoukankan      html  css  js  c++  java
  • TCP的状态转移

    状态转移图

    状态分析

    客户端

    • CLOSED
      初始状态

      1. 调用connect将发起主动打开,发送SYN J到服务端,进入SYN_SENT状态。
    • SYN_SENT
      客户端已经发送SYN报文

      1. 接收到服务端发回的ACK J+1,以及SYN K,并且发回ACK K+1进入ESTABLISHED状态.此时表明连已经建立了。
      2. 主动调用close或者超时将回到CLOSED状态。
    • ESTABLISHED
      连接已经建立,可以进行数据传输

      1. 主动调用close,发送FIN到服务端,进入FIN_WAIT_1状态。
    • FIN_WAIT_1
      主动调用了close,发送FIN到服务端,等待服务端应答。

      1. 接收服务端应答的ACK,进入FIN_WAIT_2状态。
      2. 接收到服务端调用close发来的SYN,ACK并回反ACK进入TIME_WAIT状态。
      3. 接受到了服务端发来的FIN,并应答ACK,进入CLOSING状态。这种状态比较少见,一般只有双方同时close时才有可能出现。
    • FIN_WAIT_2
      等待服务端close。

      1. 接收服务端FIN,应答ACK,进入TIME_WAIT状态。
    • CLOSING
      应答了服务端的FIN,等待服务端的应答。

      1. 接收服务端的ACK,进入TIME_WAIT状态。
    • TIME_WAIT

      1. 等待2MSL后,回到CLOSED状态。

    服务端

    • CLOSED
      初始状态
      1. 调用accept进入监听状态。
    • LISTEN
      监听状态,等待客户的连接。
      1. 接收SYN,发送ACK,以及SYN,进入SYN_RCVD状态。
    • SYN_RCVD
      等待客户的ACK。
      1. 接收ACK,进入ESTABLISHED状态。
    • ESTABLISHED
      数据传输状态。
      1. 接受客户close发送的FIN,并应答ACK,进入CLOSE_WAIT状态。
    • CLOSE_WAIT
      准备调用close。
      1. 调用close,发送FIN到客户端,进入LAST_ACK状态。
    • LAST_ACK
      等待客户端的ACK。
      1. 接收客户端的ACK,回到CLOSED状态。

    关于TIME_WAIT状态存在的原因

    1. 实现TCP全双工连接的终止。当客户主动中断连接时,根据TCP协议,客户必须接收服务器的FIN信息并给予ACK应答。因此客户需要维护状态信息,以便能回复ACK。如果过程中ACK丢失,它必须能够重传,否则将会产生错误。而处于TIME_WAIT状态没有关闭可以实现。

    2. 允许老的重复分节在网络中消失。如果一个TCP连接关闭,过了一会又在相同的IP和端口建立新的连接。TCP需要防止之前连接没有传完的数据在新的连接出现。而如果连接处于TIME_WAIT状态,就不会给这个相同IP和端口建立新的连接。之前没有传完的数据将会在TIME_WAIT结束前在网络中消失,因为TIME_WAIT的持续时间是数据的生存时间MSL的两倍。

    参考:

    http://blog.csdn.net/xvjixiang/article/details/26811717
    http://www.cnblogs.com/lenolix/articles/3762575.html

  • 相关阅读:
    CF343D Water Tree
    CF340B Maximal Area Quadrilateral
    测试环境/生产环境,接口地址配置
    json-server MOCK方案
    vscode prettier保存代码时自动格式化
    蓝鲸6.0前置准备
    nginx日志提取案列
    蓝鲸模拟考试
    部署维护
    第一次模拟考
  • 原文地址:https://www.cnblogs.com/cknightx/p/7501939.html
Copyright © 2011-2022 走看看