蘋果設(shè)備是如何互相打招呼的——趣談Bonjour協(xié)議
Labs 導(dǎo)讀
使用蘋果全家桶的同學(xué)們,肯定有過(guò)在多個(gè)設(shè)備之間無(wú)縫銜接的體驗(yàn),比如隔空投送照片、文件,AirPlay電視投屏,還有自動(dòng)共享熱點(diǎn)密碼,Apple Watch解鎖Mac和iPhone,連續(xù)互通的相機(jī)/速繪/標(biāo)記等等。它們的基本原理是通過(guò)Wi-Fi或藍(lán)牙,在登錄同一iCloud的設(shè)備之間快速同步數(shù)據(jù)。
問(wèn)題來(lái)了,在局域網(wǎng)中設(shè)備之間要想通信,得知道對(duì)方的IP地址。以AirPlay投屏為例,第一步就是需要iPhone等終端設(shè)備找到局域網(wǎng)中的目標(biāo)投屏設(shè)備(即電視),才能將音視頻、圖片或者屏幕內(nèi)容投射到電視上。
而大多數(shù)情況下,設(shè)備的IP地址是通過(guò)動(dòng)態(tài)分配的DHCP協(xié)議獲取的。那么,設(shè)備之間是如何互相發(fā)現(xiàn)的呢?這就是Bonjour協(xié)議大顯身手的時(shí)候了!
Part 01 簡(jiǎn)介
Bonjour是蘋果公司實(shí)現(xiàn)的一套零配置(zero-configuration)網(wǎng)絡(luò)協(xié)議。"Bonjour"這個(gè)詞源于法語(yǔ),意為“你好”或“早上好”。該協(xié)議旨在簡(jiǎn)化網(wǎng)絡(luò)配置,讓設(shè)備之間在局域網(wǎng)內(nèi)輕松地相互發(fā)現(xiàn)和交流,就像人們打招呼一樣。
通過(guò)Bonjour,用戶不需要手動(dòng)配置IP地址或設(shè)備名稱,設(shè)備或應(yīng)用程序可以自動(dòng)檢測(cè)所需的服務(wù)或其他可交互的應(yīng)用程序,實(shí)現(xiàn)自動(dòng)連接、通信和數(shù)據(jù)交換,無(wú)需用戶干預(yù)。
圖1 局域網(wǎng)中設(shè)備的互聯(lián)互通
Part 02 工作原理
2.1 Bonjour協(xié)議基礎(chǔ)
Bonjour主要基于兩個(gè)標(biāo)準(zhǔn)網(wǎng)絡(luò)協(xié)議:mDNS(多播DNS)和DNS-SD(DNS服務(wù)發(fā)現(xiàn)),在標(biāo)準(zhǔn)DNS框架上進(jìn)行構(gòu)建擴(kuò)展。
2.1.1 mDNS協(xié)議
mDNS協(xié)議基于UDP/IP,使用多播地址224.0.0.251和5353端口進(jìn)行通信。mDNS協(xié)議通過(guò)多播查詢和響應(yīng),實(shí)現(xiàn)了局域網(wǎng)內(nèi)的主機(jī)名解析,而無(wú)需配置DNS服務(wù)器。mDNS協(xié)議數(shù)據(jù)包格式與標(biāo)準(zhǔn)的DNS協(xié)議一致,支持標(biāo)準(zhǔn)的DNS查詢記錄類型的同時(shí),對(duì)其中的部分概念作了擴(kuò)展。
其中,資源記錄用于局域網(wǎng)中各個(gè)主機(jī)之間交換消息內(nèi)容,包含以下幾個(gè)關(guān)鍵字段:
NAME:表示消息內(nèi)容
TYPE:表示消息內(nèi)容的類型
進(jìn)一步的,根據(jù)TYPE類型,可以定義以下幾種關(guān)鍵DNS記錄格式:
A 記錄:主機(jī)名稱和IPV4之間的對(duì)應(yīng)關(guān)系
AAAA 記錄:主機(jī)名稱和IPV6之間的對(duì)應(yīng)關(guān)系
PTR記錄:記錄了服務(wù)類型與服務(wù)實(shí)例名稱之間的對(duì)應(yīng)關(guān)系,一般用在查詢和發(fā)現(xiàn)服務(wù)實(shí)例
SRV記錄:記錄了服務(wù)實(shí)例的主機(jī)名稱和端口信息
TXT記錄:提供服務(wù)的額外描述文本,以“key = value”的格式記錄,如mac地址、設(shè)備id等
ANY 記錄:任意類型,一般用于查詢中
2.1.2 DNS-SD協(xié)議
mDNS協(xié)議定義了消息的基本結(jié)構(gòu)和消息的傳輸過(guò)程。在此基礎(chǔ)上,DNS-SD協(xié)議進(jìn)一步明確定義了服務(wù)名稱、服務(wù)實(shí)例名、域名長(zhǎng)度/順序等具體要素,使用PTR、SRV和TXT三種資源記錄來(lái)完整描述一個(gè)服務(wù),規(guī)定了簡(jiǎn)便的服務(wù)發(fā)現(xiàn)和描述方法。
其中,服務(wù)名稱通常由“_”下劃線和協(xié)議名稱組合而成,并在域名結(jié)尾使用 "local" 作為固定標(biāo)識(shí),格式為<服務(wù)類型>.<域名>.local,如:_printer._tcp.local、_airplay._tcp.local
服務(wù)實(shí)例則通過(guò)其實(shí)例名進(jìn)行標(biāo)識(shí),格式為<服務(wù)實(shí)例>.<服務(wù)類型>.<域名>,如:PrintsAlot._printer._tcp.local
MyMac._airplay._tcp.local
Bonjour協(xié)議通過(guò)上述兩種協(xié)議實(shí)現(xiàn)了局域網(wǎng)內(nèi)的主機(jī)名解析和服務(wù)注冊(cè)與發(fā)現(xiàn),為零配置網(wǎng)絡(luò)提供基礎(chǔ)。
2.2 Bonjour服務(wù)發(fā)現(xiàn)流程
要弄懂Bonjour的工作原理,我們只需思考上述mDNS協(xié)議和DNS-SD協(xié)議,是如何組合起來(lái)進(jìn)行交互的即可。
Bonjour協(xié)議可以看作是mDNS和DNS-SD的有機(jī)結(jié)合。具體來(lái)說(shuō),DNS-SD協(xié)議通過(guò)PTR記錄指向服務(wù)實(shí)例,并通過(guò)SRV記錄提供實(shí)例的主機(jī)名和端口;拿到這些信息后,只需要通過(guò)mDNS解析主機(jī)名獲取IP地址,就可完成從服務(wù)名稱到IP地址映射關(guān)系,從而實(shí)現(xiàn)端到端的連接。需要注意的是,DNS-SD發(fā)布和查詢的這些記錄信息,都是依托在mDNS定義的多播組和端口號(hào)上進(jìn)行傳輸?shù)摹?/p>
接下來(lái)我們舉一個(gè)具體例子來(lái)說(shuō)明,整個(gè)Bonjour服務(wù)發(fā)現(xiàn)過(guò)程是如何完成的。
假設(shè)局域網(wǎng)中某個(gè)ipad設(shè)備想要發(fā)布音樂(lè)共享服務(wù),主要包括以下三個(gè)步驟:
2.2.1 服務(wù)發(fā)布(Publication)
首先該設(shè)備會(huì)隨機(jī)選擇一個(gè)可用的鏈接本地IP地址,如:192.168.1.23,并向局域網(wǎng)中發(fā)布;第二步,它將啟動(dòng)mDNS響應(yīng)器,并請(qǐng)求主機(jī)名 my-ipad.local.,確認(rèn)沒(méi)有沖突后使用該主機(jī)名;接著該設(shè)備在TCP端口1010上啟動(dòng)音樂(lè)共享服務(wù);最后發(fā)布該音樂(lè)服務(wù),并通過(guò)mDNS多播創(chuàng)建dns記錄:
SRV記錄:內(nèi)容為服務(wù)實(shí)例名“小李的音樂(lè)服務(wù)._music._tcp.local.”,并指向主機(jī)名my-ipad.local.上的TCP服務(wù)端口1010
PTR記錄:內(nèi)容為服務(wù)名稱“_music._tcp.local.”,并指向服務(wù)實(shí)例名稱“小李的音樂(lè)服務(wù)._music._tcp.local.”
TXT記錄:提供設(shè)備的額外信息,如MAC地址“MAC=D3:AA:E2:30:B0:E1”
當(dāng)局域網(wǎng)內(nèi)的其他設(shè)備接收后,會(huì)解析并緩存這些記錄。
圖2 服務(wù)發(fā)布流程示例
2.2.2 服務(wù)發(fā)現(xiàn)(Discovery)
當(dāng)某個(gè)客戶端應(yīng)用需要該音樂(lè)共享服務(wù)時(shí),針對(duì)_music._tcp類型構(gòu)造服務(wù)查詢報(bào)文,通過(guò)mDNS多播查詢請(qǐng)求到整個(gè)局域網(wǎng);可提供該服務(wù)的設(shè)備收到查詢請(qǐng)求后,會(huì)用一個(gè)PTR記錄進(jìn)行響應(yīng),這個(gè)響應(yīng)記錄包含了服務(wù)實(shí)例名“小李的音樂(lè)服務(wù)._music._tcp.local.”;客戶端應(yīng)用便可以從PTR記錄中提取出服務(wù)實(shí)例名稱,并將其添加服務(wù)器列表中。
圖3 服務(wù)發(fā)現(xiàn)流程示例
2.2.3 服務(wù)解析(Resolution)
服務(wù)解析在完成服務(wù)發(fā)現(xiàn)后進(jìn)行的。應(yīng)用程序選擇服務(wù)實(shí)例的名稱,并向局域網(wǎng)組播查詢對(duì)應(yīng)的SRV記錄;服務(wù)提供方響應(yīng)后,返回該服務(wù)實(shí)例當(dāng)前的主機(jī)名和端口號(hào);應(yīng)用程序拿到主機(jī)名后,再次發(fā)送多播mDNS查詢請(qǐng)求,解析出主機(jī)名對(duì)應(yīng)的IP地址。最后,應(yīng)用程序根據(jù)獲取的IP地址和端口號(hào),與服務(wù)實(shí)例建立連接,完成解析。
圖4 服務(wù)解析流程示例
至此,整個(gè)音樂(lè)共享服務(wù)的自動(dòng)注冊(cè)與發(fā)現(xiàn)的流程便完成了,全程高效便捷,不需要人工參與。通過(guò)建立好的網(wǎng)絡(luò)通道,客戶端設(shè)備便可以瀏覽并播放服務(wù)端的相關(guān)音樂(lè)資源了。
Part 03 結(jié)語(yǔ)
經(jīng)過(guò)多年發(fā)展,Bonjour已經(jīng)成為Apple等平臺(tái)的標(biāo)準(zhǔn)服務(wù),它為零配置網(wǎng)絡(luò)提供了一個(gè)開(kāi)放、實(shí)用、高效的解決方案。Bonjour基于mDNS和DNS-SD協(xié)議,使其與現(xiàn)有網(wǎng)絡(luò)基礎(chǔ)設(shè)施高度兼容,已經(jīng)廣泛應(yīng)用到了個(gè)人、企業(yè)網(wǎng)絡(luò)及IoT設(shè)備中,大幅簡(jiǎn)化了網(wǎng)絡(luò)配置和管理。未來(lái),隨著智能硬件業(yè)務(wù)的不斷增長(zhǎng),相關(guān)技術(shù)在網(wǎng)絡(luò)互聯(lián)互通方面還具有廣闊的應(yīng)用和發(fā)展前景。
??參考文獻(xiàn)
[1] Apple. Developer Resources - Bonjour [EB/OL]. (2023)[2023-07-21]. https://developer.apple.com/bonjour/.
[2] 吳躍前. 局域網(wǎng)設(shè)備發(fā)現(xiàn)之Bonjour協(xié)議[EB/OL]. (2016-09-28)[2023-07-21]. https://blog.csdn.net/yueqian_scut/article/details/52694411.
[3] yuweifeng. 網(wǎng)絡(luò)協(xié)議之mDNS20170217[EB/OL]. (2017-02-17)[2023-07-21]. https://www.cnblogs.com/yuweifeng/p/6409182.html.