1. 程式人生 > >TCP三次握手過程分析

TCP三次握手過程分析

TCP 三次握手過程分析

傳輸控制協議 (TCP) 旨在用作分組交換計算機通訊網路中,以及這些網路的互連繫統中的主機之間的高度可靠的主機到主機協議。

建立 TCP 連線

最簡單的三次握手如下所示:

      TCP A                                                TCP B

  0.  CLOSED                                               LISTEN

  1.  SYN-SENT    --> <SEQ=100><CTL=SYN>               --> SYN-RECEIVED

  2.  ESTABLISHED <--
<SEQ=300>
<ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED 3. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK> --> ESTABLISHED 4. ESTABLISHED --> <SEQ=101><ACK=301><CTL=ACK><DATA> --> ESTABLISHED

在 TCP/IP 協議中,TCP 協議提供可靠的連線服務,採用三次握手建立一個連線。

  • 初始狀態: 主機 A(客戶端) 處於 CLOSED 狀態,主機 B(伺服器) 處於 LISTEN 狀態。
  • 第一次握手:發起連線請求,客戶端傳送 SYN 包 (SYN = X) 到伺服器,並進入 SYN_SEND 狀態,等待伺服器確認;伺服器收到 SYN 包並進入 SYN_RECV 狀態。
  • 第二次握手:伺服器需要確認客戶的 SYN(ACK = X + 1),同時自己也傳送一個 SYN 包 (SYN = Y),組合後即 SYN + ACK 包;客戶端收到 SYN + ACK 包並進入 ESTABLISHED 狀態。
  • 第三次握手:客戶端向伺服器傳送確認包 ACK(ACK = Y + 1);伺服器收到 ACK 包並進入 ESTABLISHED
    狀態,完成三次握手。
  • 完成三次握手後,客戶端與伺服器開始傳送資料。

例項:

No.  Time       Source         Destination    Info
1    0.000000   192.192.4.29   192.192.4.28   580796633 [SYN] Seq=0 Win=5840 Len=0 MSS=1460 SACK_PERM=1 WS=64

2    0.000219   192.192.4.28   192.192.4.29   663358079 [SYN, ACK] Seq=0 Ack=1 Win=28960 Len=0 MSS=1460 SACK_PERM=1 WS=128

3    0.001705   192.192.4.29   192.192.4.28   580796633 [ACK] Seq=1 Ack=1 Win=5888 Len=0

注:其中 SYN, ACK 為 wireshark 解析的相對值。

第一次握手:192.192.4.29 傳送標誌位 SYN 為 1,隨機產生的 Seq=0(相對值 1) 的資料包到 192.192.4.28,192.192.4.28 由標誌位 SYN=1 知道 192.192.4.29 要求建立連線。標誌位詳情:

Flags: 0x002 (SYN)
    000. .... .... = Reserved: Not set
    ...0 .... .... = Nonce: Not set
    .... 0... .... = Congestion Window Reduced (CWR): Not set
    .... .0.. .... = ECN-Echo: Not set
    .... ..0. .... = Urgent: Not set
    .... ...0 .... = Acknowledgment: Not set
    .... .... 0... = Push: Not set
    .... .... .0.. = Reset: Not set
    .... .... ..1. = Syn: Set
    .... .... ...0 = Fin: Not set

標誌位裡面只同步位置位,也就是在做請求(SYN)。

第二次握手:192.192.4.28 收到請求後要確認連線資訊,向 192.192.4.29 傳送 Ack 號 =1(相對值 1), 標誌位 SYN=1, 標誌位 ACK=1 隨機產生的 Seq=0(相對值 2) 的包。標誌位詳情:

Flags: 0x012 (SYN, ACK)
    000. .... .... = Reserved: Not set
    ...0 .... .... = Nonce: Not set
    .... 0... .... = Congestion Window Reduced (CWR): Not set
    .... .0.. .... = ECN-Echo: Not set
    .... ..0. .... = Urgent: Not set
    .... ...1 .... = Acknowledgment: Set
    .... .... 0... = Push: Not set
    .... .... .0.. = Reset: Not set
    .... .... ..1. = Syn: Set
    .... .... ...0 = Fin: Not set

標誌位裡面有確認位和同步位置位,也就是在做應答(SYN + ACK)。

第三次握手:192.192.4.29 收到應答後檢查 ack number 是否正確,以及標誌位 ACK 是否為 1,若正確,192.192.4.29 會再發送 Ack 號 =1(相對值 2), 標誌位 ACK=1,192.192.4.28 收到後檢查 ack number 是否正確,標誌位 ACK=1 則連線建立成功。標誌位詳情:

Flags: 0x010 (ACK)
    000. .... .... = Reserved: Not set
    ...0 .... .... = Nonce: Not set
    .... 0... .... = Congestion Window Reduced (CWR): Not set
    .... .0.. .... = ECN-Echo: Not set
    .... ..0. .... = Urgent: Not set
    .... ...1 .... = Acknowledgment: Set
    .... .... 0... = Push: Not set
    .... .... .0.. = Reset: Not set
    .... .... ..0. = Syn: Not set
    .... .... ...0 = Fin: Not set

標誌位裡面只有確認位置位,也就是在做再次確認(ACK)。

一個完整的三次握手過程就是請求–>應答–>再次確認

連線過程狀態圖:
這裡寫圖片描述

參考

《TCP/IP 詳解 卷1:協議》