手绘TCP状态转化图,详细介绍每一步变化的原因

这个图主要是为了更清楚的看出TCP连接的各种状态的关系

这个最好还是在理解三次握手和四次握手的基础上,然后对照呢个图理解更深

整张图主要分为三个部分:

  1. 客户端的状态变化
  2. 服务器端的状态变化
  3. 出现的各种意外情况

一,客户端的状态变化

我们讲这个图从ESTABLISHED分为上下两个部分


  1. 上面两个是TCP三次握手的前两次
          第一次握手,首先客户端主动向服务器发送SYN,请求连接。状态变为SYN-SENT
          第二次握手,客户端再接收到服务器发回的SYN+ACK,此时客户端已经确定自己能够发送消息和接收消息,所以变为ESTABLISHED状态,可以进行数据传送
        (尽管第三次握手还没有,整个连接还不完整,但是对于客户端单方面来说已经可以了

  2. 中间是数据交互的过程

  3. 下面就是四次握手的过程
         第一次挥手,客户端想要关闭连接,因此发送FIN,状态变为FIN-WAIT-1
         第二次挥手,客户端收到服务器的ACK,状态变为FIN-WAIT-2
         第三次和第四次挥手,客户端再次收到服务器的FIN消息,并主动发送ACK表示确认,状态变为TIME-WAIT状态
         经过2MSL事件后,关闭,再变为开始的CLOSED状态

二,服务器端的状态变化

我们讲这个图从ESTABLISHED分为上下两个部分


  1. 上面两个是TCP三次握手
          首先第一个LISTEN状态,当服务器打开就是处于监听状态了。
          第一次握手和第二次,服务器端收到客户端发送SYN,然后回复SYN+ACK,此时证明服务器已经具有接收信息的能力了,状态变为SYN-RCVD
          第三次握手,服务器端再次接收到客户端发送的ACK,此时服务器端也确定自己具有发送消息和接收消息能力了,所以也变为ESTABLISHED状态,可以进行数据传送
        (此时三次握手成功)

  2. 中间是数据交互的过程

  3. 下面是四次握手
         第一次挥手和第二次挥手,服务器端收到客户端发送的FIN,然后第一次发送ACK,但是可能消息还没有接收完,需要等待一会。状态变为CLOSE-WAIT
         第三次挥手,等到信息接收完毕之后,服务器再次向客户但发送的FIN,但是此时如果客户端再次发送数据,还是需要接收,所以还未关闭,状态变为LAST-ACK
         第四次挥手,服务器端再次收ACK表示确认,表示客户端已经关闭,自己也随之关闭。状态变为开始的CLOSED状态

三,出现的各种意外情况

我们分部分看这种错误可能出现的原因:

  1. 最上面LISTNE->CLOSED
    服务器在监听端口的时候,此时有些资源加载的有问题导致服务没开启

中间的三角形:

  1. 收到RST,从三次握手的前两次重新变为监听状态
      RST代表复位,当RST=1时,表明TCP连接中出现严重差错,必须释放连接,然后再重新建议运输连接。
  2. 从LISTEN->SYN-SENT
      服务器有时候也要打开连接
  3. 从SYN-SENT->SYN-RCVD
      服务器和客户端在SYN_SENT状态下如果收到SYN数据报,则都需要发送SYN的ACK数据报并把自己的状态调整到SYN收到状态,准备进入ESTABLISHED

  1. 旁边SYN-SENT->CLOSED
     长时间连接不到,发送超时,自然就关闭了

  1. 下面的SYN-RCVD->FIN-WAIT-1
    这里表明可以不用到ESTABLISHED状态,而可以直接跳转到FIN_WAIT_1状态并等待关闭。

最下面的三角形:

  1. FIN-WAIT-1->TIME-WAIT
    表示直接将四次握手变为了三次,即发送的数据都接收完了,可以直接关闭了
  2. ​​​​​​​从FIN-WAIT-1->CLOSING
    收到了FIN,但是没有收到ACK,因此变为CLOSING状态,即等待远程TCP对连接中断的确认;
  3. 从CLOSING->TIME-WAIT
    收到ACK确认,关闭连接

上面就是TCP状态连接图的每一部分的解析即原因。

可以多看几次这个图,然后分为三个部分,一个部分一个部分分析。

猜你喜欢

转载自blog.csdn.net/qq_46423166/article/details/113566063