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.