2026年8月16日 星期日

[水井村USR] IP、MAC、DNS、Domain與Port

IP、MAC、DNS、Domain與Port

從「水井三寶智慧互動展覽系統」看懂網際網路位址與服務

MAC → IP → DNS → Domain → Port → HTTP/HTTPS

當手機可以打開 192.168.4.1,ESP32也顯示 STA=ONLINE,為什麼Django有時還是收不到資料?這個問題正好可以帶學生理解網際網路中幾個最重要、也最容易混淆的概念:MAC、IP、DNS、Domain與Port。它們不是同一件事,而是在不同階段回答不同問題:你是誰?你在哪裡?我要找誰?服務開在哪裡?

一、先看水井三寶的真實網路環境

目前水井三寶智慧互動展覽系統同時有兩條重要網路路徑:

【本地控制】 手機 ↓ Wi-Fi ESP32 SoftAP ↓ http://192.168.4.1 【雲端同步】 ESP32 STA ↓ Wi-Fi Router ↓ Gateway ↓ DNS ↓ Internet ↓ shuijingtreasures.pythonanywhere.com ↓ Django API

這兩條路徑雖然都使用Wi-Fi,但目的完全不同。第一條是LAN內的本地控制;第二條才真正需要Internet與DNS。

二、MAC Address:你是哪一張網路卡?

MAC Address可以理解成網路介面的「硬體識別碼」。ESP32的Wi-Fi介面有自己的MAC,手機也有自己的MAC。

MAC主要回答:
「區域網路裡,這個網路介面是誰?」

在同一個LAN內,資料傳遞最後仍需要靠資料鏈結層識別實際設備。IP可以改變,但MAC通常是網路介面的基礎識別資訊。

ESP32 MAC:
AA:BB:CC:DD:EE:FF

手機 MAC:
11:22:33:44:55:66

對學生來說,最簡單的理解方式是:

MAC像「網路卡的身分證號」;IP像「目前所在位置的地址」。

三、IP Address:資料要送到哪一台設備?

在水井三寶系統中,最常看到兩個IP:

ESP32 AP IP:
192.168.4.1

ESP32 STA IP:
192.168.1.119

這兩個IP屬於同一顆ESP32,但代表不同網路介面角色。

IP用途誰會使用
192.168.4.1ESP32 SoftAP本地控制頁連到Shuijing-Treasures AP的手機
192.168.1.119ESP32連到外部Wi-Fi後取得的STA IP路由器與區域網路

所以同一台ESP32可以同時:

AP角色: 我提供一個Wi-Fi給別人連 IP = 192.168.4.1 STA角色: 我自己去連另一台Wi-Fi IP = 192.168.1.119
這就是AP+STA共存的核心:一邊當本地Server,一邊當Internet Client。

四、Private IP與Public IP有什麼差別?

192.168.x.x這類位址是Private IP,只在區域網路內使用,不能直接在Internet上被全球路由。

例如:

ESP32:192.168.1.119
Router:192.168.1.1

ESP32如果要存取Internet,通常必須經過Router,再由Router以Public IP代表內部設備與外界通訊。

ESP32 192.168.1.119 ↓ Router / NAT 192.168.1.1 ↓ Public IP ↓ Internet

五、Default Gateway:離開這個LAN,要先找誰?

當ESP32要連PythonAnywhere時,目標已經不在自己的區域網路內,因此資料必須先交給Default Gateway。

水井三寶實測曾顯示:

STA IP = 192.168.1.119
Gateway = 192.168.1.1
Gateway回答:
「如果目的地不在我這個LAN,我下一站要把封包交給誰?」

六、Domain Name:人類比較容易記住的名稱

與其讓程式直接記一串Server IP,我們通常使用Domain Name:

shuijingtreasures.pythonanywhere.com

這比IP好記,也方便Server未來搬移。

因此Domain可以理解成:

給人看的服務名稱。

但電腦不能只靠名稱送封包,它仍需要把Domain轉成IP,這就是DNS的工作。

七、DNS:把Domain翻譯成IP

DNS可以想成「Internet電話簿」。

shuijingtreasures.pythonanywhere.com ↓ DNS ↓ Server IP Address

水井三寶V1.7最重要的一次除錯,就是發現:

WiFi status = 3
STA IP = 192.168.1.119
Gateway = 192.168.1.1
DNS = 192.168.1.1
RSSI = -20

Resolving:
shuijingtreasures.pythonanywhere.com

DNS result = -54
ERROR: DNS FAILED

這個案例非常適合用來提醒學生:

Wi-Fi連線成功,不代表Internet服務一定可用。
當DNS失敗,即使STA已取得IP,仍然找不到Domain對應的Server。

最後系統改用Public DNS:

DNS1 = 8.8.8.8
DNS2 = 1.1.1.1

DNS正常後,Cloud Test才真正成功。

八、Domain與DNS不要混在一起

概念例子作用
Domainshuijingtreasures.pythonanywhere.com人類容易記住的Server名稱
DNS8.8.8.8把Domain查成IP的服務

一句話記:

Domain是「名字」,DNS是「查名字的服務」。

九、Port:同一台Server上,要找哪一個服務?

IP只能找到「哪一台主機」,但同一台主機上可能同時運行很多不同服務。

例如:

Web Server
SSH
Database
Email
API
...

Port就是用來區分服務。

服務常見Port
HTTP80
HTTPS443
SSH22

水井三寶ESP32本地Edge Web使用:

http://192.168.4.1

沒有寫Port時,HTTP預設使用80。

而Django雲端API使用:

https://shuijingtreasures.pythonanywhere.com/...

HTTPS預設使用443。

IP回答「哪台電腦」;Port回答「那台電腦上的哪個服務」。

十、URL其實把很多資訊組在一起

例如水井三寶Edge Web:

http://192.168.4.1/play?track=2

可以拆成:

部分內容意義
Protocolhttp使用HTTP
Host192.168.4.1ESP32本地IP
Port80省略時使用HTTP預設Port
Path/play播放功能
Querytrack=2播放第2個故事

再看Django API:

https://shuijingtreasures.pythonanywhere.com/api/exhibition/events/

可拆成:

https
  ↓
Domain
shuijingtreasures.pythonanywhere.com
  ↓
Port 443
  ↓
Path
/api/exhibition/events/

十一、把MAC、IP、DNS、Domain與Port放在同一條資料流

手機按「002 烏龜故事」 ↓ Wi-Fi區域網路 ↓ MAC 找到LAN中的實際網路介面 ↓ IP 找到ESP32:192.168.4.1 ↓ Port 80 找到ESP32 Web Server ↓ HTTP GET /play?track=2 ↓ 故事播放 之後雲端同步: ESP32 STA 192.168.1.119 ↓ Gateway 192.168.1.1 ↓ DNS 8.8.8.8 ↓ Domain shuijingtreasures.pythonanywhere.com ↓ Server IP ↓ Port 443 ↓ HTTPS ↓ Django API

十二、五個名詞,用一句話一起記

名稱一句話記憶
MAC這張網路卡是誰?
IP設備目前在哪裡?
Domain人類想找的服務叫什麼名字?
DNS這個名字對應哪個IP?
Port主機上的哪個服務?

十三、最容易搞錯的幾件事

1
有IP,不代表DNS一定正常。
ESP32可以取得192.168.1.119,但仍可能解析不了Domain。
2
能開192.168.4.1,不代表Internet正常。
因為這只是ESP32 SoftAP內的本地LAN通訊。
3
Domain不是IP。
Domain必須先透過DNS解析成IP。
4
IP相同,Port不同,可以是完全不同的服務。

十四、遇到「雲端連不上」應該怎麼查?

不要一開始就修改Django。應該由下往上逐層檢查:

① Wi-Fi connected? ↓ ② 有沒有取得 IP? ↓ ③ Gateway 正常? ↓ ④ DNS 可以解析 Domain? ↓ ⑤ TCP / Port 443 可連? ↓ ⑥ HTTPS 成功? ↓ ⑦ Django API URL 正確? ↓ ⑧ Device ID / API Key 正確? ↓ ⑨ JSON格式正確? ↓ ⑩ Database / Dashboard 有資料?
這就是分層除錯的價值:不是看到「Cloud失敗」就全部一起查,而是先判斷問題究竟在哪一層。

十五、這和OSI七層模型有什麼關係?

本篇出現的概念可以粗略放進OSI / TCP/IP架構中:

概念大致所在層級
Wi-Fi、MACData Link
IP、Router、GatewayNetwork
TCP、PortTransport
DNS、HTTP、HTTPSApplication

這也是下一步理解OSI七層模型的重要基礎。

十六、課堂思考題

問題一:
如果手機可以打開192.168.4.1,但是Django沒有收到資料,MAC、IP、DNS、Domain、Port中,哪些已經可以確定正常?哪些還不能?
問題二:
ESP32的STA IP從192.168.1.119變成192.168.1.125,為什麼Django網址不需要跟著改?
問題三:
為什麼 https://... 沒有寫 :443,瀏覽器仍知道要連443?
問題四:
如果DNS失敗,直接把Server IP寫進程式可以暫時解決嗎?這樣做又會產生什麼維護問題?

十七、結語:網際網路不是一條線,而是一連串「找到正確對象」的過程

從水井三寶實作可以看見,網際網路通訊不是單純「ESP32有Wi-Fi,所以就能上雲端」。資料必須先找到正確的網路介面、正確的IP、正確的Gateway、正確的Server名稱,再經由DNS取得Server IP,最後還要找到正確的Port與應用服務。

因此,MAC、IP、DNS、Domain與Port並不是五個孤立的名詞,而是一條完整通訊鏈上的不同角色。當學生能用一筆「烏龜故事事件」解釋這五個概念,就代表他已經開始真正理解網際網路是如何運作的。

MAC IP Gateway DNS Domain Port HTTP HTTPS ESP32 Django

沒有留言:

張貼留言