接下來(lái)再看一下著名的 TCP 狀態(tài)流轉(zhuǎn)圖。
CLOSED狀態(tài):表示初始狀態(tài)。
LISTEN狀態(tài):表示服務(wù)器端的某個(gè) socket 處于監(jiān)聽(tīng)狀態(tài),可以接受連接。
SYN_SENT狀態(tài):在服務(wù)端監(jiān)聽(tīng)后,客戶端 socket 執(zhí)行 CONNECT 連接時(shí),客戶端發(fā)送 SYN 報(bào)文,此時(shí)客戶端就進(jìn)入 SYN_SENT
狀態(tài),等待服務(wù)端的確認(rèn)。
SYN_RCVD狀態(tài):表示服務(wù)端接收到了SYN 報(bào)文,在正常情況下,這個(gè)狀態(tài)是服務(wù)器端的 socket 在建立 TCP連接時(shí)的三次握手會(huì)話過(guò)程中的一個(gè)中間狀態(tài),很短暫,基本上用網(wǎng)絡(luò)查詢工具 netstat 是很難看到這種狀態(tài)的。因此這種狀態(tài)時(shí),當(dāng)收到客戶端的 ACK報(bào)文后,它會(huì)進(jìn)入到 ESTABLISHED 狀態(tài)。
ESTABLISHED狀態(tài):表示連接已經(jīng)建立了。
FIN_WAIT_1狀態(tài):這個(gè)是已經(jīng)建立連接之后,其中一方請(qǐng)求終止連接,等待對(duì)方的 FIN 報(bào)文 。
FIN_WAIT_1 狀態(tài)是當(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)還可以用 netstat 看到。
FIN_WAIT_2狀態(tài):實(shí)際上 FIN_WAIT_2 狀態(tài)下的 socket,表示半連接,即有一方要求關(guān)閉連接,但另外還告訴對(duì)方:我暫時(shí)還有點(diǎn)數(shù)據(jù)需要傳送給你,請(qǐng)稍后關(guān)閉連接。
TIME_ WAIT狀態(tài):表示收到了對(duì)方的 FIN 報(bào)文,并發(fā)送出了 ACK 報(bào)文,就等 2MSL 后即可回到 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)。
CLOSING狀態(tài):這種狀態(tài)比較特殊,實(shí)際情況中應(yīng)該是很少見(jiàn)。正常情況下,當(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 文,反而收到了對(duì)方的 FIN 報(bào)文。
如果雙方幾乎在同時(shí)關(guān)閉一個(gè) socket 的話,那么就出現(xiàn)了雙方同時(shí)發(fā)送 FIN 報(bào)文的情況,就會(huì)出現(xiàn) CLOSING 狀態(tài),表示雙方都正在關(guān)閉
socket 連接。
CLOSE_WAIT狀態(tài):表示在等待關(guān)閉。當(dāng)對(duì)方關(guān)閉一個(gè) socket 后發(fā)送 FIN 報(bào)文給自己時(shí),系統(tǒng)將毫無(wú)疑問(wèn)地會(huì)回應(yīng) ACK報(bào)文給對(duì)方,此時(shí)則進(jìn)入到 CLOSE_WAIT 狀態(tài)。
接下來(lái)呢,實(shí)際上你真正需要考慮的事情是察看你是否還有數(shù)據(jù)發(fā)送給對(duì)方,如果沒(méi)有,那么你也就可以關(guān)閉這個(gè)socket了,發(fā)送 FIN報(bào)文給對(duì)方,即關(guān)閉連接 。CLOSE _WAIT 狀態(tài)下,需要完成的事情是等待你去關(guān)閉連接。
LAST_ACK狀態(tài):這個(gè)狀態(tài)還是比較好理解的,它是被動(dòng)關(guān)閉 方在發(fā)送 FIN 報(bào)文后,最后等待對(duì)方的 ACK 報(bào)文。
CLOSED狀態(tài):當(dāng)收到 ACK 報(bào)文后,也即可以進(jìn)入到 CLOSED 可用狀態(tài)了。
2MSL 等待狀態(tài):在 FIN_WAIT_2 發(fā)送了最后一個(gè) ACK 數(shù)據(jù)報(bào)以后,要進(jìn)入 TIME_WAIT
態(tài),這個(gè)狀態(tài)是防止最后一次握手的數(shù)據(jù)報(bào)沒(méi)有傳送到對(duì)方那里而準(zhǔn)備的。
由于 socket 2MSL 狀態(tài),使得應(yīng)用程序在 2MSL 時(shí)間內(nèi)無(wú)法再次使用同一個(gè) socket ,對(duì)于客戶程序還好些,但是對(duì)于服務(wù)程序(httpd),它總是要使用同一個(gè)端口來(lái)進(jìn)行服務(wù),而在 2MSL 時(shí)間內(nèi),啟動(dòng) httpd 就會(huì)出現(xiàn)錯(cuò)誤(插口被使用)。
為了避免這個(gè)錯(cuò)誤,服務(wù)器給出了一個(gè)平靜時(shí)間的概念,這是說(shuō)在 2MSL的時(shí)間內(nèi),雖然可以重新啟動(dòng)服務(wù)器,但是這個(gè)服務(wù)器還是要平靜地等待 2MSL的時(shí)間才能進(jìn)行下一次連接。
FIN WAIT_2 狀態(tài):這就是著名的半關(guān)閉狀態(tài)了,這是在關(guān)閉連接時(shí),客戶端和服務(wù)器兩次握手之后的狀態(tài) 。
在這個(gè)狀態(tài)下,應(yīng)用程序還有接收數(shù)據(jù)的能力。已經(jīng)無(wú)法發(fā)送數(shù)據(jù),但是也有一種可能是,客戶端處于FIN_WAIT_2 狀態(tài),而服務(wù)器則一直處于WAIT_CLOSE 狀態(tài),直到應(yīng)用層來(lái)決定關(guān)閉這個(gè)狀態(tài)。
RST 同時(shí)打開(kāi)和同時(shí)關(guān)閉:RST 是另一種關(guān)閉連接的方式,應(yīng)用程序應(yīng)該可以判斷RST 包的真實(shí)性,即是否為異常中止而同時(shí)打開(kāi)和同時(shí)關(guān)閉則是兩種特殊的 TCP 狀態(tài),發(fā)生的概率很小。
-
服務(wù)器
+關(guān)注
關(guān)注
13文章
9994瀏覽量
90059 -
網(wǎng)絡(luò)
+關(guān)注
關(guān)注
14文章
8019瀏覽量
92168 -
TCP
+關(guān)注
關(guān)注
8文章
1411瀏覽量
82554 -
連接
+關(guān)注
關(guān)注
2文章
101瀏覽量
21588
發(fā)布評(píng)論請(qǐng)先 登錄
TCP-IP詳解
狀態(tài)圖使用詳解-作者做了一個(gè)動(dòng)態(tài)顯示狀態(tài),怎么做的??
《TCP-IP詳解_卷3_TCP事務(wù)協(xié)議,HTTP,NNTP
tcp ip協(xié)議詳解卷三 下載

tcp ip協(xié)議詳解卷一
TCP IP協(xié)議有什么樣的狀態(tài)
什么是TCP狀態(tài)轉(zhuǎn)移

TCP狀態(tài)機(jī)設(shè)計(jì)與實(shí)現(xiàn)

評(píng)論