TCP關(guān)閉連接的過程如下圖菇怀,以Client主動關(guān)閉為例
具體過程(四次揮手)如下:
Client調(diào)用close函數(shù),給Server發(fā)送FIN痢甘,請求關(guān)閉連接油挥;
Server收到FIN后潦蝇,給Client回復(fù)ACK款熬,同時關(guān)閉讀通道,此時Server的TCP狀態(tài)轉(zhuǎn)換為CLOSE_WAIT狀態(tài)攘乒。
Client收到對自己FIN確認(rèn)后贤牛,關(guān)閉寫通道,不再往連接中寫入任何數(shù)據(jù)则酝。
Server調(diào)用close函數(shù)關(guān)閉連接殉簸,給Client發(fā)送FIN,Client收到后給Server回復(fù)ACK確認(rèn)沽讹,同時Client關(guān)閉讀通道般卑,進入TIME_WAIT狀態(tài)。
Server收到Client對自己FIN的ACK后爽雄,關(guān)閉寫通道蝠检,TCP連接狀態(tài)變?yōu)镃LOSE,也就是連接關(guān)閉
Client在TIME_WAIT狀態(tài)下要等待最大數(shù)據(jù)段生存期的兩倍挚瘟,然后才進入CLOSE狀態(tài)叹谁,TCP連接才徹底關(guān)閉。
主動發(fā)起關(guān)閉連接的操作一方將達到TIME_WAIT狀態(tài)乘盖,必須保持MAX Segment Lifetime的兩倍時間焰檩。
原因如下:
1.保證TCP協(xié)議的全雙工連接,能夠可靠關(guān)閉
2.保證本次連接的重復(fù)數(shù)據(jù)段從網(wǎng)絡(luò)中消失
詳細(xì)說明如下:
1.假如Client直接CLOSED订框,那么由于IP協(xié)議不可靠性或者其他網(wǎng)絡(luò)原因析苫,導(dǎo)致Server沒有收到Client最后回復(fù)的ACK,那么Server可以超時重傳穿扳,此時如果Client已經(jīng)CLOSED衩侥,就找不到對應(yīng)的連接,那么Server收到的是對端的RST矛物,而不是ACK顿乒,Server會以為是連接錯誤而上報到上層。雖然不會導(dǎo)致數(shù)據(jù)丟失泽谨,但是卻不符合TCP可靠性的要求。
2.如果Client直接CLOSED后特漩,又立即向Server發(fā)起一個新連接吧雹,假如是在相同的端口,那么之前連接中滯留的網(wǎng)絡(luò)數(shù)據(jù)涂身,有可能在新連接建立后雄卷,才到達Server,由于新連接和舊連接的端口相同蛤售,TCP協(xié)議認(rèn)為這些滯留數(shù)據(jù)是屬于新連接的丁鹉,與真正的數(shù)據(jù)發(fā)生混淆妒潭。