筆記整理:TCP的三次握手,四次揮手

TCP的三次握手,四次揮手

老生常談的“三次握手,四次揮手”,一直都知道這個理論,相關的圖也見不了少,但是從沒有自己重新畫一遍,自己好好的鋝一遍,這次抽空整理了下,作爲筆記記錄一下。

三次握手,四次揮手過程

截圖1
上圖就是三次握手,四次揮手的過程,畫了個簡單的草圖,分別給每個步驟標了個序號,下面開始詳細說明下每個步驟所做的事情。

  1. 第一次握手:客戶端發送報文(標記位爲[SYS],seq=0),然後就將狀態變更爲SYS-SEND
  2. 第二次握手:服務端在接收到客戶端發送的報文後,將自身的狀態由LISTEN變更爲SYN_RCVD狀態,並返回一段報文(標記位爲[SYS,ACK],seq=0,ack=1)告訴客戶端,我收到你的請求連接請求了。
  3. 第三次握手:客戶端在收到服務端返回的報文後,再次發送報文(標記位爲[ACK], seq=1, ack=1),並將自身的狀態由SYN-SEND變更爲ESTBLISHED。服務端收到客戶端發送的報文後將自身狀態變更爲由SYN-RCVD變更爲ESTBLISHED,這樣客戶端和服務端就建立好了連接,客戶端可以開始傳輸數據了。
  4. 第一次揮手:客戶端發送完數據包之後,主動發起是釋放連接的報文(標記位爲[FIN, ACK], seq=2000, ack=500)後就將自身的狀態由ESTBLISHED變更爲FIN-WAIT-1
  5. 第二次揮手:服務端收到客戶端的FIN報文後,將自身狀態由ESTBLISHED變更爲CLOSE_WAIT狀態,併發送一段報文(標記位爲[ACK], seq=500, ack=2001)告訴客戶端,我收到了你想釋放連接的請求。客戶端在收到服務端返回的確認報文後,將自身狀態由FIN-WAIT-1變更爲FIN-WAIT-2
  6. 第三次揮手:服務端在處理完客戶端發送的數據後,就會向客戶端發送第三次揮手的報文(標記位爲[FIN, ACK], seq=500, ack=2001 ),並將自身狀態由CLOSE_WAIT變更爲LAST_ACK
  7. 第四次揮手:客戶端在第二次收到服務端發過來的確認報文的時候,將自身狀態由FIN_WAIT-2變更爲TIME_WAIT,並向服務端發送報文(標記位爲[ACK], seq=2001, ack=501)。服務端在收到客戶端發送的ACK報文時,就將自身狀態由LAST_ACK變更爲CLOSED狀態,釋放了當前連接。
  8. 以上就是老生常談的三次握手,四次揮手的過程。
  9. 而客戶端連接釋放再需要在經過TIME_WAIT的2MSL之後纔會釋放連接。

但是細心的你肯定會發現這個時候只是服務端釋放了連接,但是客戶端的狀態還是在TIME-WAIT並沒有釋放連接。或許你也會有這些疑問:

  1. 爲什麼“握手”是三次,“揮手”卻要四次?
  2. 爲什麼客戶端在TIME-WAIT階段要等2MSL?

相關詳細的解釋可以參考https://www.cnblogs.com/AhuntSun-blog/p/12037852.html

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