您的位置 首页 kreess

利用mDNS在在局域網中發佈服務

在說mDNS之前,我們可以先來回顧一下什麼是DNS,以及傳統的DNS的實現原理。 DNS的全稱是Domain Name Service。作用就是把難以記憶的IP地址,

在說mDNS之前,我們可以先來回顧一下什麼是DNS,以及傳統的DNS的實現原理。

DNS的全稱是Domain Name Service。作用就是把難以記憶的IP地址,能翻譯轉換為方便記憶的名稱。就相當於打電話使用的電話本,把姓名與電話號碼聯系在一起,方便人們在打電話(訪問遠程計算機)之前,根據姓名(計算機域名)來查找電話號碼(計算機的IP地址)。

我們先從DNS的出身說起,在計算機的上古時期,根本就沒有DNS這一說,全世界也就那麼幾臺計算機連接在一起,需要訪問的計算機也很少,隻需要在經常要訪問的計算機的IP地址,記錄到小本本上,在訪問之前查詢一下就行瞭。這個小本本,在linux上就是/etc/hosts文件,在windows上就是C:windowsSystem32driversetchosts文件,這個文件裡面就可以記錄名稱與IP地址對。在訪問的時候,我們隻要在瀏覽器中輸入名稱,操作系統就可以通過自動查找名稱來訪問對應的IP地址瞭。

後來,計算機網絡飛速發展,計算機網絡也越來越龐大,這個電腦上的小本本,顯然不能滿足要求瞭。這個時候呢,人們就想到瞭,在一臺服務器上可以建立一個這樣的服務,能提供DNS查詢服務,訪問者隻需要知道DNS服務器的IP地址,就可以先連接DNS服務器,發送要查詢的域名,來得到對應的IP地址瞭。所以我們在計算機手動設置或者通過DHCP自動分配IP的時候,都會得到一個網關地址和DNS服務器地址(通常情況下,網關一般都同時作為代理DNS服務器,可以轉發緩存DNS請求響應,充當DNS服務器的角色)。

有瞭這個DNS服務器後,域名註冊服務行業也應運而生,各個公司或者個人都可以註冊域名,把自己的名稱與IP地址登記到DNS服務器上,方便其他人查詢訪問。有瞭DNS,我們才能訪問http://baidu.comhttp://zhihu.com等網站,而不用記錄背後對於的IP地址。

有瞭DNS後,就免去瞭記錄IP地址的麻煩瞭。但是在局域網絡中,或者臨時搭建的傢庭網絡,局域網絡中,我們去搭建維護這樣的DNS服務還是比較麻煩,而且DNS服務還隻能實現名稱與IP地址的翻譯,不能標記各種服務,比如自動發現查找打印機地址等待,這個時候mDNS就派上用場瞭。

mDNS優勢就是不需要用戶在局域網絡中再去建立和維護這個的服務瞭,mDNS利用局域網的UDP組播,讓每臺加入網絡中的設備,向網絡組播發佈自己的主機名與IP地址,並且組播和應答自己提供的服務的名稱與端口等信息。 同一個局域網絡下的設備,也通過組播發送請求,就能得到應答瞭。

mDNS的優勢就是,自組織的網絡,不需要單獨的中心DNS和DHCP服務器瞭,也能夠自動協商分配IP地址,建立名稱與IP的映射服務,發佈各種自定義的服務與端口等。

mDNS最早是apple公司發佈並實現的,MAC系統內建瞭mDNS服務,並且提供系統API供應用程序訪問,並且將這部分代碼開源瞭。開源的代碼,包括Mac/Windows/Posix(linux/unix)等操作系統的適配代碼,可以移植編譯到各個操作系統使用。Andriod也引入瞭mDNS,並提供系統層面的接口供應用程序使用。

以linux為例,應用程序使用可以通過采用後臺進行和客戶端的方式:

1、運行mdnsd後臺程序,這個程序運行後,啟動unix domain socket監聽,接收並響應客戶端的各種mDNS服務請求。

2、還有一個dns-sd客戶端程序,可以使用各種參數給mdnsd後臺發送請求,實現各種mDNS的功能。另外用戶還可以在自己開發的應用程序中鏈接使用libmdns_sd.so來給mdnsd後臺發送服務請求,實現和dns-sd類似的功能。

// 下面命令可以註冊一個名稱為test的_myservice._udp服務
// 在發佈服務的時候還可以提供一些額外的參數,比如version,dsn,data等等,這些Key=Value的鍵值對可以自由定義
dns-sd -R "test" _myservice._udp local 12345 version=1 dsn=123456789 data=AABBCCDD

// 下面命令可以發佈一條服務和一條主機名稱與地址記錄(myhost.local => 192.168.50.128)
dns-sd -P "testP" _myservice._tcp local 2233 myhost.local "192.168.50.128" version=1 dsn=123456789 data=AABBCCDD

// 下面的命令可以查詢_myservice._udp服務
dns-sd -Z _myservice._udp local

// ping myhost.local應該就可以收到來自主機192.168.50.128的ping響應,註意,此地址為示意,示意時需要用時間的地址。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

返回顶部