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,但目的完全不同。第一條是LAN內的本地控制;第二條才真正需要Internet與DNS。
二、MAC Address:你是哪一張網路卡?
MAC Address可以理解成網路介面的「硬體識別碼」。ESP32的Wi-Fi介面有自己的MAC,手機也有自己的MAC。
「區域網路裡,這個網路介面是誰?」
在同一個LAN內,資料傳遞最後仍需要靠資料鏈結層識別實際設備。IP可以改變,但MAC通常是網路介面的基礎識別資訊。
ESP32 MAC:
AA:BB:CC:DD:EE:FF
手機 MAC:
11:22:33:44:55:66
對學生來說,最簡單的理解方式是:
三、IP Address:資料要送到哪一台設備?
在水井三寶系統中,最常看到兩個IP:
ESP32 AP IP:
192.168.4.1
ESP32 STA IP:
192.168.1.119
這兩個IP屬於同一顆ESP32,但代表不同網路介面角色。
| IP | 用途 | 誰會使用 |
|---|---|---|
| 192.168.4.1 | ESP32 SoftAP本地控制頁 | 連到Shuijing-Treasures AP的手機 |
| 192.168.1.119 | ESP32連到外部Wi-Fi後取得的STA IP | 路由器與區域網路 |
所以同一台ESP32可以同時:
四、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代表內部設備與外界通訊。
五、Default Gateway:離開這個LAN,要先找誰?
當ESP32要連PythonAnywhere時,目標已經不在自己的區域網路內,因此資料必須先交給Default Gateway。
水井三寶實測曾顯示:
STA IP = 192.168.1.119
Gateway = 192.168.1.1
「如果目的地不在我這個LAN,我下一站要把封包交給誰?」
六、Domain Name:人類比較容易記住的名稱
與其讓程式直接記一串Server IP,我們通常使用Domain Name:
shuijingtreasures.pythonanywhere.com
這比IP好記,也方便Server未來搬移。
因此Domain可以理解成:
但電腦不能只靠名稱送封包,它仍需要把Domain轉成IP,這就是DNS的工作。
七、DNS:把Domain翻譯成IP
DNS可以想成「Internet電話簿」。
水井三寶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
這個案例非常適合用來提醒學生:
當DNS失敗,即使STA已取得IP,仍然找不到Domain對應的Server。
最後系統改用Public DNS:
DNS1 = 8.8.8.8
DNS2 = 1.1.1.1
DNS正常後,Cloud Test才真正成功。
八、Domain與DNS不要混在一起
| 概念 | 例子 | 作用 |
|---|---|---|
| Domain | shuijingtreasures.pythonanywhere.com | 人類容易記住的Server名稱 |
| DNS | 8.8.8.8 | 把Domain查成IP的服務 |
一句話記:
九、Port:同一台Server上,要找哪一個服務?
IP只能找到「哪一台主機」,但同一台主機上可能同時運行很多不同服務。
例如:
Web Server
SSH
Database
Email
API
...
Port就是用來區分服務。
| 服務 | 常見Port |
|---|---|
| HTTP | 80 |
| HTTPS | 443 |
| SSH | 22 |
水井三寶ESP32本地Edge Web使用:
http://192.168.4.1
沒有寫Port時,HTTP預設使用80。
而Django雲端API使用:
https://shuijingtreasures.pythonanywhere.com/...
HTTPS預設使用443。
十、URL其實把很多資訊組在一起
例如水井三寶Edge Web:
http://192.168.4.1/play?track=2
可以拆成:
| 部分 | 內容 | 意義 |
|---|---|---|
| Protocol | http | 使用HTTP |
| Host | 192.168.4.1 | ESP32本地IP |
| Port | 80 | 省略時使用HTTP預設Port |
| Path | /play | 播放功能 |
| Query | track=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放在同一條資料流
十二、五個名詞,用一句話一起記
| 名稱 | 一句話記憶 |
|---|---|
| MAC | 這張網路卡是誰? |
| IP | 設備目前在哪裡? |
| Domain | 人類想找的服務叫什麼名字? |
| DNS | 這個名字對應哪個IP? |
| Port | 主機上的哪個服務? |
十三、最容易搞錯的幾件事
ESP32可以取得192.168.1.119,但仍可能解析不了Domain。
因為這只是ESP32 SoftAP內的本地LAN通訊。
Domain必須先透過DNS解析成IP。
十四、遇到「雲端連不上」應該怎麼查?
不要一開始就修改Django。應該由下往上逐層檢查:
十五、這和OSI七層模型有什麼關係?
本篇出現的概念可以粗略放進OSI / TCP/IP架構中:
| 概念 | 大致所在層級 |
|---|---|
| Wi-Fi、MAC | Data Link |
| IP、Router、Gateway | Network |
| TCP、Port | Transport |
| DNS、HTTP、HTTPS | Application |
這也是下一步理解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
沒有留言:
張貼留言