如何使用Bonjour?


26
  1. 首先,Bonjour到底做了什么(请阅读下面写的我的猜测)?
    在这里,我发现Bonjour可以自动发现IP网络上的计算机,设备和服务。但是我认为它不仅可以“在IP网络上发现设备”,还可以通过为运行Bonjour的设备分配IP地址来创建IP网络。我对吗?

  2. 我仍然想念本质。它以下列方式工作吗?首先,我以物理方式连接设备(例如笔记本电脑),以便它们之间可以相互通信。然后,可以说,在一些运行Bonjour的便携式计算机上,结果,这些便携式计算机会自动为其自动分配IP地址。因此,便携式计算机(运行Bonjour的计算机)将建立IP网络。这样行吗?

  3. 或者可能是因为运行Bonjour的计算机不被视为服务,并且仅由于Bonjour在此计算机上运行而无法广播。我的意思是,计算机上运行的应用程序需要使用Bonjour进行广播。因此,是应用程序自行广播(不是计算机),并且不会自动完成(应用程序需要明确地自行广播)。这样对吗?

  4. 我的应用程序如何准确地自我广播?我可以使用命令行注册服务(以便使用Bonjour的所有应用程序都知道出现了新服务)吗?

  5. 此外,我想拥有一个使用Bonjour创建的IP网络的应用程序。为此,我的应用程序需要知道网络中存在哪些设备/服务。更详细地,我的应用程序需要具有服务列表。列表中的每个服务应具有名称,运行服务的IP地址以及应用程序使用的端口。Bonjour可以通过某种方式提供此信息吗?如果是这样,它是如何工作的。我的程序如何从Bonjour获得此信息?我的程序可以读取Bonjour创建的包含上述信息的文件吗?我可以在命令行中使用一些命令来检索此信息吗?

  6. 我对从文件,环境变量或命令行中的命令访问有关服务的信息特别感兴趣。在我看来,这些选择是最简单的!由于在这种情况下,我不需要使用任何其他库来通过特定的编程语言与Bonjour通信。

如果我的问题不清楚,请问PS Pleas。我将尝试以更清晰的方式提出我的问题。

PPS 我使用Windows 7

添加:我计划用PHP编写应用程序。每台计算机都应运行Apache Web服务器。我想使用Bonjour帮助计算机发现彼此(计算机在本地网络中工作)。

Answers:


54
  1. 是。斯图尔特·柴郡(Stuart Cheshire)是苹果公司Rendezvous / Bonjour的创始人和主要维护者,他还是IETF ZeroConf工作组的联合主席,并撰写了关于零配置网络的O'Reilly书,他将Bonjour描述为“三腿凳”,腿是:

    1. IPv4(和IPv6)链接本地寻址
    2. 组播名称解析(mDNS)
    3. DNS服务发现(DNS-SD)

    IETF ZeroConf工作组和Apple都认为本地链接寻址,尤其是IPv4本地链接寻址(169.254.0.0/16地址)是ZeroConf / Bonjour的一部分,即使本地链接寻址比其他两个“大腿”早了几年。

    请注意,由于即使没有安装Apple的Windows Bonjour软件,Windows也已经支持自动链接本地寻址,因此许多Windows用户并不认为IPv4链接本地寻址是Bonjour / ZeroConf的一部分。

  2. 是。如果Mac和Windows机器默认配置为DHCP,但没有可用的DHCP服务器,则默认情况下会执行IPv4链接本地寻址。装有Avahi(或可能的其他ZeroConf实现)的Linux和BSD机器也可以做到这一点。

  3. 如果计算机正在运行Bonjour,则其主机名将通过mDNS在LAN上发布。如果您的计算机名称为“ Alice”,则将Alice.local通过mDNS进行。在同一局域网(具体而言,在同一链接本地多播域)上的另一台计算机(我们称其为“鲍勃”)上,您应该能够简单地键入ping Alice.local,鲍勃就应该进行mDNS查找Alice.local以发现爱丽丝的IP地址( es),然后对返回的地址(其中之一)执行ping操作。

    但是请注意,Bonjour区分主机名和服务名。例如,如果您有两台单独的USB打印机,比如说连接到Alice的“ HP”和“ Canon”,而Alice充当lpr着这两个打印机的打印服务器,则它们各自可以显示为自己的服务,它映射回Alice.local为主机。

    他们的服务名称将以“ HP”和“ Canon”的形式显示给用户,而不会提及Alice。在幕后,它们被称为HP._printer._tcp.localCanon._printer._tcp.local,并且在这些服务名称上的DNS-SD查找将显示这些服务Alice.local在两个不同的TCP端口上可用。

    因此,是的,应用程序必须通知Bonjour守护程序(mDNSResponder在Apple的实现中称为),它们具有要播发的服务。macOS具有自动处理本机无法识别Bonjour的旧服务的服务公告的机制。例如,macOS sshd是OpenSSH,它不直接支持Bonjour,但是macOS会ssh通过Bonjour 宣传服务,以便您可以ssh username@Alice.local从LAN上的其他计算机上进行广告。

  4. 在macOS上,有一个“ dns-sd”命令行工具可以使用以下语法注册服务:

    dns-sd -R <Name> <Type> <Domain> <Port> [<TXT>...]  
    # (Register a service)
    

    因此,例如:

    dns-sd -R MyWebsite _http._tcp local 80
    

    如果Windows的Bonjour或Windows的Bonjour SDK中包含了它,或者可以从Apple的mDNSResponder开源项目为Windows进行编译,我也不会感到惊讶。搜寻dns-sd.exe,我发现存在这样的事情。我不确定是否会为此下载一个二进制文件。相反,我会尝试从上述软件包之一中获取它,或者自己从mDNSResponder项目源代码中对其进行编译。

  5. 您也可以使用dns-sd命令行工具浏览服务并进行查找。这是查找本地Web服务的示例:

    使用以下方法浏览本地Web服务-B

    $ dns-sd -B _http._tcp local  
    Browsing for _http._tcp.local  
    Timestamp     A/R Flags if Domain                    Service Type              Instance Name  
    16:30:59.870  Add     3  6 local.                    _http._tcp.               My Cool Web App  
    16:30:59.871  Add     3  6 local.                    _http._tcp.               Someone Else's Web Service  
    16:30:59.871  Add     3  6 local.                    _http._tcp.               A Third One  
    ^C
    

    使用以下命令查找我想要的一个“ My Cool Web App” -L

    $ dns-sd -L "My Cool Web App" _http._tcp local  
    Lookup My Cool Web App._http._tcp.local  
    16:31:52.678  My\032Cool\032Web\032App._http._tcp.local. can be reached at MyWebServer.local.:80 (interface 6)  
    ^C  
    

    使用以下命令查询MyWebServer.local的IP地址-Q

    $ dns-sd -Q MyWebServer.local  
    Timestamp     A/R Flags if Name                             T   C Rdata  
    16:32:40.786  Add     2  6 MyWebServer.local.               1   1 169.254.45.209  
    ^C  
    

    请注意,在这些示例中,您必须Ctrl-C退出该dns-sd工具。否则,它将永远保持打开状态,持续监视网络并报告您发出的查询结果的任何变化(例如,在-B浏览查询打开的情况下,网络上的Web服务器)。我发现由于这个和其他原因,该dns-sd工具不太适合从脚本中调用。毕竟,您可能想要查看首选语言的ZeroConf库。

要回答您的其他问题之一,我不知道有任何ZeroConf实现允许您仅通过读取/写入文件来执行查询并获得结果。大多数使用Bonjour的应用程序都是通过直接调用API(C / C ++ / Obj-C / Swift应用程序)或通过特定于该语言的库(解释/脚本语言)来调用API的。


我见过的Bonjour / Zeroconf的最佳解释。您应该为Wikipedia文章做一些贡献:)
Kamil Kisiel 2010年

这是非常完整的,但是如果您想扩展DNS记录的使用方式,请随时从serverfault.com/questions/18565/…中
andrewtj 2010年

4

首先,Bonjour到底做了什么(请阅读下面写的我的猜测)?在这里,我发现Bonjour可以自动发现IP网络上的计算机,设备和服务。但是我认为它不仅可以“在IP网络上发现设备”,还可以通过为运行Bonjour的设备分配IP地址来创建IP网络。我对吗?

不完全的; 正如乔恩指出的那样,DHCP(通常)用于分配IP地址。与普通DNS将域名转换为IP地址的方式几乎相同,Bonjour用于将临时域名(在本地网络内)转换为提供临时域名的IP地址。

我仍然想念本质。它以下列方式工作吗?首先,我以物理方式连接设备(例如笔记本电脑),以便它们之间可以相互通信。然后,可以说,在一些运行Bonjour的便携式计算机上,结果,这些便携式计算机会自动为其自动分配IP地址。因此,便携式计算机(运行Bonjour的计算机)将建立IP网络。这样行吗?

不; 笔记本电脑最有可能从本地DHCP服务器获取IP地址。Bonjour只是帮助他们确定每个人可以向其他人提供的服务。

或者可能是因为运行Bonjour的计算机不被视为服务,并且仅由于Bonjour在此计算机上运行而无法广播。我的意思是,计算机上运行的应用程序需要使用Bonjour进行广播。因此,是应用程序自行广播(不是计算机),并且不会自动完成(应用程序需要明确地自行广播)。这样对吗?

是的-通常,您的应用程序将需要显式公布其存在。这通常可以使用系统提供的库(在OS X上常见)或自定义库(例如perl的Net :: Bonjour)来完成。

我的应用程序如何准确地自我广播?我可以使用命令行注册服务吗(以便所有使用Bonjour的应用程序都知道出现了新服务)

我不知道执行此操作的命令行工具,但是许多主要的编程语言都有可用于执行此操作的库。

此外,我想拥有一个使用Bonjour创建的IP网络的应用程序。为此,我的应用程序需要知道网络中存在哪些设备/服务。更详细地,我的应用程序需要具有服务列表。列表中的每个服务应具有名称,运行服务的IP地址以及应用程序使用的端口。Bonjour可以通过某种方式提供此信息吗?

大多数Bonjour库都应该能够为您执行此操作;请参阅第一个示例,网址http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

如果是这样,它是如何工作的。我的程序如何从Bonjour获得此信息?我的程序可以读取Bonjour创建的包含上述信息的文件吗?我可以在命令行中使用一些命令来检索此信息吗?

该程序使用适当的库,使用Bonjour协议询问本地网络中的所有其他计算机,以告知它们它们提供哪些服务。然后,该库将解析响应,并以更有用的格式将其呈现给您。

我对从文件,环境变量或命令行中的命令访问有关服务的信息特别感兴趣。在我看来,这些选择是最简单的!由于在这种情况下,我不需要使用任何其他库来通过特定的编程语言与Bonjour通信。

我不知道执行此操作的工具,但是它可能存在。

如果我的问题不清楚,请问PS Pleas。我将尝试以更清晰的方式提出我的问题。

有关您正在编写的程序将执行的操作以及使用何种语言编写的更多信息,将使帮助变得更加容易。

有关更多介绍性信息,请同时尝试以下两种方法:


e,我在原始问题的末尾添加了您所需的信息。
罗马2010年

在caelyx中,您写道Bonjour没有分配IP地址:“通常使用DHCP分配IP地址”。但是Bonjour实现了ZeroConf协议,ZeroConf协议的核心技术之一(根据维基百科)是“为联网设备分配数字网络地址(链接本地地址自动配置)”。
罗马2010年

在没有DHCP / BootP服务器的IPv4网络上,主机将为其分配一个168. *地址。Bonjour可以正确使用这些地址。要么是指IPv6链接本地地址。
jdizzle 2010年

3

Bonjour不会分配IP地址-它是一种发现协议-您仍需要DHCP / Static / Link-Local(APIPA)IP地址才能使其工作。

它使用多播DNS(mDNS)来发现哪些主机与其本身在同一广播域中,并且实际上它成为自己的DNS服务器。

请参阅BonjourZeroconf以了解有关此功能的信息。

除非您的应用程序用于家庭/非托管网络,也就是说,缺少本地DNS服务器,否则就不需要它。


ZeroConf不分配IP地址吗?
Gobliins'8
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.