苹果Bonjour 操作与对应mDNS记录

概述

Bonjour完成三个操作:

  1. 发布服务
  2. 发现服务
  3. 解析服务

发布服务

需要通过mDNS注册服务,可以使用Bonjour的高级API或者直接用mDNSResponder。Bonjour也可以通过动态DNS更新,在常规的DNS服务上,储存记录。
注册服务时,会生成3个相关的DNS记录:

  1. 服务记录SRV
  2. 指针记录PTR
  3. 文本记录TXT

TXT包含使用服务所需要的额外数据,也可能常常是空白的。

服务记录

向使用者提供服务接口,使用者记录该名字,以便长期访问。连接的时候,使用者执行一个DNS 询问,得到主机和端口名字。
这样有两个好处:一是可读性强。二是,即便端口、ip、甚至主机变化之后,仍然能够访问服务。

服务记录包含两个信息,主机名和端口号。
主机名
服务目前能够被访问的域名。使用主机名而不是IP地址的原因是,我们可能遇到多宿主主机,具有多个IP,或者有ipv4和ipv6两个地址。这样我们能够更好的处理这些类似情况。

端口号
标识TCP或者UDP的端口。

服务记录命名约定

..
实例名.服务类型.域名

实例名:服务实例名字,可以是一个UTF8的字符串,具有可读性。

服务类型: 标准的IP协议名字,前面加一个下划线,跟着带下划线的TCP、UDP。比如UDP下的普通的FTP服务为:_tftp._udp

域名:标准的DNS域名。比如baidu.com ,对于本地一般是.local。

一个服务记录示例:

PrintsAlot._printer._tcp.local. 120 IN SRV 0 0 515 blackhawk.local.

以上将在mDNS上创建一个打印机,叫blackhawk.local。120 代表缓存的time-to-live (TTL) 值用于缓存。两个0代表权重和优先级,传统DNS中遇到多个记录会根据这两个值来选择,对于mDNS,会被忽略。

指针记录

指针记录启用服务发现,通过映射服务类型,到该服务类型指定实例的名字列表。该记录增加了另一个间接层,所以可以通过查找该服务类型的PTR记录标签,就可以找到这些服务。

指针记录只包含一个信息:服务实例的名字。这个名字和SRV记录的名字一样。指针记录命名合服务记录一样,只是没有实例名字:

.
服务类型.域名
以下是名为PrintsAlot的打印后台处理程序的PTR记录示例:

_printer._tcp.local. 28800 PTR PrintsAlot._printer._tcp.local.

文本记录

包含一些特殊描述,通常为100-200字节,也可能是空白的。

从历史上看,此记录已用于在同一端口上以相同IP地址运行的多个服务,例如,在同一打印服务器上运行的多个打印队列。在这种情况下,TXT记录中的其他信息可用于标识预期的打印队列,如本示例所示:
在这里插入图片描述
这种做法是必要的,因为历史上服务类型已经与公共的端口相关联。Bonjour 希望每个实例服务在不同的动态分配端口,而不是在公共端口上。使用TXT记录可以指定客户端在哪一个实例上通讯。

不同服务类型的定义不一样,所以每一个新服务要自定义TXT的数据格式。

发布示例

举一个具体的例子,考虑一个在本地网络上共享音乐的假想设备-一个启用IP的自动点唱机。假设其传输协议为TCP,并且其应用协议的名称为music。当有人将设备插入以太网集线器时,会发生很多事情,如图4-1所示。
1.给自己分配IP:
在这里插入图片描述
设备会从子网掩码为255.255.0.0的IPv4本地链接范围169.254.0.0中随机选择本地链接IP地址169.254.150.84,并发布到网络。因为没有响应,所以表面169.254.150.84可用,分配成功。

2.启动mDNS响应
在这里插入图片描述
启动自己的多播DNS响应器,请求主机名eds-musicbox.local,发布到网络。一样的,没有响应,表明可用,分配成功。

3.启动音乐服务
在这里插入图片描述
设备在TCP端口1010上启动音乐共享服务,

4.发布服务
在这里插入图片描述在本地以Ed’s Party Mix的名义发布_music._tcp类型的服务,在本地域名.local,请首先确保不存在使用相同名称的服务。这产生了两个记录:

  • 一个SRV记录,名叫 Ed’s Party Mix._music._tcp.local. 指向 eds-musicbox.local. ,在在TCP 端口1010。
  • 一个PTR 记录,名叫_music._tcp.local,指向Ed’s Party Mix._music._tcp.local.服务。

发布服务时,如果域名或服务名称不可用,需要选择新的名字。

发现服务

服务发现,使用服务发布期间注册的DNS记录来寻找指定服务类型的所有命名实例。应用需要执行一个匹配服务类型的PTR记录问询()query 。比如 _http._tcp。每个设备上的mDNS responders 返回PTR记录和服务实例名称。以下是一个音乐分享服务示例:

1.客户端应用程序,向标准多播地址224.0.0.251,发出对本地域的_music._tcp类型的服务查询。网络上的每一个mDNS responder 都会收到。
在这里插入图片描述
2.只有具有音乐分享的设备用一个PTR记录来响应该查询。返回的PTR包含读物实例的名字: Ed’s Party Mix._music._tcp.local。应用收到该PTR后,提取到服务实例的名字,将其添加到音乐服务列表。
在这里插入图片描述

解析服务

通常来说,发现服务一下子就完成了,比如用户选择了一个打印机。这个操作会保存服务实例的名字,这是给定服务的稳定标记符。主机、ip、端口可能随时会变,但是用户不需要因此重选一次。相应地,服务在没有实际使用的时候,并不会将其解析为socket信息,直到真正使用的时候。

为了解析服务,应用会根据服务名字在DNS上查询SRV记录。mDNS responders 将返回对应服务的SRV记录。

解析音乐分享服务实例

1.首先应用发出一个DNS查询到多播地址 224.0.0.251 ,询问Ed’s Party Mix._music._tcp.local. SRV 记录。
在这里插入图片描述

2.该询问会返回主机名和端口名 (eds-musicbox.local., 1010)
在这里插入图片描述

3.客户端发出一个多播请求,查询IP地址。
在这里插入图片描述
4.客户端拿到IP地址 169.254.150.84。客户端使用该IP和端口号连接服务了。
在这里插入图片描述
以上过程每一次使用服务都会发生一次,所以总是会找到当前的地址和端口号。

以上参考:
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/NetServices/Articles/NetServicesArchitecture.html#//apple_ref/doc/uid/20001074-SW1

Bonjour 与mDNS:
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/NetServices/Articles/faq.html#//apple_ref/doc/uid/TP40008762-SW1

mDNS接口说明:
https://developer.apple.com/library/archive/documentation/Networking/Conceptual/dns_discovery_api/Introduction.html#//apple_ref/doc/uid/TP40002475-SW1

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值