疑問
- 我的電腦有一個主機名,為什么局域網內的其他設備可以通過主機名訪問我的電腦?
- 我的電腦是如何通過一個主機名找到對應設備的IP的?
答案
因為有mDNS和LLMNR協議。
LLMNR定義
在DNS 服務器不可用時,DNS 客戶端計算機可以使用 本地鏈路多播名稱解析 (LLMNR—Link-Local Multicast Name Resolution)(也稱為多播 DNS 或 mDNS)來解析本地網段上的名稱。例如,如果路由器出現故障,從網絡上的所有 DNS 服務器切斷了子網,則支持 LLMNR 的子網上的客戶端可以繼續在對等基礎上解析名稱,直到網絡連接還原為止。
除了在網絡出現故障的情況下提供名稱解析以外,LLMNR 在建立臨時對等網絡(例如,機場候機區域)方面也非常有用。
LLMNR為使用IPv4、IPv6或者同時使用這兩種地址的設備提供了點對點名稱解析服務,可以讓同一子網中的IPv4和IPv6設備不需要WINS或DNS服務器就可以解析對方的名稱,而這個功能是WINS和DNS都無法完全提供的。雖然WINS可以為IPv4提供客戶端-服務器以及點對點名稱解析服務,不過並不支持IPv6地址。至於DNS,雖然支持IPv4和IPv6地址,但必須通過專門的服務器才能提供名稱解析服務。LLMNR通過在DNS名稱解析服務不可用時提供解析服務,彌補了DNS的不足。
LLMNR工作過程:
- 主機在自己的內部名稱緩存中查詢名稱。如果在緩存中沒有找到了名稱,那么主機就會向自己配置的主DNS服務器發送查詢請求。如果主機沒有收到回應或收到了錯誤信息,主機還會嘗試搜索配置的備用DNS服務器。如果主機沒有配置DNS服務器,或者如果在連接DNS服務器的時候沒有遇到錯誤但失敗了,那么名稱解析會失敗,並轉為使用LLMNR。
- 主機通過用戶數據報協議(UDP)發送多播查詢,查詢主機名對應的IP地址,這個查詢會被限制在本地子網(也就是所謂的鏈路局部)內。
- 鏈路局部范圍內每台支持LLMNR,並且被配置為響應傳入查詢的主機在收到這個查詢請求后,會將被查詢的名稱和自己的主機名進行比較。如果沒有找到匹配的主機名,那么計算機就會丟棄這個查詢。如果找到了匹配的主機名,這台計算機會傳輸一條包含了自己IP地址的單播信息給請求該查詢的主機。
MDNS
mdns 即多播DNS(Multicast DNS),MDNS主要實現了在沒有傳統DNS服務器的情況下使局域網內的主機實現相互發現和通信,使用的端口為5353,遵從dns協議,使用現有的DNS信息結構、名語法和資源記錄類型。並且沒有指定新的操作代碼或響應代碼。
在局域網中,設備和設備之前相互通信需要知道對方的ip地址的,大多數情況,設備的ip不是靜態ip地址,而是通過dhcp 協議動態分配的ip 地址,如何設備發現呢,就是要mdns大顯身手,例如:現在物聯網設備和app之間的通信,要么app通過廣播,要么通過組播,發一些特定信息,感興趣設備應答,實現局域網設備的發現,當然mdns 比這強大的多。
- mDNS 基於 UDP 協議,組播地址: 組播地址使用的是D類地址,地址范圍為:224.0.0.0—239.255.255.25。
- mdns 使用組播地址為: 224.0.0.251 (ipv6: FF02::FB) 端口為5353,mdns 是用於局域網內部的,並且主機的域名為.local 結尾,每個進入局域網的主機,如果開啟了mDNS服務的話,都會向局域網內的所有主機組播一個消息,我是誰(域名),和我的IP地址是多少。然后其他有mdns服務的主機就會響應,也會告訴你,它是誰(域名),它的IP地址是多少。 當然設備需要服務時,就是使用mdns 查詢域名對對應的ip地址,對應的設備收到該報文后同樣通過組播方式應答,此時其他主機設備也是可以收到該應答報文,其他主機也會記錄域名和ip 以及ttl 等,更新緩存。比如,A主機進入局域網,開啟了 mDNS 服務,並向 mDNS 服務注冊以下信息:我提供 FTP 服務,我的IP是 192.168.1.101,端口是 21。當B主機進入局域網,並向 B 主機的 mDNS 服務請求,我要找局域網內 FTP 服務器,B主機的 mDNS 就會去局域網內向其他的 mDNS 詢問,並且最終告訴你,有一個IP地址為 192.168.1.101,端口號是 21 的主機,也就是 A 主機提供 FTP 服務,所以 B 主機就知道了 A 主機的 IP 地址和端口號了。大概的原理就是這樣子,mDNS提供的服務要遠遠多於這個,當然服務多但並不復雜。