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