天天看點

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

TCP協定三次握手和四次揮手

TCP協定是面向連接配接的,所謂面向連接配接,就是當計算機雙方通信時必須經過先建立連接配接,然後傳送資料,最後拆除連接配接的三個過程。

三次握手
  • 第一次握手:用戶端發送一個含SYN同步标志的TCP封包,SYN同步封包會指明用戶端使用的端口以及TCP連接配接的初始序号(seq),表示“請求建立新連接配接”,随後用戶端進入SYN_SENT階段,伺服器端接收到TCP封包後,結束LISTEN階段。
  • 第二次握手:伺服器在收到用戶端的SYN封包後,将傳回一個SYN+ACK封包,表示用戶端的請求被接收,并且同意建立新連接配接。同時TCP序号被加1作為确認号的值,随後伺服器進入SYN_RCVD階段。
  • 第三次握手:伺服器收到來自用戶端的“确認收到伺服器資料”的TCP封包之後,用戶端傳回一個确認封包ACK給伺服器端,同樣TCP序号被加1,用戶端進入ESATB_LISHED階段,伺服器端接收到确認封包ACK後,明确伺服器端到用戶端的資料傳輸正常,也進入ESATB_LISHED階段。至此一個TCP連接配接完成;然後才開始通信的第二步,資料處理。

為什麼是三次握手?不是兩次、四次?

  • 三次握手才可以阻止重複曆史連接配接的初始化(主要原因)

    -----為了防止伺服器端開啟一些無用的連接配接增加伺服器開銷以及防止已失效的連接配接請求封包段突然又傳送到了服務端,因而産生錯誤。

  • 三次握手才可以同步雙方的初始序列号
  • 三次握手才可以避免資源浪費
四次揮手
  • 第一次揮手:用戶端打算關閉連接配接,此時會發送一個 TCP 首部 FIN 标志位被置為 1 的封包,也即 FIN 封包,表示“請求釋放連接配接”,之後用戶端進入 FIN_WAIT_1狀态,并且停止用戶端到伺服器端方向上發送資料(正常連接配接傳輸的資料,非确認封包),但用戶端可以接收從伺服器端傳輸過來的資料。
  • 第二次揮手:服務端收到該封包後,結束ESTABLISHED階段,然後向用戶端發送 ACK 應答封包(标志位為ACK),表示“表示接受到用戶端發送的釋放連接配接請求”,并且将用戶端發送的FIN封包序号+1作為自己的确認号,表示是在收到了用戶端封包基礎上傳回的封包,接着服務端進入CLOSED_WAIT 狀态,并且開始準備釋放從伺服器端到用戶端方向的連接配接。用戶端收到服務端的 ACK 應答封包後,之後進入 FIN_WAIT_2 狀态。
  • 第三次揮手:等待服務端處理完資料後,也向用戶端發送 FIN 封包,表示“伺服器準備好開始釋放連接配接”,确認号仍然為用戶端發送的FIN封包序号+1,之後服務端進入LAST_ACK 狀态。
  • 第四次揮手:用戶端收到服務端的 FIN 封包後,進入TIME-WAIT階段,并且回一個 ACK 應答封包,之後進入 TIME_WAIT狀态。伺服器收到了 ACK 應答封包後,就進入了CLOSE 狀态,至此服務端已經完成連接配接的關閉。用戶端在經過 2MSL 一段時間後,自動進入CLOSE 狀态,至此用戶端也完成連接配接的關閉。

為什麼用戶端在TIME-WAIT階段要等2MSL?

為了确認伺服器端是否收到用戶端發出的ACK确認封包

當用戶端發出最後的ACK确認封包時,并不能确定伺服器端能夠收到該段封包。是以用戶端在發送完ACK确認封包之後,會設定一個時長為2MSL的計時器。MSL(Maximum Segment Lifetime)指的是:一段TCP封包在傳輸過程中的最大生命周期。2MSL即是伺服器端發出為FIN封包和用戶端發出的ACK确認封包所能保持有效的最大時長。

伺服器端在1MSL内沒有收到用戶端發出的ACK确認封包,就會再次向用戶端發出FIN封包;

如果用戶端在2MSL内,再次收到了來自伺服器端的FIN封包,說明伺服器端由于各種原因沒有接收到用戶端發出的ACK确認封包。用戶端再次向伺服器端發出ACK确認封包,計時器重置,重新開始2MSL的計時;否則用戶端在2MSL内沒有再次收到來自伺服器端的FIN封包,說明伺服器端正常接收了ACK确認封包,用戶端可以進入CLOSED階段,完成“四次揮手”。

是以,用戶端要經曆時長為2SML的TIME-WAIT階段;這也是為什麼用戶端比伺服器端晚進入CLOSED階段的原因。