"三次握手"和"四次揮手"

在建立TCP連接時需要三次握手,在斷開連接時需要四次揮手

三次握手

在這裏插入圖片描述
第一次握手: 客戶端向服務端發送SYN包{SYN=1,seq=x},客戶端進入SYN_SENT狀態
第二次握手: 服務端向客戶端發送應答的ASK包和SYN包{ASK=1,SYN=1,ask=x+1,seq=y},服務端進入SYN_RCVD狀態
第三次握手: 客戶端向服務端發送應答的ASK包{ASK=1,ask=y+1,seq=x+1},客戶端進入ESTABLISHED狀態,服務端收到ASK包後也進入ESTABLISHED狀態

建立連接爲什麼是三次握手,而不是兩次呢?
加入是兩次的話對客戶端 是沒有影響的,客戶端開始在收到服務端的ASK-SYN包後進入ESTABLISHED狀態,客戶端向服務端發送數據是沒問題的,但對於服務端來說,在接收到客戶端的ASk連接請求後就進入了ESTABLISHED狀態,併發送向客戶端發送ASK-SYN包,如果這時客戶端沒有收到ASK-SYN包,沒有進入ESTABLISHED狀態,但服務端就給客戶端發送數據,肯定是失敗的,服務端將會一直等待下去,這樣浪費服務端連接資源。

四次揮手

在這裏插入圖片描述
由於TCP傳輸是全雙工的,客戶端向服務器發送數據的同時服務端也可以向客戶端發送數據,所以斷開連接需要四次揮手,前兩次斷開一個方向的連接,後兩次斷開另一個方向的連接
第一次揮手: 當客戶端的數據發送完後,向服務端發送一個FIN包請求斷開連接{FIN=1,seq=u},客戶端進入FIN-WAIT1狀態
第二次揮手: 服務端收到客戶端發來的FIN斷開請求後,通知應用程序客戶端發送數據完成,不會再發數據了,同時做出應答給客戶端發送一個ASK包,{ASK=1,ask=u+1,seq=v},服務端進入CLOSE-WAIT狀態,客戶端在收到應答後進入FIN-WAIT2狀態,此時從客戶端到服務端的連接斷開,客戶端不會發送數據,服務端也不會在接收數據,但這時候服務端還可以向客戶端發送數據,還需要接下來的兩次揮手
第三次揮手: 當服務端的數據發送完以後,也會向客戶端發送一個FIN包請求斷開連接{FIN=1,ASK=1,seq=w,ask=u+1},服務端進入LAST-ASK狀態
第四次揮手: 客戶端在接收到斷開請求後,進入TIME-WAIT狀態,並向服務端發送應答{ASK=1,seq=u+1,ask=w+1},服務端在接收到應答後,進入CLOSED轉態,等客戶端的TIME-WAIT結束後,客戶端也進入CLOSED狀態,此時服務端到客戶端的連接斷開

客戶端在收到第三次揮手後爲什麼沒有立即進入關閉狀態呢?
因爲客戶端要等服務端收到客戶端的應答,如果服務端沒有收到應答,服務端會從新發送斷開連接的請求,而這時客戶端已經關閉了,那麼服務端到客戶端的連接將永遠不能關閉

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