TCP 狀态機
/*
怎麼分析下面這幅圖:
粗線 主動發起連接配接 ------ 這一個用戶端模型(簡單了解)
虛線 被動發起連接配接 ------ 這一個伺服器模型(簡單了解)
細線 兩端同時操作部分
*/
主動發起三次握手
CLOSED
表示初始狀态
LISTEN
該狀态表示伺服器端的某個SOCKET處于監聽狀态,可以接受連接配接。
SYN_SENT
這個狀态與SYN_RCVD遙相呼應,當用戶端SOCKET執行CONNECT連接配接時,它首先發送SYN封包,随即進入到了SYN_SENT狀态,并等待服務端的發送三次握手中的第2個封包。SYN_SENT狀态表示用戶端已發送SYN封包。
SYN_RCVD
該狀态表示接收到SYN封包,在正常情況下,這個狀态是伺服器端的SOCKET在建立TCP連接配接時的三次握手會話過程中的一個中間狀态,很短暫。此種狀态時,當收到用戶端的ACK封包後,會進入到ESTABLISHED狀态。
ESTABLISHED
表示連接配接已經建立。
FIN_WAIT_1
FIN_WAIT_1和FIN_WAIT_2狀态的真正含義都是表示等待對方的FIN封包。差別是:
FIN_WAIT_1狀态是當socket在ESTABLISHED狀态時,想主動關閉連接配接,向對方發送了FIN封包,此時該socket進入到FIN_WAIT_1狀态。
FIN_WAIT_2狀态是當對方回應ACK後,該socket進入到FIN_WAIT_2狀态,正常情況下,對方應馬上回應ACK封包,是以FIN_WAIT_1狀态一般較難見到,而FIN_WAIT_2狀态可用netstat看到。
FIN_WAIT_2
主動關閉連結的一方,發出FIN收到ACK以後進入該狀态。稱之為半連接配接或半關閉狀态。該狀态下的socket隻能接收資料,不能發。
TIME_WAIT
表示收到了對方的FIN封包,并發送出了ACK封包,等2MSL後即可回到CLOSED可用狀态。如果FIN_WAIT_1狀态下,收到對方同時帶 FIN标志和ACK标志的封包時,可以直接進入到TIME_WAIT狀态,而無須經過FIN_WAIT_2狀态。
CLOSING
這種狀态較特殊,屬于一種較罕見的狀态。正常情況下,當你發送FIN封包後,按理來說是應該先收到(或同時收到)對方的 ACK封包,再收到對方的FIN封包。但是CLOSING狀态表示你發送FIN封包後,并沒有收到對方的ACK封包,反而卻也收到了對方的FIN封包。什麼情況下會出現此種情況呢?如果雙方幾乎在同時close一個SOCKET的話,那麼就出現了雙方同時發送FIN封包的情況,也即會出現CLOSING狀态,表示雙方都正在關閉SOCKET連接配接。
CLOSE_WAIT
此種狀态表示在等待關閉。當對方關閉一個SOCKET後發送FIN封包給自己,系統會回應一個ACK封包給對方,此時則進入到CLOSE_WAIT狀态。接下來呢,察看是否還有資料發送給對方,如果沒有可以 close這個SOCKET,發送FIN封包給對方,即關閉連接配接。是以在CLOSE_WAIT狀态下,需要關閉連接配接。
LAST_ACK
該狀态是被動關閉一方在發送FIN封包後,最後等待對方的ACK封包。當收到ACK封包後,即可以進入到CLOSED可用狀态。