1. 程式人生 > >TCP 狀態分析

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