TCP連接建立三次握手和TCP連接釋放四次揮手(正解篇)

一、參考文章

https://blog.csdn.net/lengxiao1993/article/details/82771768

多次在網絡博客上學習到的錯誤解讀是:

  1. 防止已失效的連接請求又傳送到服務器端,因而產生錯誤。

 但這種解釋不準確。

正確的解釋是:

  • 爲了實現可靠數據傳輸, TCP 協議的通信雙方, 都必須維護一個序列號, 以標識發送出去的數據包中, 哪些是已經被對方收到的。 三次握手的過程即是通信雙方相互告知序列號起始值, 並確認對方已經收到了序列號起始值的必經步驟。
  • 如果只是兩次握手, 至多隻有連接發起方的起始序列號能被確認, 另一方選擇的序列號則得不到確認。

 

第一次握手:客戶端向服務器端發送鏈接請求的報文段,syn(請求序列連接)=1,seq=x,等待服務器確認;

第二次握手:服務器收到syn包並確認,同時發送一個syn包應答,syn=1,seq=y,ack=x+1;

第三次握手:客戶端收到服務器的連接應答包後,向服務器發送確認包ACK,發送完畢後,雙方進入TCP成功連接狀態,完成三次握手。

爲什麼需要三次,而不是兩次?

爲了實現可靠傳輸,發送方和接收方始終需要同步序號(SYN)。 三次握手的過程就是通信上方相互告知起始序號,並確認對方已經收到了序列號的起始值。如果只是兩次握手,那麼最多隻有發起方的序列號能被確認,另一方選擇的序列號得不到確認。

二、TCP連接釋放四次揮手 

 

第一次揮手:客戶端發出連接釋放報文,並且停止發送數據;

第二次揮手:服務器收到連接釋放報文,發出確認報文;

第三次揮手:客戶端收到確認後,等待服務器發送連接釋放報文(在這之前還需要接收服務器發送的最後數據),服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文;

第四次揮手:客戶端收到服務器的連接釋放報文後,必須發出確認,進入等待狀態。注意此時的連接還沒有釋放,經過2MSL時間後,進入closed狀態。服務器只要收到客戶端發出的確認立即進入closed狀態。

爲什麼TIME_WAIT狀態要客戶端經過2MSL才能返回到closed狀態?

 因爲必須假想網絡是不可靠的,最後一個ACK有可能丟失,所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。

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