TCP 四次揮手是為了關閉鏈接,TCP 連接是全雙工的,因此每個方向都必須單獨關閉,雙方都可以主動關閉鏈接,首先發起關閉的一方執行主動關閉,而另一方執行被動關閉,關閉之后主機的資源將被釋放。
四次揮手的過程如下:
第一次揮手:客戶端發送一個 FIN=1,sep=u 的報文告訴服務器它打算關閉連接,不再發送數據,但可以接收數據,報文發出之后客戶端將連接的狀態變為 FIN_WAIT_1第二次揮手:服務端接收到客戶端的 FIN 報文之后,返回一個 ACK=1,sep=v,ACKnum=u+1 的應答報文,接著服務端進入 CLOSE_WAIT 狀態。客戶端接收到服務端的 ACK 應答報文后進入 FIN_WAIT_2 狀態第三次揮手:服務器處理完數據之后,向客戶端發送 FIN 報文,表明它不再發送數據,接著服務端進入 LAST_ACK 狀態。第四次揮手:客戶端接收到 FIN 報文后,向服務端發送 ACK 應答報文,接著客戶端進入 TIME_WAIT 狀態,等待 2MSL 一段時間后客戶端自動進入 CLOSED 狀態,服務器收到 ACK 應答報文后進入 CLOSED 狀態。
為什么揮手需要四次?
TCP 連接是全雙工的,雙方可以同時發送和接收數據。第一次客戶端發送 FIN 報文后只表示它不再發送數據,但還是能接受數據。服務端接收到 FIN 報文,回一個 ACK 應答報文,這次服務端可以還有數據需要處理和發送,等它處理完成,發送一個 FIN 報文表示不再發送數據,客戶端再回一個 ACK 應答報文。由于服務端處理數據需要時間,因此服務端的 ACK 和 FIN 報文是發送的,所以需要四次揮手。
TCP 四次揮手可以變成三次揮手嗎?
如果被動關閉方沒有數據需要發送,并且開啟了TCP 延遲確認機制,那么第二次和第三次揮手就會合并傳輸,四次揮手變成三次揮手。
為什么主動關閉方需要等待 2MSL 后才關閉連接
MSL 是報文的最大生存時間,它是任何報文在網絡上存在的最大時間,超過這個時間報文將丟失。如果第四次揮手的 ACK 報文丟失,被動關閉方將重發 FIN 報文,主動關閉方的 TIME_WAIT 時間為 2MSL 表示允許第四次揮手的 ACK 報文丟失一次
為什么主動關閉方需要 TIME_WAIT 狀態
防止歷史連接中的數據被后續相同四元組連接錯誤的接收:TIME_WAIT 設置成 2MSL 可以保證兩個方向上發送的數據都能被丟失。
確保被動關閉方能正常關閉。
四元組指的是:目的地址、目的端口、源地址和源端口。通過四元組可以唯一確定一個連接。
-
服務器
+關注
關注
12文章
9021瀏覽量
85184 -
TCP
+關注
關注
8文章
1350瀏覽量
78986 -
端口
+關注
關注
4文章
955瀏覽量
32014
原文標題:TCP 四次揮手過程分析
文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論