一,状态迁移的规律
从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
- 先收到对端FIN报文,
- 未收到对端发送的ACK
- 发送对端FIN报文的ACK。
FIN_WAIT_1 –> FIN_WAIT_2
- 未收到对端FIN报文
- 收到对方对我方发送FIN的ACK
FIN_WAIT_1 –> TIME_WAIT
- 先收到对端FIN报文,
- 也收到对端发送的ACK
- 最后发送对端FIN报文的ACK。
三,产生大量某种状态的原因
大量FIN_WAIT_1状态
无法从FIN_WAIT_1 到 CLOSING
已经发送FIN报文
未收到FIN报文
未收到对端ACK
无法从FIN_WAIT_1到 FIN_WAIT_2
- 已经发送FIN
- 未收到对端发送的ACK
无法从FIN_WAIT_1到TIME_WAIT
- 已经发送FIN
- 未收到对端发送的FIN
- 未收到对端发送的ACK
大量FIN_WAIT_2
无法从FIN_WAIT_2到TIME_WAIT
- 未收到对端发送的FIN
大量CLOSING
无法从CLOSING到TIME_WAIT
- 无法接收到对端发送的ACK
大量CLOSE_WAIT
无法从CLOSE_WAIT到LAST_ACK
- 收到对端发送的FIN并发送ACK
- 但是没有发送本端FIN,可能是没有调用close函数
大量LAST_ACK
无法从LAST_ACK到CLOSED
- 收到对端发送的FIN,并回复ACK
- 发送本端的FIN
- 未收到对端发送的ACK
四,建立连接状态迁移
非同时打开情况:
client:
SYN_SENT–> ESTABLISHED:
- 已经发送SYN,调用connect函数
收到SYN + ACK
发送ACK
Server:
LISTEN –> SYN_REVD:
- 监听端口,调用listen函数
- 收到SYN
- 发送SYN + ACK
SYN_REVD –> ESTABLISHED:
- 收到ACK
大量SYN_SENT:
无法从SYN_SENT到ESTABLISHED:
- 未收到server端的SYN+ACK
无法从SYN_REVD到ESTABLISHED:
- 未收到client发送的ACK
同时打开情况:没有server和client的区分了
SYN_SENT–> SYN_REVD:
- 已经发送SYN,调用connect函数
- 收到对端SYN
SYN_REVD –> ESTABLISHED:
- 发送 SYN +ACK
- 收到SYN + ACK
大量SYN_SENT:
无法从SYN_SENT到SYN_REVD:
- 未收到对端SYN
无法从SYN_REVD到ESTABLISHED:
- 未收到对端的SYN+ACK
参考:
https://www.jianshu.com/p/3c7a0771b67e
https://blog.csdn.net/wuji0447/article/details/78356875
https://blog.csdn.net/huoqubing/article/details/6126189