CLOSED:初始狀態(tài)钩乍,表示TCP連接是“關(guān)閉著的”或“未打開的”辞州。
LISTEN :表示服務(wù)器端的某個(gè)SOCKET處于監(jiān)聽(tīng)狀態(tài),可以接受客戶端的連接寥粹。
SYN_RCVD :表示服務(wù)器接收到了來(lái)自客戶端請(qǐng)求連接的SYN報(bào)文变过。在正常情況下,這個(gè)狀態(tài)是服務(wù)器端的SOCKET在建立TCP連接時(shí)的三次握手會(huì)話過(guò)程中的一個(gè)中間狀態(tài)涝涤,很短暫媚狰,基本上用netstat很難看到這種狀態(tài),除非故意寫一個(gè)監(jiān)測(cè)程序阔拳,將三次TCP握手過(guò)程中最后一個(gè)ACK報(bào)文不予發(fā)送哈雏。當(dāng)TCP連接處于此狀態(tài)時(shí),再收到客戶端的ACK報(bào)文衫生,它就會(huì)進(jìn)入到ESTABLISHED 狀態(tài)裳瘪。
SYN_SENT :這個(gè)狀態(tài)與SYN_RCVD 狀態(tài)相呼應(yīng),當(dāng)客戶端SOCKET執(zhí)行connect()進(jìn)行連接時(shí)罪针,它首先發(fā)送SYN報(bào)文彭羹,然后隨即進(jìn)入到SYN_SENT 狀態(tài),并等待服務(wù)端的發(fā)送三次握手中的第2個(gè)報(bào)文泪酱。SYN_SENT 狀態(tài)表示客戶端已發(fā)送SYN報(bào)文派殷。
ESTABLISHED :表示TCP連接已經(jīng)成功建立还最。
FIN_WAIT_1 :這個(gè)狀態(tài)得好好解釋一下,其實(shí)FIN_WAIT_1 和FIN_WAIT_2 兩種狀態(tài)的真正含義都是表示等待對(duì)方的FIN報(bào)文毡惜。而這兩種狀態(tài)的區(qū)別是:FIN_WAIT_1狀態(tài)實(shí)際上是當(dāng)SOCKET在ESTABLISHED狀態(tài)時(shí)拓轻,它想主動(dòng)關(guān)閉連接,向?qū)Ψ桨l(fā)送了FIN報(bào)文经伙,此時(shí)該SOCKET進(jìn)入到FIN_WAIT_1 狀態(tài)扶叉。而當(dāng)對(duì)方回應(yīng)ACK報(bào)文后,則進(jìn)入到FIN_WAIT_2 狀態(tài)帕膜。當(dāng)然在實(shí)際的正常情況下枣氧,無(wú)論對(duì)方處于任何種情況下,都應(yīng)該馬上回應(yīng)ACK報(bào)文垮刹,所以FIN_WAIT_1 狀態(tài)一般是比較難見(jiàn)到的达吞,而FIN_WAIT_2 狀態(tài)有時(shí)仍可以用netstat看到。
FIN_WAIT_2 :上面已經(jīng)解釋了這種狀態(tài)的由來(lái)荒典,實(shí)際上FIN_WAIT_2狀態(tài)下的SOCKET表示半連接酪劫,即有一方調(diào)用close()主動(dòng)要求關(guān)閉連接。注意:FIN_WAIT_2 是沒(méi)有超時(shí)的(不像TIME_WAIT 狀態(tài))寺董,這種狀態(tài)下如果對(duì)方不關(guān)閉(不配合完成4次揮手過(guò)程)契耿,那這個(gè) FIN_WAIT_2 狀態(tài)將一直保持到系統(tǒng)重啟,越來(lái)越多的FIN_WAIT_2 狀態(tài)會(huì)導(dǎo)致內(nèi)核crash螃征。
TIME_WAIT :表示收到了對(duì)方的FIN報(bào)文搪桂,并發(fā)送出了ACK報(bào)文。 TIME_WAIT狀態(tài)下的TCP連接會(huì)等待2*MSL(Max Segment Lifetime盯滚,最大分段生存期踢械,指一個(gè)TCP報(bào)文在Internet上的最長(zhǎng)生存時(shí)間。每個(gè)具體的TCP協(xié)議實(shí)現(xiàn)都必須選擇一個(gè)確定的MSL值魄藕,RFC 1122建議是2分鐘内列,但BSD傳統(tǒng)實(shí)現(xiàn)采用了30秒,Linux可以cat /proc/sys/net/ipv4/tcp_fin_timeout看到本機(jī)的這個(gè)值)背率,然后即可回到CLOSED 可用狀態(tài)了话瞧。如果FIN_WAIT_1狀態(tài)下,收到了對(duì)方同時(shí)帶FIN標(biāo)志和ACK標(biāo)志的報(bào)文時(shí)寝姿,可以直接進(jìn)入到TIME_WAIT狀態(tài)交排,而無(wú)須經(jīng)過(guò)FIN_WAIT_2狀態(tài)。(這種情況應(yīng)該就是四次揮手變成三次揮手的那種情況)
CLOSING :這種狀態(tài)在實(shí)際情況中應(yīng)該很少見(jiàn)饵筑,屬于一種比較罕見(jiàn)的例外狀態(tài)埃篓。正常情況下,當(dāng)一方發(fā)送FIN報(bào)文后根资,按理來(lái)說(shuō)是應(yīng)該先收到(或同時(shí)收到)對(duì)方的ACK報(bào)文架专,再收到對(duì)方的FIN報(bào)文同窘。但是CLOSING 狀態(tài)表示一方發(fā)送FIN報(bào)文后,并沒(méi)有收到對(duì)方的ACK報(bào)文部脚,反而卻也收到了對(duì)方的FIN報(bào)文想邦。什么情況下會(huì)出現(xiàn)此種情況呢?那就是當(dāng)雙方幾乎在同時(shí)close()一個(gè)SOCKET的話委刘,就出現(xiàn)了雙方同時(shí)發(fā)送FIN報(bào)文的情況丧没,這是就會(huì)出現(xiàn)CLOSING 狀態(tài),表示雙方都正在關(guān)閉SOCKET連接钱雷。
CLOSE_WAIT :表示正在等待關(guān)閉。怎么理解呢吹零?當(dāng)對(duì)方close()一個(gè)SOCKET后發(fā)送FIN報(bào)文給自己罩抗,你的系統(tǒng)毫無(wú)疑問(wèn)地將會(huì)回應(yīng)一個(gè)ACK報(bào)文給對(duì)方,此時(shí)TCP連接則進(jìn)入到CLOSE_WAIT狀態(tài)灿椅。接下來(lái)呢套蒂,你需要檢查自己是否還有數(shù)據(jù)要發(fā)送給對(duì)方,如果沒(méi)有的話茫蛹,那你也就可以close()這個(gè)SOCKET并發(fā)送FIN報(bào)文給對(duì)方操刀,即關(guān)閉自己到對(duì)方這個(gè)方向的連接。有數(shù)據(jù)的話則看程序的策略婴洼,繼續(xù)發(fā)送或丟棄骨坑。簡(jiǎn)單地說(shuō),當(dāng)你處于CLOSE_WAIT 狀態(tài)下柬采,需要完成的事情是等待你去關(guān)閉連接欢唾。
LAST_ACK :當(dāng)被動(dòng)關(guān)閉的一方在發(fā)送FIN報(bào)文后,等待對(duì)方的ACK報(bào)文的時(shí)候粉捻,就處于LAST_ACK 狀態(tài)礁遣。當(dāng)收到對(duì)方的ACK報(bào)文后,也就可以進(jìn)入到CLOSED 可用狀態(tài)了肩刃。