網路協定 EP.09
傳輸層核心

TCP/IP 深度解析:
從握手到揮手的旅程

為什麼網路傳輸需要這麼繁雜的步驟?深入探討可靠傳輸背後的設計哲學,掌握擁塞控制與視窗機制。

三向交握
擁塞控制
OSI 七層模型
✍️ Joseph Chen

網路的契約:可靠性的保證

如果說 IP (Internet Protocol) 是將信件送到地址的快遞員,那麼 TCP (Transmission Control Protocol) 就是確保對方真的收到信、且信件順序沒亂掉的「掛號機制」。

TCP 的四大核心特點

1

面向連接 (Connection-Oriented)

資料傳輸前,雙方必須先建立一條虛擬的雙向通道。

2

可靠傳輸 (Reliable Delivery)

丟包重傳、重複包過濾、損壞包檢測。

3

流量控制 (Flow Control)

防止發送者發得太快,導致接收者處理不過來。

4

擁塞控制 (Congestion Control)

根據網路塞車情況,動態調整發送速度。

一、三向交握 (3-way Handshake)

這是 TCP 建立連線的過程。為什麼非得要「三向」不可?因為這能保證雙方的「發送」與「接收」能力都是正常的。

CLIENT

SERVER

1

SYN (Synchronize)

"聽得到嗎?我想跟你連線。"

2

SYN-ACK

"聽到了!我也想跟你連線。"

3

ACK (Acknowledge)

"OK!那我們開始吧。"

為什麼不能兩次交握?

想像 Client 發送了第一個 SYN 但網路太塞沒及時到,Client 又發了第二個 SYN。過了一陣子 Server 收到了遲到的第一個 SYN 並回覆 ACK。 如果是兩次交握,Server 此時就會開啟資源等資料。但 Client 可能早就無視第一個 SYN 了。三向交握是為了防止「已失效的連線請求」突然又傳到 Server 造成資源浪費。

二、四次揮手 (4-way Handshake)

連線容易,分手難。釋放連線需要四個步驟,因為 TCP 是「全雙工」,雙方都必須獨立關閉自己的發送通道。

揮手流程指令
1. Client -> FIN (我要掛電話了)
2. Server -> ACK (我知道了,但我這邊可能還有資料沒傳完)
... Server 傳完最後的資料 ...
3. Server -> FIN (我也準備好掛電話了)
4. Client -> ACK (收到,拜拜!) -> 進入 TIME_WAIT
TIME_WAIT:最後的溫柔

Client 在送出最後一個 ACK 後,不會立刻消失,而是會等 2MSL (約 4 分鐘)。 這是為了確保 Server 真的收到了最後那個 ACK。如果沒收到,Server 會重發 FIN,Client 還能補送 ACK。

三、流量控制:滑動視窗 (Sliding Window)

如果發送端是一台超級電腦,接收端是一台舊手機,發送端如果不控制速度,手機的 Buffer 會瞬間爆掉。 TCP 使用 Window Size 來動態告知對方:「我目前還有多少空間可以收資料」。

零視窗 (Zero Window)

當接收端 Buffer 滿了,會回傳 Window=0,這時發送端會停止傳送,並定期詢問「有空位了嗎?」。

視窗縮放 (Scaling)

在高速網路下,傳統 16-bit 的 Window Size 太小,現代 TCP 會使用 Scaling Option 來擴展到 GB 等級。

四、擁塞控制:網路塞車怎麼辦?

流量控制是為了「對手」,擁塞控制則是為了「整個網路環境」。

慢啟動 (Slow Start)

一開始只傳 1 個包,沒事就加倍 (1->2->4->8),直到觸發門檻。

擁塞避免 (Congestion Avoidance)

達到門檻後,改為線性增加 (+1),謹慎測試網路極限。

快重傳 (Fast Retransmit)

當收到 3 個重複的 ACK,不等計時器到,直接重傳遺失的包。

總結:致敬精妙的底層設計

TCP/IP 協議族設計於數十年前,卻依然支撐著現代龐大的網際網路。它優雅地平衡了可靠性與效率,處理了無數種複雜的網路狀況。作為軟體工程師,理解這些底層邏輯,能幫你在 Debug 網路逾時、最佳化 API 效能時,擁有更廣闊的視野。

#TCP
#IP
#Network
#Reliability
#Handshake
#CongestionControl
#CS101