網絡基礎—三次握手與四次揮手

三次握手

基本過程:
這裏寫圖片描述
原理:

  • 第一次握手:客戶端將SYN設置爲1,表示要建立一個新的連接,並隨機產生一個序列值Seq=M,並將該數據包發給服務器客戶端進入FIN_SEND狀態;

  • 第二次握手:服務器收到數據包後由標誌位SYN=1知道客戶端要建立一個連接,服務器將確認ACK和SYN都置爲1,ack=M+1並隨機產生一個Seq=N,並將該數據包發給客戶端,服務器進入SYN_RCVD狀態;

  • 第三次握手:客戶端收到確認後,檢查ack是否爲M+1,ACK是否爲1,服務器有時候不同意建立一個連接(有可能達到了服務器建立客戶端的上線),那麼這裏的ACK=0,表示無效,如果正確,則建立成功,客戶端和服務器都進入ESTABLISHED狀態,完成三次握手,隨後服務器和客戶端之間就開始傳輸數據。


  • 問題:爲什麼是三次握手而不是兩次握手呢?

三次握手可以簡單看做是客戶發送請求,服務器對客戶的請求進行確認,客戶對服務器的確認再進行確認。

    如果採用兩次握手,假設下面這種情況,客戶向服務器發送請求,服務器沒有對客戶的請求進行確認(因爲網絡的延遲他可能沒有收到這個請求)
客戶收不到這個確認於是過一段時間他在向服務器發起連接請求並順利完成數據傳輸,但是過了一段時間這個請求到達了服務器而服務器誤以爲這是
一個新的連接請求於是對這個請求進行確認併發送確認給客戶但是客戶沒有發起過連接請求因此它不會理會服務器的確認,服務器以爲這個連接已經
建立好了於是一直等待客戶發送數據,這樣就會造成服務器的資源浪費。如果採用三次握手上述情況客戶不會向服務器的確認進行確認,這樣服務器收
不到確認它就知道客戶沒有要發起請求的連接,於是不會再等待。

三次握手主要是爲了防止已失效的連接請求報文突然到達服務器,造成服務器的等待和資源的浪費。

四次揮手

基本過程:
這裏寫圖片描述
原理:

  • 第一次揮手:客戶端發起一個FIN和一個Seq=M,要求關閉客戶端到服務器之間的數據傳遞,客戶端進入FIN_WAIT1狀態;

  • 第二次揮手:服務器收到FIN後,發送一個ACK=1,和ack=M+1表示知道了,進入CLOSE_WAIT狀態;

  • 第三次揮手:當服務器的數據傳遞完後,再發送一個FIN和一個Seq=N來確定斷開連接,等待最後一個ACK的到來;

  • 第四次揮手:此時一直等待的客戶端接收到FIN信號表示服務器也要斷開了,沒數據傳送了,變發送一個ACK和ack=N+1,主動斷開了然後服務器也就被動斷開了;


問題:爲啥是四次揮手呢?

在三次握手的過程中,SYN和ACK是一起發送的但是在四次揮手的時候FIN和ACK卻不是一起發送的而是分開發送的,爲什麼呢???
那是因爲啊,TCP連接是全雙工的也就是說接收到FIN只是說沒有數據再發過來但是還是可以發送數據的,也就是接受到一個FIN只是
關閉了一個方向的數據傳輸,另一個方向還可以繼續發送數據。在四次揮手的時候也是這樣前兩次揮手只是確認關閉了一個方向的數據,
加上後面兩次揮手才真正的關閉了整個全雙工連接。


當socket在ESTABISHED狀態時,他想主動關閉連接於是向對方發送FIN請求,發送完FIN請求後它處於FIN_WAIT_1狀態,當對方確認ACK報
文後則處於FIN_WAIT_2狀態。FIN_WAIT_2表示半連接,也就是有一方要求關閉連接,另一方收到請求但是告訴她我還有一些數據要發送稍
後會關閉。TIME_WAIT狀態表示收到對方的FIN併發送出ACK.如果三次握手可能在關閉後還有一個方向沒有關閉。


  • 最後一個問題:爲什麼TIME_WAIT狀態還需要等2MSL後才能返回到CLOSED狀態?

TCP的可靠性會根據請求問答機制,四次揮手的時候,最後一條報文是否到達是不可靠的,也就是我們都已經同意關閉連接
了,服務器已經向客戶端發送了FIN,這時候服務器就等着收到最後一個ACK然後斷開連接,但是客戶端發送的最後一條報
文完全是有可能沒有發送到服務器的,服務器有段時間沒有收到客戶端發送回來的ACK,它肯定會重新發送一次FIN,如果這
個時候客戶端發送完ACK就直接切爲CLOSED的狀態,肯定就收不到服務器發過來的FIN了,所以TIME_WAIT狀態多等2MSL的作
用就是重新發送可能丟失的最後一個ACK報文,完成斷開連接。

發佈了78 篇原創文章 · 獲贊 34 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章