TCP 狀態分析
阿新 • • 發佈:2018-12-09
一,狀態遷移的規律
從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