TCP 状态分析

一,状态迁移的规律

从FIN_WAIT_1 进行状态迁移有三个条件

  • 接收FIN
  • 接收ACK
  • 发送ACK

三个条件顺序不一样,迁移的状态也不同,并且接收FIN必须在发送ACK之前,所以只有以下几种情况。

条件:FIN,recv ACK,sent ACK

迁移后状态:TIME_WAIT

条件:FIN,sent ACK,recv ACK

迁移后状态:CLOSING, TIME_WAIT

条件:recv ACK, FIN, sent ACK

迁移后状态:FIN_WAIT_2, TIME_WAIT

二,具体分析迁移条件

FIN_WAIT_1 – > CLOSING

  1. 先收到对端FIN报文,
  2. 未收到对端发送的ACK
  3. 发送对端FIN报文的ACK。

FIN_WAIT_1 –> FIN_WAIT_2

  1. 未收到对端FIN报文
  2. 收到对方对我方发送FIN的ACK

FIN_WAIT_1 –> TIME_WAIT

  1. 先收到对端FIN报文,
  2. 也收到对端发送的ACK
  3. 最后发送对端FIN报文的ACK。

三,产生大量某种状态的原因

大量FIN_WAIT_1状态

无法从FIN_WAIT_1 到 CLOSING

  1. 已经发送FIN报文

  2. 未收到FIN报文

  3. 未收到对端ACK

无法从FIN_WAIT_1到 FIN_WAIT_2

  1. 已经发送FIN
  2. 未收到对端发送的ACK

无法从FIN_WAIT_1到TIME_WAIT

  1. 已经发送FIN
  2. 未收到对端发送的FIN
  3. 未收到对端发送的ACK

大量FIN_WAIT_2

无法从FIN_WAIT_2到TIME_WAIT

  1. 未收到对端发送的FIN

大量CLOSING

无法从CLOSING到TIME_WAIT

  1. 无法接收到对端发送的ACK

大量CLOSE_WAIT

无法从CLOSE_WAIT到LAST_ACK

  1. 收到对端发送的FIN并发送ACK
  2. 但是没有发送本端FIN,可能是没有调用close函数

大量LAST_ACK

无法从LAST_ACK到CLOSED

  1. 收到对端发送的FIN,并回复ACK
  2. 发送本端的FIN
  3. 未收到对端发送的ACK

四,建立连接状态迁移

非同时打开情况:

client:

SYN_SENT–> ESTABLISHED:

  1. 已经发送SYN,调用connect函数
  2. 收到SYN + ACK

  3. 发送ACK

Server:

LISTEN –> SYN_REVD:

  1. 监听端口,调用listen函数
  2. 收到SYN
  3. 发送SYN + ACK

SYN_REVD –> ESTABLISHED:

  1. 收到ACK

大量SYN_SENT:

无法从SYN_SENT到ESTABLISHED:

  1. 未收到server端的SYN+ACK

无法从SYN_REVD到ESTABLISHED:

  1. 未收到client发送的ACK

同时打开情况:没有server和client的区分了

SYN_SENT–> SYN_REVD:

  1. 已经发送SYN,调用connect函数
  2. 收到对端SYN

SYN_REVD –> ESTABLISHED:

  1. 发送 SYN +ACK
  2. 收到SYN + ACK

大量SYN_SENT:

无法从SYN_SENT到SYN_REVD:

  1. 未收到对端SYN

无法从SYN_REVD到ESTABLISHED:

  1. 未收到对端的SYN+ACK

参考:
https://www.jianshu.com/p/3c7a0771b67e
https://blog.csdn.net/wuji0447/article/details/78356875
https://blog.csdn.net/huoqubing/article/details/6126189

猜你喜欢

转载自blog.csdn.net/yrx0619/article/details/82659598