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
36
37
38
39
40
41
42
mDNS 協定設計了一套機制來處理**名稱衝突 (Name Conflict Resolution)**,以確保區域網路中的每個 `.local` 名稱都是唯一的。這個過程通常是**自動**進行的,使用者不需手動介入。

---

### mDNS 名稱衝突查找機制

當一個裝置(mDNS Responder)打算使用一個特定的 `.local` 名稱(例如 `myserver.local`)時,它會遵循以下步驟:

1. ### 探測 (Probing)
在正式宣告自己使用某個名稱之前,mDNS Responder 會進行一系列的「探測」或「探測性查詢」。它會向多播位址(例如 IPv4 的 `224.0.0.251` 或 IPv6 的 `ff02::fb`)發送 DNS 查詢,詢問是否有其他裝置已經使用了它想要使用的名稱。
* 這些查詢會帶有特殊的標記,表示這是一個探測而非一般的查詢。
* 如果裝置在預設時間內沒有收到任何回應,它就認為這個名稱是可用的。

2. ### 宣告 (Announcing)
一旦裝置確認名稱是可用的,它就會向多播位址發送一系列的「宣告」訊息,通知網路中的其他裝置它正在使用這個名稱,以及它對應的 IP 位址。這些宣告也會被其他裝置監聽並緩存起來。

3. ### 衝突偵測與解決 (Conflict Detection and Resolution)
在探測和宣告的過程中,如果裝置收到:
* **在探測階段收到回應:** 如果在探測期間,其他裝置回覆說它們已經在使用這個名稱,那麼發起探測的裝置就會認為發生了衝突。
* **在宣告之後收到相同名稱但不同 IP 的回應:** 如果在宣告之後,有另一個裝置使用相同的名稱進行宣告,但指向不同的 IP 位址,這也表示衝突。

當偵測到衝突時,mDNS 協定的處理方式是:

* **放棄並嘗試新名稱:** 發生衝突的裝置會放棄原先嘗試使用的名稱,並嘗試一個新的、唯一的名字。最常見的策略是**在名稱後面加上數字後綴**,例如:
* 如果 `myserver.local` 被佔用,它可能會嘗試 `myserver-2.local`。
* 如果 `myserver-2.local` 也被佔用,它可能會再嘗試 `myserver-3.local`,以此類推,直到找到一個可用的名稱。
* **重新探測和宣告:** 一旦選定了新的名稱,裝置會重複上述的探測和宣告過程。

### 這種機制如何處理?

* **自動化:** 整個過程都是自動的,不需要使用者手動干預。
* **先來後到原則:** 通常,最先成功宣告並建立其名稱的裝置會保留該名稱。後來者會被強制更改名稱。
* **韌性:** 即使網路中存在惡意的或配置錯誤的裝置試圖劫持名稱,mDNS 也能透過這些機制來確保多數情況下名稱的唯一性和解析的正確性。

### 實際體驗

在實際使用中,你可能會看到:

* 如果你有多台裝置預設都叫 `raspberrypi.local`,那麼只有第一台上線的會保持這個名稱,其他的可能會變成 `raspberrypi-2.local`、`raspberrypi-3.local` 等。
* 有時候,即使沒有明顯的衝突,設備在重啟後也可能因為短暫的同步問題而重新獲得帶有數字的名稱,但通常情況下,如果原始名稱沒有被佔用,下次重啟可能會恢復。

總體而言,mDNS 的名稱衝突解決機制確保了 `.local` 網域在區域網路中的穩定性和可用性,即使在多個裝置同時使用相同預設名稱的情況下。