Bonjour 零配置网络架构支持在局域网或广域网上发布和发现基于 TCP/IP 的服务。本文档概括介绍了 Bonjour 架构,并简要介绍了可用的 Bonjour API。
Bonjour 是 Apple 对一套零配置网络协议的实现。 Bonjour 旨在让用户更轻松地进行网络配置。
例如,Bonjour 可让您将打印机连接到您的网络,而无需为其分配特定的 IP 地址或将该地址手动输入到每台计算机中。通过零配置网络,附近的计算机可以发现它的存在并自动确定打印机的 IP 地址。如果该地址是一个动态分配的地址,并且会发生变化,他们可以在未来自动发现新地址。
应用程序还可以利用 Bonjour 自动检测网络上应用程序(或其他服务)的其他实例。例如,两个运行 iOS 照片共享应用程序的用户可以通过蓝牙个人区域网络共享照片,而无需在任一设备上手动配置 IP 地址。
提供高效的服务发现
Bonjour 协议使用多播 DNS (mDNS) 并在需要时使用链路本地寻址,以高效且稳健的方式支持广告和发现服务。
Bonjour 为 mDNS 广告服务保留 .local 域
Bonjour 主机名和服务名是使用一组特定的规则构建的。
Bonjour 使用 SRV、TXT 和 PTR 记录来查找服务
Bonjour 使用特定于服务的记录来宣传服务的存在。 PTR 记录让您发现域中的所有服务;SRV 记录将服务实例名称、类型和域转换为主机名和端口; A 和 AAAA 记录将主机名转换为 IP 地址,TXT 记录提供有关服务的附加信息。
Bonjour 在 OS X 和 iOS 中提供多层 API
在 OS X 和 iOS 中,Bonjour 提供了使用 Foundation、Core Foundation 和 C API 发布和发现服务的能力。在 OS X 中,Bonjour 还提供了一个 Java API。在 Windows 和 Linux 等其他平台上,Bonjour 提供了 C API。
域名命名约定
服务实例和服务类型的 Bonjour 名称与域名系统 (DNS) 域名相关。本节介绍 DNS 域名、Bonjour 本地“域”以及 Bonjour 服务实例和服务类型的命名规则。
域名和 DNS
DNS 使用特定到通用的域名命名方案。最通用的域是 . (“点”),称为根域,类似于UNIX文件系统中的根目录/。每个其他域都位于根域之下的层次结构中。例如,名称 www.apple.com。位于二级域 apple.com. 内,它位于顶级域 com. 内,而 com. 又是 . (“点”),根域。
图 2-1 显示了此层次结构的简化版本。图 2-1 互联网域名系统的一部分,为 Bonjour扩充
倒置树的顶部是根域。下面是一些顶级域:com.、edu. 和 org.,以及本地 Bonjour“域”local.,在 Bonjour 和本地链接中进一步讨论。顶级以下是几个二级域,apple、darwin 和 zeroconf。树可以无限向下延伸,例如,在第三层的 www。
您可能已经注意到,大多数域名都没有尾随点。然而,尾随的点确实有意义。以尾部点结尾的域名,例如 www.apple.com.,被称为完全限定域名,很像 UNIX 文件系统中的绝对路径(例如 /usr/bin)。
如果您在 Web 浏览器中键入 wibble.apple.com(没有尾随点),系统会将其视为非限定(部分)名称并附加来自您的搜索域列表的名称,例如 example.com.,example。教育等等。系统首先尝试附加 . (“点”,根域),但如果名称为 wibble.apple.com。不存在,它将继续沿着列表向下并尝试 wibble.apple.com.example.com.、wibble.apple.com.example.edu. 等等。尽管此搜索域功能通常很有用,但在这种情况下它可能不是您想要的。
Bonjour 和本地链接
Bonjour 协议在很大程度上处理称为本地链路的网络部分。主机的本地链路,或链路本地网络,包括它自己和所有其他可以在不修改 IP 报头数据的情况下交换数据包的主机。实际上,这包括所有未被路由器分隔的主机。
在 Bonjour 系统上,本地。用于指示应在本地 IP 网络上使用 IP 多播查询查找的名称。
注意是本地的。不是真正的域。你可以想到本地。作为伪域。它在根本上不同于传统的 DNS 域:其他域中的名称是全球唯一的;链接本地域名不是。世界上只有一个名为 www.apple.com. 的逻辑 DNS 条目,并且由于 DNS 的工作方式,只能有一个。另一方面,以 local. 结尾的主机名由本地网络上的一组多播 DNS 响应器管理,因此命名范围就是:local。可以很容易地有两个名为 meow.local 的主机。在世界上,甚至在同一栋楼里,只是不在同一个本地网络上。
全球唯一的名称很重要也很有用——事实上,它们是互联网的重要成就之一——但它们需要一定程度的管理工作才能建立和维护。本地名称仅在本地网络上有用,但在足够的情况下,它们提供了一种使用名称而不是 IP 号来引用网络设备的方法,当然,与全球唯一名称相比,它们需要更少的协调工作和费用。
本地唯一名称在没有连接到全球 Internet 的网络(无论是设计原因还是因为中断)以及小型临时网络(例如通过交叉电缆连接的一对计算机,或几个人玩网络)上特别有用在家庭或咖啡馆的无线网络上使用笔记本电脑玩游戏。
如果在本地网络上发生名称冲突,Bonjour 主机会自动找到一个新名称(对于 iOS 或任何没有屏幕的设备)或询问用户(对于个人计算机)。
Bonjour 和单播 DNS
除了多播 DNS 之外,Bonjour 还支持使用广域 Bonjour 通过传统单播 DNS 广告和发现服务。单播 DNS 不在本文档的讨论范围之内。要了解有关配置单播域名服务器以用于 Bonjour 的更多信息,请参阅 DNS-SD 网站。
现有服务类型的 Bonjour 名称
Bonjour 服务根据 IP 服务的现有 Internet 标准命名(在 RFC 2782 中描述)。 Bonjour 服务名称结合了服务类型和传输协议以形成注册类型。注册类型用于注册服务并为其创建 DNS 资源记录。为了在 DNS 资源记录中区分注册类型和域名,注册类型使用下划线前缀来分隔构成注册类型的组件。格式是
_ServiceType._TransportProtocolName.
服务类型是服务的官方 IANA 注册名称,例如 ftp、http 或打印机。传输协议名称是 tcp 或 udp,具体取决于服务使用的传输协议。在 TCP 上运行的 FTP 服务的注册类型为 _ftp._tcp。并将注册一个名为 _ftp._tcp.local 的 DNS PTR 记录。与其主机的多播 DNS 响应器。
新服务的 Bonjour 名称
如果您正在设计一个新协议来作为 Bonjour 网络服务进行宣传,您应该向 IANA 注册它。
IANA 目前要求每个注册服务都与一个“知名端口”或一系列知名端口相关联。例如,为 http 分配了 80 端口,因此无论何时您在 Web 浏览器中访问网站,应用程序都假定 HTTP 服务在端口 80 上运行,除非您另有说明。这样,如果网站以非标准方式配置,则只需记住网站的端口号。
但是,使用 Bonjour,您不必知道端口号。因为客户端应用程序可以通过对服务类型的简单查询来发现您的服务,所以不需要众所周知的端口。
服务实例的 Bonjour 名称
服务实例名称旨在成为人类可读的字符串。因此,您应该描述性地命名它们,并让用户覆盖您提供的任何默认名称。因为它们是为了浏览而不是键入,所以服务实例名称可以是任何使用 UTF-8 编码的 Unicode 字符串,长度最多为 63 个八位字节(字节)。
例如,用于通过网络共享音乐的应用程序可能默认使用本地用户的名称进行音乐共享服务,例如 Émille 的音乐库。用户可以覆盖默认值并将服务命名为 Zealous Lizard’s Tune Studio,应用程序将注册一个名为 Zealous Lizard’s Tune Studio._music._tcp.local. 的 DNS SRV 记录,假设应用程序的音乐共享协议与名称 music 相关联。
图 2-2 说明了 Bonjour 服务实例名称的组织。树的顶层是域,例如本地域。对于本地网络。域下面是注册类型,它由前面有下划线 (_music) 的服务类型和前面也有下划线 (_tcp) 的传输协议组成。树的底部是人类可读的服务实例名称,例如 Zealous Lizard 的 Tune Studio。完整名称是沿着树从底部到顶部的路径,每个组件由点分隔。