Como usar o Bonjour?

23
  1. Primeiro, o que exatamente o Bonjour faz (por favor, leia meus palpites escritos abaixo)?
    Aqui , descobri que o Bonjour permite a descoberta automática de computadores, dispositivos e serviços em redes IP. Mas eu pensei que não apenas "descobre dispositivos na rede IP", mas também cria uma rede IP, atribuindo endereços IP a dispositivos onde o Bonjour está sendo executado. Estou certo?

  2. E eu ainda sinto falta da essência. Funciona da seguinte maneira? Primeiro, conecto dispositivos (por exemplo, laptops) fisicamente, para que eles possam se comunicar uns com os outros. Então, vamos dizer, em alguns laptops eu tenho o Bonjour rodando e então, como conseqüência, esses laptops atribuem endereços IP a eles mesmos de maneira automática. Então, laptops (onde o Bonjour está rodando) constroem uma rede IP. Funciona desta maneira?

  3. Ou pode ser um computador executando o Bonjour não é considerado como um serviço e não é transmitido em si só porque o Bonjour está sendo executado neste computador. Quero dizer que os aplicativos em execução nos computadores precisam usar o Bonjour para transmitir a si mesmos. Portanto, são aplicativos que transmitem a si mesmos (não computadores) e não são feitos automaticamente (o aplicativo precisa se difundir 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 o Bonjour saibam que um novo serviço apareceu)?

  5. Além disso, gostaria de ter um aplicativo que use a rede IP criada pelo 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 onde está sendo executado e a porta usada pelo aplicativo. O Bonjour pode fornecer essa informação de alguma forma? Se for o caso, como funciona exatamente. Como meu programa pode obter essa informação do Bonjour? O meu programa pode ler algum arquivo criado pelo Bonjour e conter as informações acima mencionadas? Posso usar alguns comandos na linha de comando para recuperar essas informações?

  6. Eu 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 ser as mais simples! Já que nesses casos eu não preciso usar nenhuma biblioteca adicional para se comunicar com o Bonjour de uma linguagem de programação específica.

P.S. Os fundamentos fazem perguntas se algo não está claro na minha pergunta. Vou tentar formular a minha pergunta de uma forma mais clara.

P.P.S. Eu uso o Windows 7 .

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

    
por Roman 03.03.2010 / 09:23

3 respostas

49
  1. Sim. Stuart Cheshire, que foi o criador e 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 banquinho de pernas ", onde as pernas são:

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

    O grupo de trabalho IETF ZeroConf e Apple consideram endereçamento link-local, especialmente endereçamento IPv4 link-local ( 169.254.0.0/16 endereços) para fazer parte do ZeroConf / Bonjour, apesar do endereçamento link-local ter sido enviado anos antes dos outros dois. pernas das fezes ”.

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

  2. Sim. Máquinas Mac e Windows, por padrão, fazem o endereçamento local de link IPv4 se estiverem configuradas para DHCP, mas não há 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.local via mDNS. De outro computador (vamos chamá-lo de “Bob”) na mesma LAN (especificamente, no mesmo domínio multicast link-local), você deve simplesmente digitar ping Alice.local , e Bob deve fazer uma pesquisa mDNS de Alice.local para descobrir o (s) endereço (s) IP de Alice, e pingar (um) o (s) endereço (s) de volta.

    Note, no entanto, que o 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, digamos, um servidor de impressão lpr para ambas, elas podem aparecer como seu próprio serviço, que mapeia de volta para Alice.local como 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.local e Canon._printer._tcp.local , e as pesquisas DNS-SD nesses nomes de serviço mostrariam que esses serviços estão disponíveis em Alice.local em duas portas TCP diferentes.

    Então, sim, os aplicativos devem notificar o daemon Bonjour (chamado mDNSResponder na implementação da Apple) de que eles têm serviços que desejam anunciar. O macOS tem mecanismos para manipular automaticamente o anúncio de serviço para serviços legados que não são nativamente compatíveis com o Bonjour. Por exemplo, o sshd do macOS é o OpenSSH, que não suporta diretamente o Bonjour, mas o macOS cuida de anunciar o serviço ssh via Bonjour, para que você possa apenas ssh [email protected] de 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
    

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

  5. Você também pode usar a ferramenta de linha de comando dns-sd para procurar serviços e pesquisá-los. Aqui está um exemplo de procurar 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  My2Cool2Web2App._http._tcp.local. can be reached at MyWebServer.local.:80 (interface 6)  
    ^C  
    

    Consulte os endereços IP para 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-C da ferramenta dns-sd . Caso contrário, ele permanecerá aberto para sempre, observando continuamente a rede e relatando quaisquer alterações nos resultados da consulta que você emitiu (como servidores da Web indo e vindo na rede, enquanto você se senta com uma consulta -B browse aberta). Descobri que, por essa e por outras razões, a ferramenta dns-sd não é adequada para ser chamada por um script. Você pode querer olhar para o que as bibliotecas ZeroConf para o seu idioma preferido, afinal.

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

    
por 06.03.2010 / 00:52
4

First, what exactly Bonjour does (pleas read my guesses written bellow)? Here I found out that Bonjour enables automatic discovery of computers, devices, and services on IP networks. But I thought that it not only "discovers devices on IP network" it also creates an IP network by assigning IP addresses to devices where Bonjour is running. Am I right?

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

And I still miss the essence. Does it work in the following way? First I connect devices (for example laptops) physically so that they potentially can communicate with each other. Then, let say, on some laptops I have Bonjour running and then, as a consequence, these laptops assign IP addresses to them self in automatic way. So, laptops (where Bonjour is running) build an IP network. Does it work in this way?

Não; os laptops provavelmente estão obtendo seus endereços IP de um servidor DHCP local. Bonjour apenas os ajuda a descobrir quais serviços cada um pode oferecer aos outros.

Or may be a computer running Bonjour is not considered as a service and it does not broadcast itself just because Bonjour is running on this computer. I mean that the applications running on the computers need to use Bonjour to broadcast themself. So, it is applications that broadcast themself (not computers) and it is not done automatically (application needs to broadcast themself explicitly). Is it right?

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, o Net :: Bonjour do perl).

How exactly my application can broadcast itself? Can I use command line to register an service (so that all applications using Bonjour knows that a new service appeared)

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

Further, I would like to have an application which use the IP network created by Bonjour. For that my application needs to know which devices/services are present in the network. In more details, my application needs to have a list of services. Each service in the list should have a name, the IP address where it is running and the port which is used by the application. Can Bonjour provide this information in some way?

A maioria das bibliotecas do Bonjour deve ser capaz de fazer isso por você; veja o primeiro exemplo em link

If it is the case, how exactly it works. How my program can get this information from Bonjour? Can my program read some file created by Bonjour and containing the above mentioned information? Can I use some commands in command line to retrieve this information?

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

I have a special interest in accessing the information about services from files, environment variables or commands in command line. These options seems to me to be the simplest! Since in these case I do not need to use any additional libraries to communicate with Bonjour from a particular programming language.

Não conheço uma ferramenta que faz isso, mas pode existir.

P.S. Pleas ask questions if something is not clear in my question. I will try to formulate my question in a more clear way.

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

Para mais informações introdutórias, experimente ambas:

  • as Perguntas frequentes da Apple: link
  • a página da Wikipédia: link
por 05.03.2010 / 12:58
3

O Bonjour não atribui endereços IP - é um protocolo de descoberta - você ainda precisa de endereços IP DHCP / Static / Link-Local (APIPA) para funcionar.

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

Veja Bonjour & Zeroconf para informações gerais.

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

    
por 03.03.2010 / 10:11