如何使用卓悦?

Rom*_*man 29 networking mdns bonjour

  1. 首先,卓悦究竟是做什么的(请阅读我在下面写的猜测)?
    在这里,我发现 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 如果我的问题中有不清楚的地方,请提出问题。我将尝试以更清晰的方式提出我的问题。

PPS我使用的是 Windows 7

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

Spi*_*iff 56

  1. 是的。Stuart Cheshire 是 Apple 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 的 Bonjour for Windows 软件,Windows 也已经支持自动链接本地寻址,因此许多 Windows 用户并不认为 IPv4 链接本地寻址是 Bonjour/ZeroConf 的一部分。

  2. 是的。如果 Mac 和 Windows 机器配置为 DHCP 但没有可用的 DHCP 服务器,则默认情况下它们会执行 IPv4 链路本地寻址。安装了 Avahi(或可能的其他 ZeroConf 实现)的 Linux 和 BSD 机器也将执行此操作。

  3. 如果一台计算机运行 Bonjour,它的主机名通过 mDNS 发布在 LAN 上。如果您的机器名称是“Alice”,它将Alice.local通过 mDNS。在同一 LAN(特别是在同一链路本地多播域)上的另一台计算机(我们称其为“Bob”),您应该能够简单地键入ping Alice.local,并且 Bob 应该进行 mDNS 查找Alice.local以发现 Alice 的 IP 地址( es),并ping(其中一个)它返回的地址。

    但请注意,Bonjour 区分主机名和服务名。例如,如果您有两台独立的 USB 打印机,假设“HP”和“Canon”连接到 Alice,并且 Alice 充当lpr它们的打印服务器,那么它们都可以显示为自己的服务,映射回Alice.local主机。

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

    所以是的,应用程序必须通知 Bonjour 守护进程(mDNSResponder在 Apple 的实现中调用)他们有要宣传的服务。macOS 具有自动处理原生服务不支持 Bonjour 的服务广告的机制。例如,macOSsshd是 OpenSSH,它不直接支持 Bonjour,但 macOS 负责ssh通过 Bonjour来宣传该服务,以便您可以ssh username@Alice.local从局域网上的其他机器上访问。

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

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

    例如:

    dns-sd -R MyWebsite _http._tcp local 80
    
    Run Code Online (Sandbox Code Playgroud)

    如果它包含在适用于 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
    
    Run Code Online (Sandbox Code Playgroud)

    查找我想要的“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  
    
    Run Code Online (Sandbox Code Playgroud)

    使用以下命令查询 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  
    
    Run Code Online (Sandbox Code Playgroud)

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

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