搞懂 P2P 技術 (1) - P2P x IPv4 x NAT

前言

之前在開發 IPCam 與手機進行影音串流時,因為沒有 3D 繪圖或網路通訊背景,對於 P2P 一知半解。
這篇文章是我深入研究後的筆記,將會用一系列文章介紹完整的 P2P 技術與原理。本文是第一篇,聚焦於 P2P 背後的網路架構與 NAT 問題。


為什麼會需要 P2P?

在了解 P2P 穿透或打洞技術之前,我們要先知道它是為了解決什麼問題。
P2P 目的是讓裝置之間不依賴中心伺服器也能直接建立連線,這在 IoT、AR/VR 裝置、自架系統中非常關鍵。


Centralized vs Decentralized vs Distributed


中心化網路(Centralized)

所有 client 都連接至單一 server,由 server 統一管理與分發訊息。
這就像國家中央銀行發行貨幣,所有人都從央行取得錢。

  • ✅ 優點:部署簡單、易於維護、集中管理資料
  • ❌ 缺點:單點故障風險高、隱私問題、延遲受限於地理位置

去中心化網路(Decentralized)

有多台伺服器共用資料,client 可以從任一伺服器取得資訊。

  • ✅ 容錯率較高,性能彈性好
  • ❌ 系統設計複雜、維運成本較高、安全風險仍在

分佈式網路(Distributed)

去中心化的最進化版,不只沒有中心伺服器,每個節點都能共享、驗證資料。

如區塊鏈,每個節點都有完整資訊,不需信任中心機構

  • ✅ 高容錯性、透明、安全、節省成本
  • ❌ 系統架構與部署更複雜、程式需考慮設備差異

IoT 控制場景比較

📌 中心化控制:

  • 優點:Server 可控、部署快速、維護集中
  • 缺點:Server 故障即癱瘓、租機/頻寬成本高

📌 分佈式控制:

  • 優點:不依賴 Server、不需租費
  • 缺點:程式複雜、App/Firmware 更新困難、頻繁斷線需重連

疑問:既然 Server 不參與,那麼「分佈式架構下手機與 IPCam 怎麼直接通訊?」
這就是本篇核心 —— P2P + NAT Traversal 技術


什麼是 P2P(Peer to Peer)

P2P 是一種「去中心化」架構,每台裝置既是 client 也是 server。
裝置之間可互相存取與分享資源,不依賴中介節點。


IPv4 是什麼?為何會有 NAT?

IPv4 是網際網路的基礎,每台裝置要上網就需要一組獨立 IP 位址(類似地址)。
然而 IPv4 只有約 43 億組,不夠現代需求,因此產生了「NAT」這個替代方案。


NAT(Network Address Translation)

NAT 是讓多台裝置共用一個公共 IP 的技術。它透過內部 IP ↔ 外部 IP 的映射,節省 IP 使用量。
但也導致「外部裝置無法主動連線到內部裝置」的問題,這就是 P2P 最大障礙。


如何在雙方都處於 NAT 時建立 P2P?

以下用圖逐步說明 NAT 穿透的邏輯流程:

  1. A 發出封包 → 建立 A NAT 對映
  2. A 封包被 B NAT 阻擋 → 失敗
  3. B 發出封包 → 建立 B NAT 對映
  4. B 封包通過 A NAT → 成功連通
  5. 兩方皆有 NAT 記錄 → 後續雙向 P2P 成立

常見的 NAT 類型解析


✅ Full Cone NAT(完全錐型)

  • 任意外部主機皆可與內部裝置通訊
  • 最友善的 P2P NAT 類型
TIP

若你在開發初期無法判斷使用者 NAT 類型,建議預設優化邏輯為 Full Cone,可搭配 STUN server 回報 NAT 屬性。


🟡 Restricted Cone NAT(受限錐型)

  • 僅曾被內部主機連過的外部主機可回傳封包
  • 還算可接受,但需先有 outbound 流量建立 mapping

🟠 Port Restricted Cone NAT(端口限制型)

  • 與 Restricted 相似,但進一步要求 port 完全對應
  • 穿透難度較高

🔴 Symmetric NAT(對稱型)

WARNING

Symmetric NAT 幾乎無法直接打洞成功,需結合 TURN 伺服器作為中繼,否則雙方 mapping table 無法建立連通。


結論

P2P 架構與 NAT 類型是 IoT 裝置通訊不可忽視的底層核心。
理解不同情境下的連線行為,是確保穩定性與可擴展性的第一步。

TIP

如果你有更多實作經驗、遇到穿透失敗等問題,歡迎留言討論或寫信交流,我會持續更新這系列文章,也歡迎分享給有需要的朋友或團隊 🙌


參考資源




    Enjoy Reading This Article?

    Here are some more articles you might like to read next:

  • 💡 一台電腦操作多個 GitHub 帳號:最簡單快速的 SSH 設定方法
  • 🚀 如何使用 Excalidraw AI 快速生成專業級圖表,提升工作效率!
  • Setup Development Environment on a New macOS
  • Design Pattern (28) - Interpreter Pattern (解譯器模式)
  • Design Pattern (27) - Visitor Pattern (訪問者模式)