首頁  >  文章  >  後端開發  >  TCP中三次握手和四次握手是什麼意思

TCP中三次握手和四次握手是什麼意思

一个新手
一个新手原創
2017-09-07 14:43:062035瀏覽
  1. 建立TCP需要三次握手才能建立,而斷開連接則需要四次握手。整個過程如下圖所示:

先來看看如何建立連線的。


【更新於2017.01.04 】該部分內容配圖有誤,請大家見諒,正確的配圖如下,錯誤配圖也不刪了,大家可以比較下,比較理解效果更好。這麼久才來更新,抱歉! !


錯誤配圖如下:

#首先Client端發送連線請求封包,Server段接受連線後回覆ACK報文,並為此連線分配資源。 Client端接收到ACK封包後也向Server段發生ACK封包,並且分配資源,這樣TCP連線就建立了。

那要如何斷開連線呢?簡單的過程如下:


【注意】中斷連線端可以是Client端,也可以是Server端。

假設Client端發起中斷連線要求,也就是發送FIN封包。 Server端接到FIN報文後,意思是說"我Client端沒有資料要發給你了",但是如果你還有資料沒有發送完成,則不必急著關閉Socket,可以繼續發送資料。所以你先發送ACK,"告訴Client端,你的請求我收到了,但我還沒準備好,請繼續你等我的消息"。這時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN封包。當Server端確定資料已發送完成,則向Client端發送FIN報文,"告訴Client端,好了,我這邊資料發完了,準備好關閉連接了"。 Client端收到FIN封包後,"就知道可以關閉連線了,但他還是不相信網絡,怕Server端不知道要關閉,所以發送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。 Client端等待了2MSL後依然沒有收到回复,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。 Ok,TCP連線就這樣關閉了! 整個過程Client端所經歷的狀態如下:


#而Server端所經歷的過程如下:

【注意】 在TIME_WAIT狀態中,如果TCP client端最後一次傳送的ACK遺失了,它將重新傳送。 TIME_WAIT狀態中所需要的時間是依賴實作方法的。典型的值為30秒、1分鐘和2分鐘。等待之後連線正式關閉,並且所有的資源(包括連接埠號)都被釋放。

【問題1】為什麼連接的時候是三次握手,關閉的時候卻是四次握手?
答案:因為當Server端收到Client端的SYN連線請求訊息後,可以直接傳送SYN+ACK封包。其中ACK封包是用來應答的,SYN封包是用來同步的。但關閉連線時,當Server端收到FIN報文時,很可能不會立即關閉SOCKET,所以只能先回覆一個ACK報文,告訴Client端,"你發的FIN報文我收到了"。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

【問題2】為什麼TIME_WAIT狀態需要經過2MSL(最大封包生存時間)才能回到CLOSE狀態?

答:雖然照道理,四個訊息都寄完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網路是不可靠的,有可以最後一個ACK遺失。所以TIME_WAIT狀態就是用來重發可能遺失的ACK封包。

以上是TCP中三次握手和四次握手是什麼意思的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn