TCP/IP 三次握手協議與四次放手協議

TCP/IP 三次握手協議與四次放手協議

三次握手協議
三次握手協議主要有以下幾點:
1、客戶端發送連接請求,發送SYN建立連接請求。
2、服務器端(server)連接允許,做一個響應(ACK),同時s客戶端的序列號(seq)+1。
3、客戶端響應,給服務端發送一個響應,序列號是上一個同步請求數據包中的確認號值,確認號是服務器的初始序列號+1。
例如圖片所示:
這裏寫圖片描述
(上圖爲tcp/ip的三次握手協議)
四次放手協議
四次放手協議有以下幾點:
1、假設Client端發起中斷連接請求,也就是發送FIN報文。Server端接到FIN報文後,意思是說”我Client端沒有數據要發給你了”,但是如果服務器端還有數據沒有發送完成,則不必急着關閉Socket,可以繼續發送數據。
2、服務器先發送ACK,”告訴Client端,你的請求我收到了,但是我還沒準備好,請繼續你等我的消息”。這個時候Client端就進入FIN_WAIT狀態,繼續等待Server端的FIN報文。
3、當Server端確定數據已發送完成,則向Client端發送FIN報文,”告訴Client端,好了,我這邊數據發完了,準備好關閉連接了”。
4、Client端收到FIN報文後,”就知道可以關閉連接了,但是他還是不相信網絡,怕Server端不知道要關閉,所以發送ACK後進入TIME_WAIT狀態,如果Server端沒有收到ACK則可以重傳。“,Server端收到ACK後,”就知道可以斷開連接了”。
5、Client端等待了2MSL後依然沒有收到回覆,則證明Server端已正常關閉,那好,我Client端也可以關閉連接了。TCP連接就這樣關閉了!
整個過程Client端所經歷的狀態如下:
這裏寫圖片描述

【問題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報文。

【問題3】TCP的狀態 (SYN, FIN, ACK, PSH, RST, URG)

在TCP層,有個FLAGS字段,這個字段有以下幾個標識:SYN, FIN, ACK, PSH, RST, URG.

其中,對於我們日常的分析有用的就是前面的五個字段。

它們的含義是:

SYN表示建立連接,

FIN表示關閉連接,

ACK表示響應,

PSH表示有 DATA數據傳輸,

RST表示連接重置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章