天天看點

TCP三向交握

建立TCP需要三次握手才能建立,而斷開連接配接則需要四次握手。整個過程如下圖所示:

TCP三向交握

先來看看如何建立連接配接的。

TCP三向交握

首先Client端發送連接配接請求封包,Server段接受連接配接後回複ACK封包,并為這次連接配接配置設定資源。Client端接收到ACK封包後也向Server段發生ACK封包,并配置設定資源,這樣TCP連接配接就建立了。

那如何斷開連接配接呢?簡單的過程如下:

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則可以重傳。“,Server端收到ACK後,"就知道可以斷開連接配接了"。Client端等待了2MSL後依然沒有收到回複,則證明Server端已正常關閉,那好,我Client端也可以關閉連接配接了。Ok,TCP連接配接就這樣關閉了!

整個過程Client端所經曆的狀态如下:

TCP三向交握

而Server端所經曆的過程如下:轉載請注明:blog.csdn.net/whuslei

TCP三向交握

【注意】 在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封包,是以不能一起發送。故需要四步握手。

繼續閱讀