第 9 課

先握手還是快快送?TCP(傳輸控制協定)、UDP(用戶資料包協定)與 Port(連接埠)

看片和傳訊息,送資料的方法一樣嗎?

帶路角色:小比閱讀時間約 10 分鐘

1. 漫畫開場

也可以直接點擊任何一格
漫畫文字版(畫面及對白)
格 畫面 對白
1 伺服器大廈 192.0.2.80 門口有信箱 53、80、443;小比把信投進 443 號。 字幕:「一部伺服器同時提供很多服務,每個服務有自己的信箱號碼,叫 Port(連接埠)。」
小比:「網頁要加密?那就是 443 號信箱!」
2 阿麥和伺服器之間的三個對話框:SYN、SYN-ACK、ACK(確認)。 字幕:「TCP(傳輸控制協定)送資料前,要先握三次手。」
阿麥:「你好,可以開始嗎?」
伺服器:「你好,收到,可以!」
阿麥:「好,開始吧!」
3 三個小比背著 1、2、3 號出發,2 號遺失;伺服器舉牌「收到 1,請再送 2!」;新的 2 號出發。 字幕:「TCP 會為每份資料編號;有遺失,就重送。」
小比:「2 號不見了?沒問題,我再跑一次!」
4 阿麥在視像通話,一疊明信片飛出,其中一張掉了。 字幕:「UDP(用戶資料包協定)不握手、不重送,快就是一切。」
阿麥:「少了一格畫面不要緊,繼續傾!」

2. 重點概念

一部電腦同時運行很多程式。Port(連接埠)就是同一部裝置上區分不同服務的號碼,好像大廈內的信箱號碼:IP Address(網絡位址)找到大廈,Port 找到信箱。

送資料有兩種方法:

  • TCP(傳輸控制協定):先握手,資料編號,遺失就重送,保證完整、按次序送達,好像掛號信。
  • UDP(用戶資料包協定):不握手,直接送出,快但不保證送達,好像明信片。

3. 看深一點

Port(連接埠):大廈內的信箱

IP Address 只能把封包送到哪一部裝置。但伺服器 192.0.2.80 可能同時是網頁伺服器和 DNS(網域名稱系統)伺服器,封包應該交給哪個程式?這要看 Port。

Port 是一個 16 位元的號碼,由 0 至 65535。常見的有:

Port 服務 用 TCP 還是 UDP
53 DNS(網域名稱系統) 主要用 UDP
67、68 DHCP(動態主機設定協定) UDP
80 HTTP(超文本傳輸協定),沒有加密的網頁 TCP
443 HTTPS(加密網頁傳輸協定) TCP(新一代的 HTTP/3 用 UDP)

IP Address 加上 Port,就準確說明了「哪部裝置的哪個服務」,寫法是用冒號連起來,例如 192.0.2.80:443。

第 7 課說 example.com 的伺服器用 192.0.2.80,尾數 80 剛好和網頁的 Port 80 一樣,方便你記住。不過兩者是不同的東西:一個是 IP Address 的一部分,一個是 Port。

寄件人也有 Port

不只伺服器有 Port,你的裝置也有。阿麥打開 example.com 時:

IP Address Port
寄件人(阿麥) 192.168.1.10 50000(系統臨時選的)
收件人(伺服器) 192.0.2.80 443

伺服器的 Port 是固定的,大家都知道網頁在 443;阿麥的 Port 是系統臨時選的,通常在 49152 至 65535 之間。回信時,伺服器就寄回 192.168.1.10:50000,阿麥的電腦就知道要交給哪一個瀏覽器分頁。

這就是第 8 課 NAT(網絡位址轉換)記錄簿裡那些 Port 號碼的來源。

圖解:Port 就像大廈內的信箱;上方比較 TCP 和 UDP 的分別

圖解:左邊是伺服器大廈 192.0.2.80,門口的信箱就是 Port;右邊比較 TCP(掛號信)和 UDP(明信片)的特點。

TCP 第一步:Three-way Handshake(三次握手)

TCP 送資料前,雙方要先建立一條「連線」,確定大家都準備好。這要三個步驟,叫 Three-way Handshake(三次握手):

步驟 名稱 誰說 意思
1 SYN 阿麥 → 伺服器 「你好,我想開始,我的編號由這裡起。」
2 SYN-ACK 伺服器 → 阿麥 「你好,收到你的編號,我的編號由這裡起。」
3 ACK 阿麥 → 伺服器 「收到,開始吧!」

三步完成後,雙方才開始送真正的資料。對話完畢後,雙方再用 FIN 訊息說「再見」,關閉連線。

TCP 怎樣做到「保證送達」?

  1. 編號:TCP 為每份資料編上 Sequence Number(序號)。
  2. 確認:收件人收到後,會回覆 ACK(確認),意思是「我已收到這裡為止,請送下一份」。
  3. 重送:寄件人等了一會仍然收不到 ACK,就知道資料可能遺失,會重新送出。
  4. 排次序:封包可能走不同的路、不按次序到達,收件人會按編號砌回正確次序,才交給程式。

所以,用 TCP 的程式不用擔心資料遺失或次序錯亂,TCP 已經處理好。

圖解:TCP 三次握手,以及 2 號封包遺失後重送的過程

圖解:上半部是三次握手 SYN、SYN-ACK、ACK;下半部是送資料:2 號遺失,收件人不斷回覆「請送 2」,寄件人於是重送 2 號。

UDP:送了就算

UDP 沒有握手、沒有編號確認、也不會重送。它只在資料外面加一個很小的 Header(標頭),寫上 Port 號碼,就送出去。這個 Header 只有 8 個 Byte(位元組),TCP 最少要 20 個 Byte。

聽起來好像很「求其」,但有些情況,快比完整重要:

  • 視像通話、網上遊戲:少了一格畫面,下一格很快就到;如果停下來等重送,畫面反而會卡住。
  • DNS 查詢:問題和答案都很短,一來一回就完成,不值得先握三次手;真的收不到答案,程式自己再問一次就可以了。
  • DHCP:裝置還沒有 IP Address,不能好好建立連線。

兩者比較

TCP(傳輸控制協定) UDP(用戶資料包協定)
比喻 掛號信 明信片
先建立連線 要,三次握手 不用
保證送達 會,遺失會重送 不保證
保證次序 會 不保證
Header 大小 最少 20 Byte 8 Byte
速度 較慢,要等確認 較快
常見用途 網頁、電郵、傳送檔案、即時通訊訊息 視像通話、網上遊戲、DNS、DHCP

回到引子問題:傳訊息時,一個字也不能少,所以用 TCP;視像通話時,順暢比完美重要,所以多數用 UDP。至於在網上看影片,很多平台用 TCP,也有些用建立在 UDP 之上的新技術,各有取捨。

4. 動手試試

任務一:看看電腦正在用的 Port

在電腦上打開「命令提示字元」(Windows)或「終端機」(macOS),先用瀏覽器開幾個網站,然後輸入:

netstat -an

你會見到很多行,每行代表一個對話。找一找結尾是 :443 或 .443 的那些行,它們就是你正在連接的 HTTPS 網站。旁邊的 ESTABLISHED 表示 TCP 已經握完手、連線已建立。

看不懂全部內容也不要緊,能找到 443 就已經很好。

小互動

TCP 三次握手的次序

把 TCP 建立連線的三個步驟排好次序。

  1. SYN-ACK:伺服器回覆「你好,收到,可以!」
  2. ACK:阿麥回覆「好,開始吧!」
  3. SYN:阿麥說「你好,可以開始嗎?」

小互動

TCP 還是 UDP?

以下六種用途,最適合用哪一種?

  1. 1下載一個手機程式

  2. 2和朋友視像通話

  3. 3寄一封電郵

  4. 4玩多人網上射擊遊戲

  5. 5查詢 example.com 的 IP Address

  6. 6在網上銀行轉帳

5. 比喻的極限

  • 掛號信不是真的「一定」送到。 如果網線斷了,TCP 也送不到;它的保證是「送到的資料一定完整、按次序」,送不到時會通知程式出錯。
  • 明信片也不一定會掉。 大部分 UDP 封包其實都能順利到達,只是 UDP 本身不負責檢查和重送。
  • 握手不只是打招呼。 三次握手時,雙方會交換起始的 Sequence Number 等資料,為之後的確認和重送做準備。
  • UDP 之上可以自己加功能。 有些新技術(例如 HTTP/3 用的 QUIC)建立在 UDP 之上,再自己做編號和重送,兼顧速度與可靠。
  • Port 號碼沒有「必須」。 443 是慣例,伺服器也可以用其他 Port 提供網頁,只是瀏覽器預設會找 443。

6. 小測驗

第 1 題,共 3 題伺服器 192.0.2.80 同時提供網頁和 DNS 服務。收到封包時,它靠什麼決定交給哪一個程式?
第 2 題,共 3 題TCP 的 Three-way Handshake(三次握手),正確次序是哪一個?
第 3 題,共 3 題視像通話為什麼多數用 UDP(用戶資料包協定)?

7. 重點筆記

  • Port(連接埠)是 0 至 65535 的號碼,用來分辨同一部裝置上的不同服務;IP Address 加 Port 寫成 192.0.2.80:443。
  • 常見 Port:53 是 DNS,80 是 HTTP,443 是 HTTPS;你的裝置則臨時選一個 Port 作寄件人。
  • TCP(傳輸控制協定)先用 Three-way Handshake(SYN、SYN-ACK、ACK)建立連線,再用編號、確認和重送保證資料完整、按次序。
  • UDP(用戶資料包協定)不握手、不重送,Header 只有 8 Byte,適合要快的用途。
  • 要完整用 TCP,要快用 UDP。

下一站

你已經認識了全部角色和他們的工作。最後一課,我們把所有東西連起來:由你按下 Enter,到網頁出現,中間到底發生了什麼?