TCP關閉連接的過程如下圖,以Client主動關閉為例
具體過程(四次揮手)如下:
Client調用close函數,給Server發送FIN,請求關閉連接;
Server收到FIN后,給Client回復ACK,同時關閉讀通道,此時Server的TCP狀態轉換為CLOSE_WAIT狀態。
Client收到對自己FIN確認后,關閉寫通道,不再往連接中寫入任何數據。
Server調用close函數關閉連接,給Client發送FIN,Client收到后給Server回復ACK確認,同時Client關閉讀通道,進入TIME_WAIT狀態。
Server收到Client對自己FIN的ACK后,關閉寫通道,TCP連接狀態變為CLOSE,也就是連接關閉
Client在TIME_WAIT狀態下要等待最大數據段生存期的兩倍,然后才進入CLOSE狀態,TCP連接才徹底關閉。
主動發起關閉連接的操作一方將達到TIME_WAIT狀態,必須保持MAX Segment Lifetime的兩倍時間。
原因如下:
1.保證TCP協議的全雙工連接,能夠可靠關閉
2.保證本次連接的重復數據段從網絡中消失
詳細說明如下:
1.假如Client直接CLOSED,那么由于IP協議不可靠性或者其他網絡原因,導致Server沒有收到Client最后回復的ACK,那么Server可以超時重傳,此時如果Client已經CLOSED,就找不到對應的連接,那么Server收到的是對端的RST,而不是ACK,Server會以為是連接錯誤而上報到上層。雖然不會導致數據丟失,但是卻不符合TCP可靠性的要求。
2.如果Client直接CLOSED后,又立即向Server發起一個新連接,假如是在相同的端口,那么之前連接中滯留的網絡數據,有可能在新連接建立后,才到達Server,由于新連接和舊連接的端口相同,TCP協議認為這些滯留數據是屬于新連接的,與真正的數據發生混淆。