網路管理 - mDNS(Multicast DNS)


在本篇文章中,我們將深入介紹什麼是 mDNS(Multicast DNS)、它的工作原理、使用場景,以及如何實作與除錯。這是一項對 IoT、智慧家庭、區網服務自動發現非常關鍵的技術。


簡介 - 什麼是 mDNS?

mDNS(Multicast DNS)是一種 不需要中央 DNS 伺服器就能進行名稱解析的協定,它讓區域網路(LAN)中的裝置可以透過名稱來互相發現彼此,而不需要手動輸入 IP 位址。

舉例來說,你可以直接在瀏覽器輸入:

1
http://myprinter.local

而不是:

1
http://192.168.1.123

這裡的 .local 就是 mDNS 的預設網域。


為什麼需要 mDNS?

傳統 DNS 需要中央伺服器(如 8.8.8.8),對於小型或動態網路環境(例如家庭、辦公室、IoT 設備),設定成本太高。而 mDNS 讓裝置之間 自動廣播自己的名稱與服務,實現「即插即用」。


使用 mDNS 的好處包括:

  • 不需額外安裝 DNS 伺服器
  • 支援動態 IP(搭配 DHCP)
  • 適合 IoT、智慧家庭、內網開發

mDNS 如何運作?

mDNS 使用 UDP 5353 埠口,在本地網路中進行 multicast 廣播。以下是其基本流程:

  1. 設備註冊名稱
  2. 裝置開機後,廣播訊息:「我叫 mydevice.local,IP 是 192.168.1.10」。
    3.其他設備查詢名稱
  3. 某台電腦發送 multicast 尋找:「誰知道 mydevice.local 是誰?」
  4. 擁有名稱的設備回應
  5. 若名稱吻合,目標裝置回傳 IP,完成名稱解析。

哪些技術或產品用到 mDNS?

範例 描述
Apple Bonjour mDNS 的典型實作,可讓 macOS / iOS 設備自動發現AirPrint、AirPlay 裝置。
Chromecast 使用 mDNS 廣播,讓手機快速找到要投放的裝置。
ESP32 / IoT 裝置 常透過 ESPmDNS 函式庫註冊名稱,提供 HTTP 介面給使用者
Zero-configuration networking (Zeroconf) 結合 mDNS、AutoIP、DNS-SD 實現無需設定即可自動建立網路的目標。

實作範例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from zeroconf import ServiceInfo, Zeroconf
import socket

desc = {'path': '/'}
info = ServiceInfo(
"_http._tcp.local.",
"mywebserver._http._tcp.local.",
addresses=[socket.inet_aton("192.168.1.123")],
port=8080,
properties=desc,
server="mywebserver.local."
)

zeroconf = Zeroconf()
zeroconf.register_service(info)

try:
input("Press enter to exit...\n\n")
finally:
zeroconf.unregister_service(info)
zeroconf.close()

除錯與實用工具

  • avahi-browse (Linux) 掃描網路上的 mDNS 服務
  • dns-sd (macOS) 查詢與註冊 mDNS 名稱
  • bonjour browser GUI 工具,方便探索區網服務
  • mdns-scan (Linux) 快速顯示所有 mDNS 名稱與服務

注意事項

  • 防火牆要開放 UDP 5353 埠口
  • 名稱衝突時會自動加入編號後綴(如 mydevice-2.local)
  • 部分網路(如企業 Wi-Fi)可能封鎖 multicast,導致 mDNS 無法使用

總結

mDNS 是一項低門檻、高實用性的技術,能大幅簡化區網裝置的互連與管理。無論是 IoT 開發、內部服務部署、還是打造智慧家庭系統,mDNS 都值得你學習與掌握!