Bonjour

持续更新中...

Posted by CoderLeonidas on October 21, 2018

Bonjour

简介

传统的基于TCP/IP协议互联的局域网中,每个网络设备都被分配唯一的IP地址实现通讯,这个 IP 地址是一个长期固定不变的静态 IP 或者由 DHCP 服务来每次动态分配的 IP。假如一个设备 IP 是动态的,那么每次访问这个设备,都需要重新获取它的 IP,另外通过 IP 方式对用户来说本身也带来了极大的不便。

Bonjour,也称为零配置网络(zero-configuration networking),它基于组播域名服务(multicast DNS),可使用行业标准IP协议自动发现本地网络上的设备和服务。 Bonjour可以通过易于使用的复杂编程接口轻松发现,发布和解析网络服务,该接口可从Cocoa,Ruby,Python和其他语言进行访问。

使用Bonjour的设备在网络中自动传播它们自己的服务信息并聆听其它设备的服务信息,设备之间就象在打招呼,这也是命名为Bonjour(法语:你好)的原因。这样,Bonjour使局域网中的系统和服务即使在没有网络管理员的情况下很容易被找到。

应用

苹果公司业界领先的浏览器 Safari,利用 Bonjour 可以找到你本地网络上任何 Bonjour 网页地址。在 Bonjour 的帮助下,你可以通过 iChat 看到本地网络上有谁可以音频或视频聊天,当他们离开时也将自动在网络上消失。iTunes 和 iPhoto 利用 Bonjour 帮助你在本地网络上共享音乐和照片。

Bonjour解决的三大问题

Bonjour可以完成的工作主要是在缺少中心服务器的情况下解决三个问题:

  • IP获取
  • 名称解析
  • 服务发现

1 IP获取: 给每个设备host分配IP地址

在传统网络环境下,设备的IP地址通过两种方式获取,一种是静态配置,通过手工方式为设备指定一个IP地址,一种是动态配置,设备通过路由器的DHCP服务获得动态的IP地址。 在无中心服务器的网络环境下,没有中心服务器提供DHCP服务,用户手工配置IP地址也很不方便,这就需要一种新的方式来帮助设备获取IP地址,就是希望设备可以主动为自己指定一个可用的IP地址。

在IPV6环境下,IPV6协议本身就提供了设备自指定IP地址的能力,所以实现很简单,直接使用IPV6的协议支持就可以了。

在IPV4环境下,Bonjour使用了随机指定IP地址的方法,首先为设备随机指定一个属于本地网段的IP地址,然后检查该地址在本地是否有冲突,如果有冲突就随机生成另一个新的IP地址,直到找到可用IP地址为止。

首先说明一个 link-local addresse 的概念,它表示本地链路地址,只能在本地链路使用,不能在子网间路由。设备加入本地网络会随机获取一个link-local 地址,然后发送本地网络广播报文,测试这个地址是否可用,如果没有其他设备使用则做为自己的地址。如果得到有效应答,则换一个地址直到找到可用的本地 IP 为止。



2 名称解析: 通过host反向获取IP地址

在传统网络环境下,名称和IP地址的对应关系是通过DNS服务解析的。当一个设备需要访问一个域名,如“www.abc.com”,设备将“www.abc.com”发给DNS服务器,服务器返回该域名对应的IP地址,设备再使用返回的IP地址对目标服务器进行访问。

在没有中心服务器的网络环境中,没有DNS服务器提供域名解析服务,名称解析变成一个严重问题。针对这一问题,业界的解决方案是mDNS,中文叫“组播DNS”。

“组播DNS”的原理很简单,当一个设备需要解析一个名称时,如“abc.local.”,这个设备通过UDP协议向本地网络中的所有设备广播一个消息,问谁是“abc.local”,本地网络中如果有一个设备认为自己是“abc.local”,它就给出响应,说出自己的IP地址。

因为“组播DNS”基于UDP协议,采用广播消息的方式,所以不需要一个中心服务器提供DNS解析服务就可以完成本地的名称解析。

Bonjour也是基于mDNS协议的,不过Bonjour在mDNS协议上作了扩展,加强了设备响应“组播DNS”请求的能力。在Bonjour协议下,应用只需要对某个名称进行注册,就可以将响应“组播DNS”请求的工作交由底层处理。也就是说在Bonjour协议下,应用不需要侦听本地网络的“组播DNS”请求并进行响应,这些工作由底层系统完成。

为了区分全球域名和本地域名,mDNS协议使用“.local.”作为本地域名的根域名。

3 服务发现: 自动发现网络中的服务

当一个提供服务的设备获取IP地址,并自我指定一个域名后,其实还是不能满足用户的需求。因为用户需要的是某种服务,如打印服务,web服务,用户并不关心这些服务对应的服务器名称和它的IP地址。

为了让用户更容易发现本地网络中的各种服务,Bonjour为设备提供了服务发现的能力。 Bonjour提供的“服务发现”能力基于一个简单直接的规定,就是提供服务的设备在按以下标准对服务进行注册:“名称.服务类型.传输协议类型.local.”,比如:“DamonWebServer._http._tcp.local.”,又比如“DummiesWebServer._http._tcp.local.”。

这样,当一个设备使用希望查找http服务的时候,Bonjour会去查找本地网络中注册过的包含”_http“的服务,然后将结果返回给用户选择。这时用户面对的是“DamonWebServer”和”DummiesWebServer“,用户可以不去关心到底这两个web服务到底在那台设备上,该设备的IP地址是什么。

服务提供者会注册服务到 mDNS 系统。mDNS 系统存储了本地网络中所有服务类型对应的服务名列表。用户能根据服务类型查询到所有的服务,选择自己需要的服务名,系统自动完成连接

Bonjour协议中扩充了服务的概念,不仅仅是一个设备/主机可以注册服务,同一个主机上运行的不同应用都可以独立注册服务。

Bonjour 协议实现了服务自动发现和地址转化功能,因此服务可以在本地网络上随意迁移配置。IP 地址的变化,这些对服务访问者来说都不需要关注,这就是所谓的零配置协议的理念

Bonjour服务命名规则

互联网世界中通过域名透明的访问各种信息服务。这个过程中自动包含了 DNS 域名解析的过程

域名分为很多类型如:.com、 .net、 .org 等等。

Bonjour 命名中也部分借用了互联网域名的概念,提出了本地域的概念。Bonjour的域只有一个固定的域 local., 这个域只在本地网络有效,不是全局性质的

Bonjour 服务命名约定的格式为 Name.Type.Domain

  • Name 为一个有意义的服务名称,也称为服务实例名

  • Domain 固定为 local。服务类型 Type 的格式为_ServiceType._ TransportProtocolName., 是服务类型(应用协议)加上传输协议,每个部分前面在加一个下划线。

    • ServiceType 服务类型(应用协议)为 http, ftp. telnet, printer. photo. music 等,最长不超过 15 个字串
    • Transportprotocolname传输协议只能为 UDP, TCP 之一

    _ftp._tcp. 就是一个正确的类型命名

    一个完整符合规范的 Bonjour 服务命名例子如下:photoLibrary_ftp._tcp.local.

Bonjour协议API栈

Bonjour核心流程

1 服务发布

2 服务发现

3 地址解析