tcp/ip協議-連接的關閉


對於tcp連接的建立來說,主要是通過三次握手,而對於tcp連接的正常關閉來說,主要是四次通信。

為什么要四次通信,主要是tcp連接是雙工的,客戶端需要關閉連接,服務器端也需要關閉連接。

正常情況下:

客戶端主動發起tcp關閉連接請求報文,服務器端返回一個ack報文

客戶端發送關閉連接請求報文的時候,tcp連接狀態是FIN_AWAIT1狀態,服務器端接收到報文的時候服務端狀態為CLOSE_WAIT ,當客戶端受到服務器端發送ack響應報文的時候,客戶端狀態變為FIN_WAIT2狀態,這個時候客戶端就一直等待服務器端發送連接關閉的報文請求,否則客戶端一直都是FIN_AWAIT2狀態

當服務端發起連接關閉的請求之后,服務器端的狀態變為LAST_ACK , 當客戶端收到服務端的連接關閉請求的時候,這個時候狀態變為TIME_AWAIT,正常請求下,客戶端會返回ack報文給服務器端,服務器端接收到報文,服務器端tcp狀態變為CLOSED。

以下是狀態圖:

這里面可能會出現異常情況

1 客戶端主動關閉了,服務器端沒有返回lask_ack報文 ,這個屬於半關閉情況,這個時候服務器端一直會出現CLOSE_WAIT狀態

2 客戶端受到服務器端的關閉請求報文,但是一直返回ack報文給服務器端,這個時候客戶端的tcp連接狀態為TIME_WAIT。

實際用java代碼測試的時候,沒有發現CLOSE_WAIT狀態,大多數是TIME_WAIT狀態,這個比較奇怪。

特別情況,可以采用發送重置報文立即關閉連接,就不會出現以上的交互過程。可以設置SO_LINGER = 0 來設置重置連接,如果是重置連接,就不會出現TIME_WAIT狀態和CLOSE_WAIT狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM