更好閱讀體驗(yàn):《理解 TCP 和 UDP》— By Gitbook
無(wú)論客戶端還是服務(wù)器,在雙方 TCP 通訊的過(guò)程中度迂,都會(huì)有著一個(gè)「狀態(tài)」的概念,狀態(tài)會(huì)隨著 TCP 通訊的不同階段而變化。
TCP 狀態(tài)流轉(zhuǎn)圖
各種狀態(tài)表示的意思
CLOSED:表示初始狀態(tài)
LISTEN:表示服務(wù)器端的某個(gè) socket 處于監(jiān)聽(tīng)狀態(tài)交播,可以接受連接
SYN_SENT:在服務(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:表示服務(wù)端接收到了 SYN 報(bào)文。
ESTABLISHED:表示連接已經(jīng)建立了垛孔。
FIN_WAIT_1:其中一方請(qǐng)求終止連接藕甩,等待對(duì)方的 FIN 報(bào)文。
FIN_WAIT_2:在 FIN_WAIT_2 之后似炎, 當(dāng)對(duì)方回應(yīng) ACK 報(bào)文之后辛萍,進(jìn)入該狀態(tài)。
TIME_WAIT:表示收到了對(duì)方的 FIN 報(bào)文羡藐,并發(fā)送出了 ACK 報(bào)文贩毕,就等 2MSL 之后即可回到 CLOSED 狀態(tài)。
CLOSING:一種罕見(jiàn)狀態(tài)仆嗦,發(fā)生在發(fā)送 FIN 報(bào)文之后辉阶,本應(yīng)是先收到 ACK 報(bào)文,卻先收到對(duì)方的 FIN 報(bào)文瘩扼,那么就從 FIN_WAIT_1 的狀態(tài)進(jìn)入 CLOSING 狀態(tài)谆甜。
CLOSE_WAIT:表示等待關(guān)閉,在 ESTABLISHED 過(guò)渡到 LAST_ACK 的一個(gè)過(guò)渡階段集绰,該階段需要考慮是否還有數(shù)據(jù)發(fā)送給對(duì)方规辱,如果沒(méi)有,就可以關(guān)閉連接栽燕,發(fā)送 FIN 報(bào)文罕袋,然后進(jìn)入 LAST_ACK 狀態(tài)改淑。
LAST_ACK:被動(dòng)關(guān)閉一方發(fā)送 FIN 報(bào)文之后,最后等待對(duì)方的 ACK 報(bào)文所處的狀態(tài)浴讯。
CLOSED:當(dāng)收到 ACK 保溫后朵夏,就可以進(jìn)入 CLOSED 狀態(tài)了。
參考
《后臺(tái)開發(fā) 核心技術(shù)與應(yīng)用實(shí)踐》
《計(jì)算機(jī)網(wǎng)絡(luò)》