1. 程式人生 > 其它 >tcp 三次握手建立連線難點總結

tcp 三次握手建立連線難點總結

所謂三次握手(Three-way Handshake),是指建立一個TCP連線時,需要客戶端和伺服器總共傳送3個包。

三次握手的目的是連線伺服器指定埠,建立TCP連線,並同步連線雙方的序列號和確認號並交換 TCP 視窗大小資訊.在socket程式設計中,客戶端執行connect()時。將觸發三次握手。

要了解tcp包的頭部資訊

網路中傳輸的資料包由兩部分組成:一部分是協議所要用到的首部,另一部分是上一層傳過來的資料。首部的結構由協議的具體規範詳細定義。在資料包的首部,明確標明瞭協議應該如何讀取資料。反過來說,看到首部,也就能夠了解該協議必要的資訊以及所要處理的資料。包首部就像協議的臉。

下面是tcp包頭的資訊

這裡要區分32位確認序號ack 和標誌位的ACK,標誌位的ACK一般為空或者置為1,但是確認序號ack一般是和序號seq這一串數字+1。

    • TCP埠號
      TCP的連線是需要四個要素確定唯一一個連線:
      (源IP,源埠號)+ (目地IP,目的埠號)
      所以TCP首部預留了兩個16位作為埠號的儲存,而IP地址由上一層IP協議負責傳遞
      源埠號和目地埠各佔16位兩個位元組,也就是埠的範圍是2^16=65535
      另外1024以下是系統保留的,從1024-65535是使用者使用的埠範圍

    • TCP的序號和確認號
      32位序號 seq:Sequence number 縮寫seq ,TCP通訊過程中某一個傳輸方向上的位元組流的每個位元組的序號,通過這個來確認傳送的資料有序

      ,比如現在序列號為1000,傳送了1000,下一個序列號就是2000。
      32位確認號 ack:Acknowledge number 縮寫ack,TCP對上一次seq序號做出的確認號,用來響應TCP報文段,給收到的TCP報文段的序號seq加1。

    • TCP的標誌位
      每個TCP段都有一個目的,這是藉助於TCP標誌位選項來確定的,允許傳送方或接收方指定哪些標誌應該被使用,以便段被另一端正確處理。
      用的最廣泛的標誌是SYNACKFIN,用於建立連線,確認成功的段傳輸,最後終止連線。

      1. SYN:簡寫為S,同步標誌位,用於建立會話連線,同步序列號;
      2. ACK: 簡寫為.,確認標誌位,對已接收的資料包進行確認;
      3. FIN: 簡寫為F
        ,完成標誌位,表示我已經沒有資料要傳送了,即將關閉連線;
      4. PSH:簡寫為P,推送標誌位,表示該資料包被對方接收後應立即交給上層應用,而不在緩衝區排隊;
      5. RST:簡寫為R,重置標誌位,用於連線復位、拒絕錯誤和非法的資料包;
      6. URG:簡寫為U,緊急標誌位,表示資料包的緊急指標域有效,用來保證連線不被阻斷,並督促中間裝置儘快處理;

建立連線的過程

seq 和 ack 的資訊就像是客戶端與服務端通訊的問答資訊。

第一個包:客戶端請求(問)

第二個包:服務端應答(答),並且也有一個請求,SYN=1,也生成一個seq(問)

第三個包:客戶端迴應(答),回答第二個包裡的seq,返回ack=seq+1

    • 第一次握手
      客戶端將TCP報文標誌位SYN置為1,隨機產生一個序號值seq=J,儲存在TCP首部的序列號(Sequence Number)欄位裡,指明客戶端打算連線的伺服器的埠,並將該資料包傳送給伺服器端,傳送完畢後,客戶端進入SYN_SENT狀態,等待伺服器端確認。

    • 第二次握手
      伺服器端收到資料包後由標誌位SYN=1知道客戶端請求建立連線,伺服器端將TCP報文標誌位SYN和ACK都置為1,ack=J+1,隨機產生一個序號值seq=K,並將該資料包傳送給客戶端以確認連線請求,伺服器端進入SYN_RCVD狀態。

    • 第三次握手
      客戶端收到確認後,檢查ack是否為J+1,ACK是否為1,如果正確則將標誌位ACK置為1,ack=K+1,並將該資料包傳送給伺服器端,伺服器端檢查ack是否為K+1,ACK是否為1,如果正確則連線建立成功,客戶端和伺服器端進入ESTABLISHED狀態,完成三次握手,隨後客戶端與伺服器端之間可以開始傳輸資料了。

https://blog.csdn.net/a519640026/article/details/104448480