Como usar o Bonjour?

26
  1. Primeiro, o que exatamente Bonjour faz (por favor, leia minhas suposições escritas abaixo)?
    Aqui descobri que o Bonjour permite a descoberta automática de computadores, dispositivos e serviços em redes IP. Mas pensei que não apenas "descobre dispositivos na rede IP", como também cria uma rede IP atribuindo endereços IP a dispositivos nos quais o Bonjour está sendo executado. Estou certo?

  2. E ainda sinto falta da essência. Funciona da seguinte maneira? Primeiro, conecto dispositivos (por exemplo, laptops) fisicamente para que eles possam se comunicar. Então, digamos, em alguns laptops, tenho o Bonjour em execução e, como conseqüência, esses laptops atribuem endereços IP a eles mesmos de maneira automática. Assim, os laptops (onde Bonjour está sendo executado) constroem uma rede IP. Funciona dessa maneira?

  3. Ou pode ser que um computador executando o Bonjour não seja considerado um serviço e não seja transmitido apenas porque o Bonjour está sendo executado neste computador. Quero dizer que os aplicativos executados nos computadores precisam usar o Bonjour para se transmitir. Portanto, são os aplicativos que se transmitem (não os computadores) e isso não é feito automaticamente (o aplicativo precisa se transmitir explicitamente). Está certo?

  4. Como exatamente meu aplicativo pode se transmitir? Posso usar a linha de comando para registrar um serviço (para que todos os aplicativos que usam Bonjour saibam que um novo serviço apareceu)?

  5. Além disso, eu gostaria de ter um aplicativo que use a rede IP criada por Bonjour. Para isso, meu aplicativo precisa saber quais dispositivos / serviços estão presentes na rede. Em mais detalhes, meu aplicativo precisa ter uma lista de serviços. Cada serviço na lista deve ter um nome, o endereço IP em que está sendo executado e a porta usada pelo aplicativo. Bonjour pode fornecer essas informações de alguma forma? Se for o caso, como exatamente funciona. Como meu programa pode obter essas informações do Bonjour? Meu programa pode ler algum arquivo criado por Bonjour e contendo as informações acima mencionadas? Posso usar alguns comandos na linha de comando para recuperar essas informações?

  6. Tenho um interesse especial em acessar as informações sobre serviços de arquivos, variáveis ​​de ambiente ou comandos na linha de comando. Essas opções me parecem as mais simples! Como nesse caso, não preciso usar nenhuma biblioteca adicional para me comunicar com Bonjour a partir de uma linguagem de programação específica.

Por favor, faça perguntas se algo não estiver claro na minha pergunta. Vou tentar formular minha pergunta de uma maneira mais clara.

PPS Eu uso o Windows 7 .

ADICIONADO: pretendo escrever meus aplicativos em PHP. Todo computador deve executar um servidor web Apache. E quero usar o Bonjour para ajudar o computador a se descobrir (os computadores estão trabalhando em uma rede local).

romano
fonte

Respostas:

54
  1. Sim. Stuart Cheshire, que foi o criador e é o principal mantenedor do Rendezvous / Bonjour na Apple, que também co-presidiu o grupo de trabalho IETF ZeroConf e escreveu o livro O'Reilly sobre Zero Configuration Networking, descreveu Bonjour como um “ fezes com pernas ", onde as pernas são:

    1. Endereçamento local de link IPv4 (e IPv6)
    2. Resolução de nome de difusão seletiva (mDNS)
    3. Descoberta de serviço DNS (DNS-SD)

    O grupo de trabalho IETF ZeroConf e a Apple consideram o endereçamento local de link, especialmente o endereçamento local de link IPv4 169.254.0.0/16como parte do ZeroConf / Bonjour, mesmo que o endereçamento local de link seja enviado anos antes das outras duas "pernas do banco".

    Observe que, como o Windows já suporta endereçamento local de link automático, mesmo sem o software Bonjour para Windows da Apple instalado, muitos usuários do Windows não consideram o endereçamento local de link IPv4 como parte do Bonjour / ZeroConf.

  2. Sim. Os computadores Mac e Windows, por padrão, fazem o endereçamento local do link IPv4 se estiverem configurados para DHCP, mas não houver um servidor DHCP disponível. Máquinas Linux e BSD com Avahi (ou possivelmente outras implementações ZeroConf) instaladas também farão isso.

  3. Se um computador estiver executando o Bonjour, seu nome de host será publicado na LAN via mDNS. Se o nome da sua máquina for "Alice", será Alice.localvia mDNS. Em outro computador (vamos chamá-lo de "Bob") na mesma LAN (especificamente, no mesmo domínio de multicast local de link), você deve simplesmente digitar ping Alice.locale Bob deve fazer uma pesquisa mDNS Alice.localpara descobrir o endereço IP de Alice ( es) e execute ping (um dos) endereços que ele recebe de volta.

    Observe, no entanto, que Bonjour diferencia entre nomes de host e nomes de serviço. Por exemplo, se você tem duas impressoras USB separadas, digamos "HP" e "Canon", conectadas a Alice, e Alice está agindo como, por exemplo, um lprservidor de impressão para as duas, elas podem aparecer como seu próprio serviço , que mapeia de volta para Alice.localo host.

    Seus nomes de serviço apareceriam para o usuário como "HP" e "Canon" sem mencionar Alice. Nos bastidores, eles seriam conhecidos como HP._printer._tcp.locale Canon._printer._tcp.local, e as pesquisas DNS-SD nesses nomes de serviço mostrariam que esses serviços estão disponíveis Alice.localem duas portas TCP diferentes.

    Portanto, sim, os aplicativos devem notificar o daemon Bonjour (chamado mDNSResponderna implementação da Apple) de que possuem os serviços que desejam anunciar. O macOS possui mecanismos para manipular automaticamente os anúncios de serviços de serviços herdados que não têm conhecimento nativo do Bonjour. Por exemplo, o macOS sshdé o OpenSSH, que não oferece suporte direto ao Bonjour, mas o macOS cuida da publicidade do sshserviço via Bonjour, para que você possa apenas ssh [email protected]usar outras máquinas na LAN.

  4. No macOS, há uma ferramenta de linha de comando "dns-sd" que pode registrar um serviço usando esta sintaxe:

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

    Então, por exemplo:

    dns-sd -R MyWebsite _http._tcp local 80
    

    Não ficaria surpreso se ele estiver incluído no Bonjour para Windows ou no Bonjour SDK para Windows, ou se você puder compilá-lo para Windows no projeto de código aberto mDNSResponder da Apple . Pesquisando dns-sd.exe, vejo que isso existe. Não tenho certeza se eu apenas baixaria um binário para ele. Em vez disso, tentaria obtê-lo em um dos pacotes mencionados acima ou compilá-lo pessoalmente a partir das fontes do projeto mDNSResponder.

  5. Você também pode usar a dns-sdferramenta de linha de comando para procurar serviços e procurá-los. Aqui está um exemplo de pesquisa de um serviço da web local:

    Procure serviços da Web locais com -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
    

    Procure o que eu quero, "My Cool Web App", com -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  
    

    Consulte os endereços IP do MyWebServer.local, com -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  
    

    Observe nesses exemplos que você deve Ctrl-Csair da dns-sdferramenta. Caso contrário, ele permanecerá aberto para sempre, monitorando continuamente a rede e relatando quaisquer alterações nos resultados da consulta que você emitiu (como servidores da web entrando e saindo na rede, enquanto você está sentado com uma -Bconsulta de navegação aberta). Descobri que, por esse e outros motivos, a dns-sdferramenta não é adequada para ser chamada de um script. Você pode querer saber quais são as bibliotecas ZeroConf para o seu idioma preferido.

Para responder a uma de suas outras perguntas, não conheço nenhuma implementação do ZeroConf que permita executar consultas e obter resultados apenas lendo / gravando arquivos. A maioria dos aplicativos que usam Bonjour faz isso chamando as APIs, diretamente (aplicativos C / C ++ / Obj-C / Swift) ou através de uma biblioteca específica para o idioma (linguagens interpretadas / de script).

Spiff
fonte
Melhor explicação de Bonjour / Zeroconf que eu já vi. Você deve contribuir alguns para o artigo wikipedia :)
Kamil Kisiel
Este é bastante completo como é, mas se você gostaria de expandir sobre como registros de DNS são usados por favor, sinta-se livre para roubar serverfault.com/questions/18565/...
andrewtj
4

Primeiro, o que exatamente Bonjour faz (por favor, leia minhas suposições escritas abaixo)? Aqui descobri que o Bonjour permite a descoberta automática de computadores, dispositivos e serviços em redes IP. Mas pensei que não apenas "descobre dispositivos na rede IP", como também cria uma rede IP atribuindo endereços IP a dispositivos nos quais o Bonjour está sendo executado. Estou certo?

Não é bem assim; como Jon apontou, o DHCP (geralmente) é usado para alocar endereços IP. Da mesma maneira que o DNS comum converte nomes de domínio em endereços IP, o Bonjour é usado para converter nomes de domínio temporários (dentro da rede local) nos endereços IP que os fornecem.

E ainda sinto falta da essência. Funciona da seguinte maneira? Primeiro, conecto dispositivos (por exemplo, laptops) fisicamente para que eles possam se comunicar. Então, digamos, em alguns laptops, tenho o Bonjour em execução e, como conseqüência, esses laptops atribuem endereços IP a eles mesmos de maneira automática. Assim, os laptops (onde Bonjour está sendo executado) constroem uma rede IP. Funciona dessa maneira?

Não; é provável que os laptops obtenham seus endereços IP de um servidor DHCP local. Bonjour apenas os ajuda a descobrir quais serviços cada um pode oferecer aos outros.

Ou pode ser que um computador executando o Bonjour não seja considerado um serviço e não seja transmitido apenas porque o Bonjour está sendo executado neste computador. Quero dizer que os aplicativos executados nos computadores precisam usar o Bonjour para se transmitir. Portanto, são os aplicativos que se transmitem (não os computadores) e isso não é feito automaticamente (o aplicativo precisa se transmitir explicitamente). Está certo?

Sim - geralmente, seu aplicativo precisará anunciar sua existência explicitamente. Isso geralmente pode ser feito usando bibliotecas fornecidas pelo sistema (comuns no OS X) ou bibliotecas personalizadas (por exemplo, Net :: Bonjour do perl).

Como exatamente meu aplicativo pode se transmitir? Posso usar a linha de comando para registrar um serviço (para que todos os aplicativos que usam Bonjour saibam que um novo serviço apareceu)

Não conheço uma ferramenta de linha de comando que faça isso, mas muitas linguagens de programação importantes têm bibliotecas disponíveis para fazer isso.

Além disso, eu gostaria de ter um aplicativo que use a rede IP criada por Bonjour. Para isso, meu aplicativo precisa saber quais dispositivos / serviços estão presentes na rede. Em mais detalhes, meu aplicativo precisa ter uma lista de serviços. Cada serviço na lista deve ter um nome, o endereço IP em que está sendo executado e a porta usada pelo aplicativo. Bonjour pode fornecer essas informações de alguma forma?

A maioria das bibliotecas Bonjour deve ser capaz de fazer isso por você; veja o primeiro exemplo em http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

Se for o caso, como exatamente funciona. Como meu programa pode obter essas informações do Bonjour? Meu programa pode ler algum arquivo criado por Bonjour e contendo as informações acima mencionadas? Posso usar alguns comandos na linha de comando para recuperar essas informações?

Usando as bibliotecas apropriadas, o programa usa o protocolo Bonjour para solicitar a todos os outros computadores da rede local que informem quais serviços eles têm disponíveis. Essa biblioteca analisará as respostas e as apresentará em um formato mais útil.

Tenho um interesse especial em acessar as informações sobre serviços de arquivos, variáveis ​​de ambiente ou comandos na linha de comando. Essas opções me parecem as mais simples! Como nesse caso, não preciso usar nenhuma biblioteca adicional para me comunicar com Bonjour a partir de uma linguagem de programação específica.

Não conheço uma ferramenta que faça isso, mas ela pode existir.

Por favor, faça perguntas se algo não estiver claro na minha pergunta. Vou tentar formular minha pergunta de uma maneira mais clara.

Mais algumas informações sobre o que o programa que você está escrevendo fará e em que idioma você está escrevendo, facilitaria a ajuda.

Para mais informações introdutórias, tente os dois:

caelyx
fonte
caelyx, adicionei as informações solicitadas por você no final da minha pergunta original.
romano
caelyx, você escreveu que o Bonjour não atribui endereços IP: "DHCP (geralmente) é usado para alocar endereços IP". Mas Bonjour implementa o protocolo ZeroConf e uma das principais tecnologias do protocolo ZeroConf (de acordo com a wikipedia) é "Atribuição de endereços de rede numéricos para dispositivos em rede (configuração automática de link-endereço local)".
romano
Nas redes IPv4 sem servidor DHCP / BootP, os hosts atribuirão a si mesmos um endereço 168. *. Bonjour funciona corretamente com esses endereços. Ou isso, ou está se referindo a endereços IPv6 Link-Local.
jdizzle
3

Bonjour não atribui endereços IP - é um protocolo de descoberta - você ainda precisa de endereços IP DHCP / estático / local de link (APIPA) para que ele funcione.

Ele usa o DNS multicast (mDNS) para descobrir quais hosts estão no mesmo domínio de broadcast e se torna essencialmente seu próprio servidor DNS.

Veja Bonjour & Zeroconf para ver detalhes.

A menos que seu aplicativo seja para uma rede doméstica / não gerenciada, ou seja, na falta de um servidor DNS local, você simplesmente não precisa dele.

Jon Rhoades
fonte
ZeroConf não atribui endereços IP?
Gobliins