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