TL;DR | 面試情境模擬 #
👴 面試官:請解釋一下 TCP 的三次握手是什麼?
🧑💻 你:是為了驗證雙方都能「正常收發」。流程是:客戶端發起請求 (SYN),伺服器同意並反向請求 (SYN+ACK),最後客戶端確認 (ACK)。三次來回確保雙向通道暢通,連線就建立了。
為什麼要握手?(TCP vs UDP) #
network傳輸有兩種常見的協定:
- UDP(像寄明信片):直接把資料丟出去,對方有沒有收到不知道。速度快,適合影片直播、線上遊戲。
- TCP(像打電話):傳資料前,要先確認對方真的在,而且準備好接收了。可靠度高,適合網頁瀏覽、檔案傳輸。
這個「打電話確認雙方都在」的過程,就是三次握手。
圖解三次握手 #
如果用打電話來比喻,整個過程如下:
你 (Client) 對方 (Server)
| |
|--- 1. 我想跟你建立連線 (SYN) ------->|
| |
|<-- 2. 收到!那我也要連線 (SYN+ACK) --|
| |
|--- 3. 收到,連線成立 (ACK) --------->|
| |
| (開始傳輸資料) |
專業術語解析 #
不要被英文嚇到,其實只有兩個單字:
- SYN (Synchronize):同步請求。意思是問「我想連線,你在嗎?」
- ACK (Acknowledgement):確認回應。意思是回「好,我收到了!」
步驟拆解 #
- 第一次握手 (SYN):客戶端發出連線請求。
- 第二次握手 (SYN+ACK):伺服器確認收到,並同時也向客戶端發起連線請求。這一步把 SYN 和 ACK 合併發送。
- 第三次握手 (ACK):客戶端確認收到伺服器的回覆。
三次缺一不可,這樣才能確保「你收得到我」且「我也收得到你」。
💡 進階補充:面試官可能會追問的細節 #
如果你想展現更扎實的底層基礎,可以準備以下這兩題常見追問:
Q1:為什麼不能只握手兩次? #
假設只有兩次握手:
- Client:喂,你在嗎?(SYN)
- Server:我在啊!(SYN+ACK) (Server 認為連線已經建立,開始準備收發資料)
問題來了:萬一 Server 的回覆 (SYN+ACK) 在半路弄丟了怎麼辦? Client 沒收到回覆,會認為 Server 不在;但 Server 卻已經分配了記憶體資源在乾等。這會導致伺服器資源白白浪費(這也是 SYN Flood 攻擊 的原理)。
所以必須要有第三次握手(Client 說:我收到了),Server 才能確信連線真正暢通。
Q2:什麼是「同步」?握手交換了什麼資訊? #
握手不只是打招呼,主要是在同步雙方的傳輸狀態。
TCP 傳資料時,會給每個封包編號(序列號),確保資料不會亂序或遺失。這三個步驟中,雙方都在告訴對方:「我接下來傳的資料,編號會從XX開始算喔!」 (備註:為了安全性,這個起始編號通常是隨機生成的,不會是 1。)