一、參考文章
https://blog.csdn.net/lengxiao1993/article/details/82771768
多次在網絡博客上學習到的錯誤解讀是:
- 防止已失效的連接請求又傳送到服務器端,因而產生錯誤。
但這種解釋不準確。
正確的解釋是:
- 爲了實現可靠數據傳輸, 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報文。