TCP/IP

TCP 三向交握 (Three-way Handshake)

傳輸控制協定 (Transmission Control Protocol, TCP) 不像 UDP,
TCP 是一種 連接導向 (connection-oriented) 的通訊協定,
三向交握 (Three-way Handshake), 是其建立虛擬連線 (virtual connection) 的方式。
 
又稱為 三向式握手、三路交握 …,其實就是 三次訊息的交換
 


 

三向交握 (Three-way Handshake)

三向交握 (Three-way Handshake) 常簡略表示為:
 
 三向交握
 
 
其中 SYNACK 是 TCP 封包中的 控制位元 (Control Bits)
過程中省略了其他封包內容,例如:
三向交握 範例
(數值只為範例,不代表實際情形,為避免爭議,使用的是官方的範例數值)
 
 

範例說明

首先,以生活化的方式,解釋上例原理 (顏色對應上方圖示):
 
Alice,想跟遠方好友 Bob 交換動漫看,
但他們彼此都害怕會被唬爛,或是快遞不給力 (遺失或滯留 … etc),
因此他們說好,先嘗試交換三次「封面」 (此時通常無實際資料) ,以確保有安全的合作方式 (建立連線)。
 
 
1.Alice: 欸,Bob,我想跟你交換動漫 (SYN)
我寄給你《火影》第 100 話封面了。
 

 
 
 
2.Bob: 喔好啊,給你看《海賊》第 300 話封面,
確認收到 (ACK)《火影》100 話封面了,
期待收到《火影》101 (100+1)話封面,
我也想進行交換 (SYN)
 

 
 
 
3.Alice: 好唷,給你《火影》第 101 話封面,
確認收到 (ACK)《海賊》300 話封面了,
期待收到《海賊》 301 (300+1) 話封面。
 

 
 
 
完成這三步驟,連線就建立完成囉!
 


 

TCP 表頭格式 (TCP Header Format)

TCP-Header-Format
 
有了基本概念後,再看 TCP 的封包格式,便能快速上手!
控制位元 (Control Bits) 不過是 0 與 1 的切換 😀。
 
 

SYN (Synchronize sequence numbers)

  • 如果有設置,才發出連線請求,用來同步 序列號。

 
 

ACK (Acknowledgment field significant)

  • 如果有設置,使 確認號欄位 有效。

 
 

Sequence Number (序列號)

相當於上例的 漫畫 “集數”:

  • 如果 SYN 控制符 未設置,則為此區段第一個資料位元組 (octet) 的序列號。
  • 如果 SYN 控制符 已設置,則此為初始序列號 (initial sequence number , ISN),
    第一個資料位元組 (octet) 的序列號為 ISN + 1。
  • 每個藉由 TCP 連線傳送的資料的位元組,都會有一個序列號。

 
更多介紹,詳見 TCP 序列號 (Sequence Number, SEQ)
 
 

Acknowledgment Number (確認號)

  • 當確認連線後(已設置 ACK),這邊存放想要接收的 Seq 順序號。
  • 一旦連線建立,則每次都需送出。

 
更多介紹,詳見 TCP 錯誤控制 (Error Control)
 


 

資料區段 (Segment)

值得一提的是:
許多人誤解了三向式握手的 確認號 (ACK Number)
以為就是拿對方的 序列號 (Sequence Number) 再加 1 。
而忽略了 TCP Segment (資料區段)資料長度 (Len)
 
 
TCP Segment (資料區段) 簡單說就是:
『 應用層 的 Data 放入『 TCP 表頭 』後的,這整 “段” 資料 』,
時常為了方便溝通,直接說 TCP 封包,代替 Segment 的說法。
 
然而,在建立連線的過程中,往往還沒有應用層的資料,
因此 Segment Len 為 0, ACK Number 自然等於 對方 SEQ + 1,
若有傳輸資料,則通常 ACK Number 為 對方的「SEQ + Segment Len」。
 
譬如:
Client 這時若接著請求:
SEQ4 = 101, Segment Len4 = 87, ACK Number4 = 301
 
Server 端,應該回覆:
SEQ5 = 301, Segment Len5 = XXX, ACK Number5 = 101 + 87
 
詳見 RFC793
 
三向交握範例
 
 

作者: 鄭中勝
喜愛音樂,但不知為何總在打程式 ? 期許能重新審視、整理自身所學,幫助有需要的人。

在《TCP 三向交握 (Three-way Handshake)》中有 13 則留言

  1. 自動引用通知: TCP – 我好想要中樂透
  2. 自動引用通知: TCP三次握手 | 大专栏
  3. 剛開始把SYN當成SEQ的號碼(其他網站常寫SYN=K,ACK=J+1),所以一開始才會看不懂,要把SYN當成0/1控制碼來看。

    感謝作者的詳細解說。

發表迴響