網(wǎng)絡(luò)發(fā)現(xiàn)

版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載窗看。 https://blog.csdn.net/yueqian_scut/article/details/52694411
本文由嵌入式企鵝圈原創(chuàng)團(tuán)隊(duì)成員-華南師范大學(xué)物聯(lián)網(wǎng)創(chuàng)新中心Hende_Zhu先生執(zhí)筆盐固。

WIFI物聯(lián)網(wǎng)解決方案中荒给,通常我們需要對(duì)設(shè)備進(jìn)行綁定,需要通過某種方法先對(duì)設(shè)備進(jìn)行發(fā)現(xiàn)闰挡,比如微信硬件采用廣播的方式锐墙,定時(shí)向外發(fā)送上線消息或者采用一問一答的方式進(jìn)行發(fā)現(xiàn),Bonjour是由蘋果公司實(shí)現(xiàn)的一種零配置網(wǎng)絡(luò)(Zeroconf)協(xié)議长酗,它是一種基于服務(wù)的設(shè)備發(fā)現(xiàn)協(xié)議溪北,不僅能夠自動(dòng)獲取有效IP地址,還可以通過查詢服務(wù)的方式來找到設(shè)備地址夺脾,只要雙方約定好服務(wù)(service)的名稱之拨,設(shè)備的IP地址和端口都是可以變化的!

一咧叭、mDNS協(xié)議和DNS-SD協(xié)議

Bonjour協(xié)議是基于mDNS(Multicast DNS)協(xié)議和DNS-SD(DNS Service Discovery)協(xié)議開發(fā)實(shí)現(xiàn)蚀乔,因此有必要先在這里給大家介紹一下這兩個(gè)協(xié)議。

1.1 mDNS協(xié)議介紹

mDNS協(xié)議適用于局域網(wǎng)內(nèi)沒有DNS服務(wù)器時(shí)的域名解析菲茬,設(shè)備通過組播的方式交互DNS記錄來完成域名解析吉挣,約定的組播地址是:224.0.0.251,端口號(hào)是5353婉弹,mdns協(xié)議使用DNS協(xié)議一樣的數(shù)據(jù)包睬魂,由頭部和數(shù)據(jù)段兩部分(大家可以自行去了解DNS數(shù)據(jù)包的格式啦,在這里不展開介紹了):

mDNS的一個(gè)使用情景是這樣的:

設(shè)備d通過組播(224.0.0.251:5353)镀赌,詢問a.local地址是氯哮?


設(shè)備a知道有人查詢它后,也是通過同樣的組播組回復(fù)它的地址信息(通過回復(fù)用于IPv4的A類型DNS記錄(A Record)或者用于IPv6的AAAA類型的DNS記錄商佛,A記錄和AAAA記錄分別用于將域名轉(zhuǎn)換成IP地址)喉钢,這里組播內(nèi)的所有人b, c, d都會(huì)收到,它們會(huì)將a.local的ip地址等信息(如TTL值)刷新到mDNS緩沖區(qū)中良姆。
mDNS協(xié)議和DNS協(xié)議還有些不同肠虽,mDNS只能用于局域網(wǎng)內(nèi)部,并且它只接受解析主機(jī)名前綴為.local的域名玛追,因此mDNS也是可以和DNS在同一臺(tái)設(shè)備上共存的舔痕,以及它們存儲(chǔ)記錄的區(qū)域是分開的。
除此之外,mDNS還有其它的作用伯复,例如在零配置網(wǎng)絡(luò)中給自己分配域名慨代,設(shè)備給自身選擇一個(gè)域名后,然后通過發(fā)送記錄類型為”any”的mDNS包來查詢局域網(wǎng)內(nèi)是否有同名啸如,如果沒有設(shè)備就會(huì)把這個(gè)名字作為自己的域名侍匙。

1.2 DNS-SD協(xié)議介紹

接下來再介紹一下DNS-SD協(xié)議,即DNS based Service Discovery叮雳,基于DNS的服務(wù)發(fā)現(xiàn)主要用到DNS現(xiàn)有的三種類型記錄(Record Type):PTR記錄想暗、SRV記錄、TXT記錄帘不,其中:
1)服務(wù)發(fā)現(xiàn)(PTR記錄):
設(shè)備會(huì)先發(fā)送一個(gè)查詢PTR記錄的數(shù)據(jù)包到組播組说莫,所查詢服務(wù)格式為:
<service>.<transport>.<domain>
service表示的是要查詢的服務(wù),transport表示的是傳輸?shù)膮f(xié)議:TCP還是UDP寞焙,domain表示查詢的域储狭,在mDNS中為.local,接著具有對(duì)應(yīng)服務(wù)的設(shè)備會(huì)響應(yīng)一系列本設(shè)備上所具有的服務(wù)實(shí)例:
<instance>.<service>.<transport>.<domain>
instance表示服務(wù)的實(shí)例名捣郊,雖然收到<instance>.<service>.<transport>.<domain>辽狈,但是只有instance才會(huì)顯示給用戶看,比如:要查詢一個(gè)_easylink._tcp.local的服務(wù)呛牲,具有這個(gè)服務(wù)對(duì)應(yīng)實(shí)例的設(shè)備會(huì)響應(yīng)一條PTR記錄:EMW3031 Module#500A3F._easylink._tcp.local刮萌,即表示EMW3031 Module#500A3F為_easylink._tcp.local的一個(gè)實(shí)例,設(shè)備收到后只會(huì)顯示EMW3031 Module#500A3F供用戶看娘扩,它是UTF-8編碼的着茸。
可以看出,DNS-SD的PTR記錄所代表的意思是區(qū)別于傳統(tǒng)DNS的PTR記錄的含義的琐旁,并且DNS-SD下的PTR記錄用于記錄服務(wù)到服務(wù)實(shí)例的映射元扔。
2)獲取服務(wù)實(shí)例的主機(jī)名和端口號(hào):(查詢SRV記錄)
上述多個(gè)服務(wù)實(shí)例instance顯示供用戶選擇確定一個(gè)后,就需要查詢記錄服務(wù)實(shí)例的主機(jī)名和端口號(hào)旋膳,即查詢SRV記錄。設(shè)備會(huì)發(fā)送一個(gè)mDNS請(qǐng)求途事,然后具有所請(qǐng)求中服務(wù)實(shí)例的設(shè)備會(huì)響應(yīng)SRV記錄验懊,SRV記錄記錄了這個(gè)服務(wù)實(shí)例對(duì)應(yīng)的主機(jī)名和端口號(hào)以及TTL信息,一條SRV記錄的例子是:

EMW3031 Module#500A3F._easylink._tcp.local. 3 IN SRV 0 0 8002 EMW3031 Module#500A3F.local.
DNS下的SRV記錄的格式為:
_service._proto.name. TTL class SRV priority weight port target.
在DNS-SD中尸变,priority和weight無效义图,一般置為00 00,port和target即為端口號(hào)和主機(jī)名召烂。
因此SRV記錄用于記錄服務(wù)實(shí)例到端口號(hào)和主機(jī)名的映射碱工,即便端口號(hào)可變也沒有關(guān)系。
3)服務(wù)實(shí)例更詳細(xì)的信息:(TXT記錄)
有時(shí)候,一個(gè)服務(wù)實(shí)例除了所在設(shè)備的端口號(hào)和主機(jī)名這些信息以外怕篷,還可以提供更多的附加參數(shù)信息历筝,服務(wù)實(shí)例的附加信息記錄在TXT記錄中,以”key = value”的格式記錄廊谓,如提供設(shè)備的MAC地址:

MAC=D0:BA:E4:50:0A:3F

二梳猪、Bonjour協(xié)議原理

前面介紹了mDNS協(xié)議以及DNS-SD協(xié)議,其實(shí)基本上就已經(jīng)展開介紹了Bonjour協(xié)議的細(xì)節(jié)蒸痹,接下來再來理解Bonjour就相當(dāng)輕松了春弥。Bonjour協(xié)議可以理解為mDNS協(xié)議和DNS-SD協(xié)議的結(jié)合,其實(shí)大家在繼續(xù)往下看之前可以自己想一下如何將兩個(gè)協(xié)議結(jié)合起來呢叠荠?DNS-SD已經(jīng)找到了提供服務(wù)的端口號(hào)和主機(jī)好了匿沛,最后再做進(jìn)一步的主機(jī)名到IP地址的解析就完成了Bonjour協(xié)議的整個(gè)過程,當(dāng)然結(jié)合的時(shí)候DNS-SD所發(fā)送的三種記錄都是通過mDNS規(guī)定的組播組和端口號(hào)(224.0.0.254:5353)發(fā)送出去的榛鼎,但是DNS-SD是不依賴mDNS協(xié)議而存在的逃呼。
Bonjour協(xié)議提供三部分功能:通告服務(wù)、發(fā)現(xiàn)服務(wù)借帘、解析服務(wù)蜘渣,這是三個(gè)動(dòng)賓詞組哈。在物聯(lián)網(wǎng)中肺然,設(shè)備在本地記錄一個(gè)服務(wù)往往需要提供服務(wù)相關(guān)的SRV記錄蔫缸、PTR記錄以及TXT記錄相關(guān)的信息,用于最后組裝mDNS數(shù)據(jù)包發(fā)送出去际起。
在沒有DHCP分配IP地址和沒有設(shè)置靜態(tài)IP地址情況下拾碌,通過Bonjour協(xié)議還可以自己在局域網(wǎng)內(nèi)獲取有效的IP地址以及主機(jī)名,但是需要我們配置好路由的信息如子網(wǎng)掩碼等街望,它會(huì)生成一個(gè)IP校翔,然后詢問局域網(wǎng)內(nèi)是否有沖突,如果沒有沖突就將這個(gè)IP占為己有灾前,如果有沖突防症,就會(huì)更換一個(gè)IP,繼續(xù)查詢哎甲,主機(jī)名也是利用同樣的方法獲得蔫敲。
通告服務(wù)用于設(shè)備告之局域網(wǎng)內(nèi)其他人本設(shè)備的服務(wù)信息,一般包括發(fā)送SRV記錄和PTR記錄炭玫,這些記錄被其它mDNS設(shè)備記錄在本地的存儲(chǔ)區(qū)中奈嘿。


發(fā)現(xiàn)服務(wù)用于查詢一個(gè)指定的服務(wù),然后具有該服務(wù)的設(shè)備會(huì)響應(yīng)PTR記錄吞加,告訴查詢的設(shè)備有這樣的服務(wù)并且服務(wù)實(shí)例的名稱是什么裙犹。


解析服務(wù)發(fā)生在完成服務(wù)發(fā)現(xiàn)之后尽狠,獲得了服務(wù)實(shí)例后供用戶選擇,再下一步就要進(jìn)行解析叶圃,首先根據(jù)服務(wù)實(shí)例獲得該設(shè)備的主機(jī)名以及端口袄膏,最后再根據(jù)主機(jī)名來獲取IP地址。




經(jīng)過以上一步步交互就可以獲得了目標(biāo)設(shè)備的IP地址和端口號(hào)了盗似,然后就可以根據(jù)選擇的傳輸協(xié)議TCP或者UDP進(jìn)行通信哩陕。

三、mDNS數(shù)據(jù)包

慶科物聯(lián)的設(shè)備端已經(jīng)實(shí)現(xiàn)了Bonjour協(xié)議的主要功能赫舒,以下是基于其設(shè)備端發(fā)現(xiàn)過程用Wireshark抓的包悍及,其中IP地址為192.168.191.2表示的是手機(jī)端,192.168.191.3表示的是完成配網(wǎng)后的設(shè)備端接癌,它們?cè)谕粋€(gè)局域網(wǎng)內(nèi)心赶。
服務(wù)發(fā)現(xiàn):由手機(jī)APP發(fā)送查詢_easylink._tcp.local服務(wù)


服務(wù)解析:設(shè)備端一次性響應(yīng)了PTR記錄、SRV記錄缺猛、TXT記錄以及A記錄:


每條記錄展開為:



作者:吳躍前
來源:CSDN
原文:https://blog.csdn.net/yueqian_scut/article/details/52694411
版權(quán)聲明:本文為博主原創(chuàng)文章缨叫,轉(zhuǎn)載請(qǐng)附上博文鏈接!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末荔燎,一起剝皮案震驚了整個(gè)濱河市耻姥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌有咨,老刑警劉巖琐簇,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異座享,居然都是意外死亡婉商,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門渣叛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來丈秩,“玉大人,你說我怎么就攤上這事淳衙∧⒒啵” “怎么了?”我有些...
    開封第一講書人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵箫攀,是天一觀的道長肠牲。 經(jīng)常有香客問我,道長匠童,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任塑顺,我火速辦了婚禮汤求,結(jié)果婚禮上俏险,老公的妹妹穿的比我還像新娘。我一直安慰自己扬绪,他們只是感情好竖独,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著挤牛,像睡著了一般莹痢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墓赴,一...
    開封第一講書人閱讀 52,696評(píng)論 1 312
  • 那天竞膳,我揣著相機(jī)與錄音,去河邊找鬼诫硕。 笑死坦辟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的章办。 我是一名探鬼主播锉走,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼藕届!你這毒婦竟也來了挪蹭?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤休偶,失蹤者是張志新(化名)和其女友劉穎梁厉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椅贱,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡懂算,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了庇麦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片计技。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖山橄,靈堂內(nèi)的尸體忽然破棺而出垮媒,到底是詐尸還是另有隱情,我是刑警寧澤航棱,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布睡雇,位于F島的核電站,受9級(jí)特大地震影響饮醇,放射性物質(zhì)發(fā)生泄漏它抱。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一朴艰、第九天 我趴在偏房一處隱蔽的房頂上張望观蓄。 院中可真熱鬧混移,春花似錦、人聲如沸侮穿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亲茅。三九已至回铛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間克锣,已是汗流浹背茵肃。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留娶耍,地道東北人免姿。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像榕酒,于是被迫代替她去往敵國和親胚膊。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容