優雅地說再見——TCP協議四次揮手

2023.09.03

優雅地說再見——TCP協議四次揮手

禮貌地說你好——TCP協議三次握手一文中已經介紹了,TCP協議是如何建立連接的。建立連接後,數據傳輸完成,我們又該如何優雅地關閉連接呢?

優雅地說再見

不辭而別,總是容易讓人猝不及防。當我們不得結束一段愉快的聊天,離開一個讓人難以割捨的城市,你會怎麼做?

當然是要學會,優雅地說再見了。

禮貌地說你好——TCP協議三次握手》一文中已經介紹了,TCP協議是如何建立連接的。建立連接後,數據傳輸完成,我們又該如何優雅地關閉連接呢?

念念不忘——TCP的四次揮手

第一次揮手

客戶端準備關閉連接時,則會向服務端發送FIN=1的數據包,並且進入FIN_WAIT_1狀態。

第二次揮手

服務端收到客戶端的FIN=1的數據包後,則會向客戶端響應一個ACK數據包,並進入準備關閉連接的狀態。服務端此時則會開始準備停止數據傳輸。

客戶端收到服務端響應的ACK數據包後,則進入FIN_WAIT_2的狀態。此時,仍然有可能存在數據傳輸,需要等待服務端真正停止數據傳輸時才能進入關閉狀態。

第三次揮手

服務端處理完數據傳輸則會向客戶端發送一個FIN數據包,並進入LASK_ACK狀態,表示服務端已經進入連接關閉狀態。

第四次揮手

客戶端收到FIN數據包後,則可以確認數據傳輸已經完全停止,進入TIME_WAIT狀態,並向服務端響應ACK數據包。等待2MSL(Maximum Segment Lifetime,最大報文生存時間)後,連接才真正關閉,進入CLOSE狀態。

服務端接收到ACK數據包後則斷開連接,進入CLOSE狀態。

重試與容錯

當FIN數據包發送出去後,長時間未收到ACK響應的數據包,都會觸發超時重傳。

客戶端接受到FIN指令後為什麼不是立即關閉連接,而要等待2MSL時間再關閉?

假設客戶端沒有TIME_WAIT的狀態,而是裡面關閉連接,此時如果客戶端立馬重新建立連接,連接建立成功後,又收到上一個關閉連接的數據包,並向服務端響應了ACK數據包,則會導致服務端的數據混亂。

總結

TCP協議關閉連接的時候,由於可能正在進行數據傳輸,客戶端和服務端都會先進入等待關閉連接的過程。

當客戶端或者服務端發送FIN數據包未在一定的時間內收到ACK響應包,則會進行重試。

客戶端最後收到服務端的FIN數據包後,會先進入TIME_WAIT的狀態等待2MSL(最大報文生存週期)。以防止,因為網絡延遲,消息傳輸超時等問題導致的消息傳輸錯亂的問題的發生。