1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
---
這是一個非常棒的問題,觸及到區域網路內**多點傳播 (multicast)** 的核心機制,也是 mDNS 能夠運作的基礎!

### 路由器與多點傳播(Multicast)

首先,來澄清一下路由器的角色:

* **路由器**通常**不會**像處理傳統的廣播 (broadcast) 訊息那樣,無差別地把**多點傳播**訊息轉發給它管理的所有裝置。這樣做會導致網路流量氾濫。
* 路由器會處理**多點傳播**,但它通常會配合像 **IGMP (Internet Group Management Protocol)** 這樣的協定來管理多點傳播的流量。IGMP 讓裝置可以「訂閱」它們感興趣的多點傳播群組。
* 在一個簡單的家庭或小型辦公室區域網路中,許多路由器(尤其是消費級路由器)對於**同一子網路內**的多點傳播流量,預設行為會比較「寬鬆」。它們通常會允許這些多點傳播封包在連接到同一交換機或 Wi-Fi 網路的所有埠(裝置)之間流動,而不需要每個裝置都明確訂閱。這使得 mDNS 可以在大多數情況下「零配置」運行。

### 樹莓派如何接收到廣播?「監聽」的機制

樹莓派(以及任何支援 mDNS 的裝置)之所以能「聽」到廣播,是因為它內部的**作業系統和網路堆疊**配置了特定的行為:

1. **加入多點傳播群組:**
* 當樹莓派上的 **mDNS 服務**(在 Linux 上通常是 **Avahi daemon**)啟動時,它會告訴底層的網路介面(例如 Wi-Fi 或乙太網路卡)去**「加入」或「監聽」一個特定的多點傳播 IP 位址**。對於 IPv4 的 mDNS 來說,這個位址就是 `224.0.0.251`。
* 這就像樹莓派告訴它的網卡:「請幫我留意所有發送到 `224.0.0.251` 這個地址的郵件,即使收件人不是我自己的 IP。」

2. **網卡層級的篩選:**
* 當多點傳播封包到達路由器的交換機部分,或者 Wi-Fi 無線電波時,這些封包會被傳送到連接在該網路中的所有裝置的網路卡。
* 然而,你的**網路卡**並不會把所有它接收到的封包都送上作業系統。它會根據你加入的多點傳播群組列表進行初步的**硬體篩選**。只有那些目的地是你的網路卡自己 IP 或你已加入的多點傳播群組 IP 的封包,才會被傳遞給作業系統。
* 所以,當迷你電腦發出一個針對 `224.0.0.251` 的 mDNS 查詢時,樹莓派的網卡會識別到「哦,這是我的裝置訂閱的多點傳播位址」,然後將這個封包傳遞給樹莓派的作業系統。

3. **作業系統和 mDNS 服務的處理:**
* 一旦封包到達樹莓派的作業系統,作業系統會將其路由到監聽 **UDP Port 5353** 的 **Avahi daemon** (mDNS 服務)。
* Avahi daemon 會解析這個 mDNS 查詢,如果發現這個查詢是關於它自己(例如 `raspberrypi.local`),它就會按照 mDNS 協定,向多點傳播位址發送一個包含自己 IP 的回應。

### 總結

所以,樹莓派並不是被動地等待路由器轉發所有廣播。它是在主動地**設定自己去「監聽」特定的多點傳播位址(`224.0.0.251`)和 Port(5353)**。當有針對該位址的 mDNS 訊息傳遞到它所在的網路時,它的網卡和作業系統就能精確地接收並處理這些訊息。

這有點像:房間裡有很多人,當有人喊出一個特定暗號時,只有知道並想回應這個暗號的人才會出聲,而不是所有人聽到所有聲音都回應。

這個解釋有幫助嗎?