¿Cómo usar Bonjour?

26
  1. Primero, ¿qué hace exactamente Bonjour (por favor lea mis conjeturas escritas abajo)?
    Aquí descubrí que Bonjour permite el descubrimiento automático de computadoras, dispositivos y servicios en redes IP. Pero pensé que no solo "descubre dispositivos en la red IP" sino que también crea una red IP al asignar direcciones IP a los dispositivos donde se está ejecutando Bonjour. Estoy en lo cierto?

  2. Y todavía extraño la esencia. ¿Funciona de la siguiente manera? Primero conecto los dispositivos (por ejemplo, computadoras portátiles) físicamente para que potencialmente puedan comunicarse entre sí. Luego, digamos, en algunas computadoras portátiles tengo Bonjour funcionando y luego, como consecuencia, estas computadoras portátiles les asignan direcciones IP automáticamente. Entonces, las computadoras portátiles (donde se está ejecutando Bonjour) crean una red IP. ¿Funciona de esta manera?

  3. O puede ser que una computadora que ejecuta Bonjour no se considera como un servicio y no se transmite solo porque Bonjour se ejecuta en esta computadora. Quiero decir que las aplicaciones que se ejecutan en las computadoras necesitan usar Bonjour para transmitirse. Por lo tanto, son las aplicaciones las que se transmiten a sí mismas (no las computadoras) y no se hace automáticamente (la aplicación necesita transmitirse a sí mismas explícitamente). ¿Es correcto?

  4. ¿Cómo se puede transmitir mi aplicación exactamente? ¿Puedo usar la línea de comando para registrar un servicio (para que todas las aplicaciones que usan Bonjour sepan que apareció un nuevo servicio)?

  5. Además, me gustaría tener una aplicación que use la red IP creada por Bonjour. Para eso, mi aplicación necesita saber qué dispositivos / servicios están presentes en la red. En más detalles, mi aplicación necesita tener una lista de servicios. Cada servicio en la lista debe tener un nombre, la dirección IP donde se está ejecutando y el puerto que utiliza la aplicación. ¿Bonjour puede proporcionar esta información de alguna manera? Si es el caso, cómo funciona exactamente. ¿Cómo puede mi programa obtener esta información de Bonjour? ¿Puede mi programa leer algún archivo creado por Bonjour y que contenga la información mencionada anteriormente? ¿Puedo usar algunos comandos en la línea de comandos para recuperar esta información?

  6. Tengo un interés especial en acceder a la información sobre servicios desde archivos, variables de entorno o comandos en la línea de comandos. ¡Estas opciones me parecen las más simples! Como en este caso no necesito usar ninguna biblioteca adicional para comunicarme con Bonjour desde un lenguaje de programación en particular.

PD: Haga preguntas si algo no está claro en mi pregunta. Trataré de formular mi pregunta de una manera más clara.

PPS Yo uso Windows 7 .

AGREGADO: planeo escribir mis aplicaciones en PHP. Cada computadora debe ejecutar un servidor web Apache. Y quiero usar Bonjour para ayudar a la computadora a descubrirse (las computadoras están trabajando en una red local).

romano
fuente

Respuestas:

54
  1. Sí. Stuart Cheshire, quien fue el creador y el principal mantenedor de Rendezvous / Bonjour en Apple, quien también copresidió el grupo de trabajo IETF ZeroConf y escribió el libro O'Reilly sobre Zero Configuration Networking, describió a Bonjour como un "tres- heces con patas ”donde están las piernas:

    1. Direccionamiento local de enlace IPv4 (e IPv6)
    2. Resolución de nombre de multidifusión (mDNS)
    3. Descubrimiento de servicio DNS (DNS-SD)

    Tanto el grupo de trabajo IETF ZeroConf como Apple consideran el direccionamiento local de enlace, especialmente el direccionamiento local de enlace IPv4 ( 169.254.0.0/16direcciones) como parte de ZeroConf / Bonjour, a pesar de que el direccionamiento local de enlace se envió años antes que las otras dos "patas del taburete".

    Tenga en cuenta que, dado que Windows ya admite el direccionamiento local de enlace automático incluso sin el software Bonjour para Windows de Apple instalado, muchos usuarios de Windows no piensan que el direccionamiento local de enlace IPv4 sea parte de Bonjour / ZeroConf.

  2. Sí. Las máquinas Mac y Windows, por defecto, realizan direccionamiento local de enlace IPv4 si están configuradas para DHCP pero no hay un servidor DHCP disponible. Las máquinas Linux y BSD con Avahi (o posiblemente otras implementaciones ZeroConf) instaladas también lo harán.

  3. Si una computadora ejecuta Bonjour, su nombre de host se publica en la LAN mediante mDNS. Si el nombre de su máquina es "Alice", será a Alice.localtravés de mDNS. Desde otra computadora (llamémosla "Bob") en la misma LAN (específicamente, en el mismo dominio de multidifusión local de enlace), debería poder simplemente escribir ping Alice.local, y Bob debería hacer una búsqueda de mDNS Alice.localpara descubrir la dirección IP de Alice ( es) y haga ping (una de) las direcciones que recupera.

    Sin embargo, tenga en cuenta que Bonjour diferencia entre nombres de host y nombres de servicio. Por ejemplo, si tiene dos impresoras USB separadas, digamos "HP" y "Canon", conectadas a Alice, y Alice actúa como, digamos, un lprservidor de impresión para ambas, cada una puede aparecer como su propio servicio , que se asigna de nuevo Alice.localcomo host.

    Sus nombres de servicio se mostrarían al usuario como "HP" y "Canon" sin mencionar a Alice. Detrás de escena, se conocerían como HP._printer._tcp.localy Canon._printer._tcp.local, y las búsquedas DNS-SD en esos nombres de servicio mostrarían que esos servicios están disponibles Alice.localen dos puertos TCP diferentes.

    Entonces, sí, las aplicaciones deben notificar al demonio Bonjour (llamado mDNSResponderen la implementación de Apple) que tienen servicios que desean anunciar. macOS tiene mecanismos para manejar automáticamente la publicidad de servicios para servicios heredados que no son nativos de Bonjour. Por ejemplo, macOS sshdes OpenSSH, que no es compatible con Bonjour directamente, pero macOS se encarga de anunciar el sshservicio a través de Bonjour para que pueda simplemente ssh [email protected]desde otras máquinas en la LAN.

  4. En macOS, hay una herramienta de línea de comandos "dns-sd" que puede registrar un servicio utilizando esta sintaxis:

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

    Así por ejemplo:

    dns-sd -R MyWebsite _http._tcp local 80
    

    No me sorprendería si está incluido en Bonjour para Windows, o el SDK de Bonjour para Windows, o si puede compilarlo para Windows desde el proyecto de código abierto mDNSResponder de Apple . Buscando en Google dns-sd.exe, veo que tal cosa existe. No estoy seguro de que solo descargue un binario. En cambio, trataría de obtenerlo de uno de los paquetes mencionados anteriormente, o compilarlo yo mismo de las fuentes del proyecto mDNSResponder.

  5. También puede usar la dns-sdherramienta de línea de comandos para buscar servicios y buscarlos. Aquí hay un ejemplo de búsqueda de un servicio web local:

    Busque servicios web locales con -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
    

    Busque el que quiero, "My Cool Web App", con -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 las direcciones IP de MyWebServer.local con -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  
    

    Tenga en cuenta en estos ejemplos que debe Ctrl-Csalir de la dns-sdherramienta. De lo contrario, permanecerá abierto para siempre, vigilando continuamente la red e informando cualquier cambio en los resultados de la consulta que emitió (como los servidores web que entran y salen de la red, mientras se sienta con una -Bconsulta de exploración abierta). He descubierto que por esta y otras razones, la dns-sdherramienta no es adecuada para ser llamada desde un script. Es posible que desee ver cuáles son las bibliotecas ZeroConf para su idioma preferido después de todo.

Para responder una de sus otras preguntas, no conozco ninguna implementación de ZeroConf que le permita realizar consultas y obtener resultados simplemente leyendo / escribiendo archivos. La mayoría de las aplicaciones que usan Bonjour lo hacen llamando a las API, ya sea directamente (aplicaciones C / C ++ / Obj-C / Swift) o a través de una biblioteca específica del idioma (lenguajes interpretados / scripting).

Spiff
fuente
La mejor explicación de Bonjour / Zeroconf que he visto. Deberías aportar algo al artículo de Wikipedia :)
Kamil Kisiel
Esto es bastante completo, pero si desea ampliar cómo se usan los registros DNS, no dude en robar desde serverfault.com/questions/18565/…
andrewtj
4

Primero, ¿qué hace exactamente Bonjour (por favor lea mis conjeturas escritas abajo)? Aquí descubrí que Bonjour permite el descubrimiento automático de computadoras, dispositivos y servicios en redes IP. Pero pensé que no solo "descubre dispositivos en la red IP" sino que también crea una red IP al asignar direcciones IP a los dispositivos donde se está ejecutando Bonjour. Estoy en lo cierto?

No exactamente; Como señaló Jon, DHCP (generalmente) se utiliza para asignar direcciones IP. De la misma manera que el DNS ordinario traduce los nombres de dominio a direcciones IP, Bonjour se utiliza para traducir nombres de dominio temporales (dentro de la red local) a las direcciones IP que los proporcionan.

Y todavía extraño la esencia. ¿Funciona de la siguiente manera? Primero conecto los dispositivos (por ejemplo, computadoras portátiles) físicamente para que potencialmente puedan comunicarse entre sí. Luego, digamos, en algunas computadoras portátiles tengo Bonjour funcionando y luego, como consecuencia, estas computadoras portátiles les asignan direcciones IP automáticamente. Entonces, las computadoras portátiles (donde se está ejecutando Bonjour) crean una red IP. ¿Funciona de esta manera?

No; Es muy probable que las computadoras portátiles obtengan sus direcciones IP de un servidor DHCP local. Bonjour simplemente los ayuda a determinar qué servicios puede proporcionar cada uno a los demás.

O puede ser que una computadora que ejecuta Bonjour no se considera como un servicio y no se transmite solo porque Bonjour se ejecuta en esta computadora. Quiero decir que las aplicaciones que se ejecutan en las computadoras necesitan usar Bonjour para transmitirse. Por lo tanto, son las aplicaciones las que se transmiten a sí mismas (no las computadoras) y no se realiza automáticamente (la aplicación necesita transmitirse a sí mismas explícitamente). ¿Es correcto?

Sí, en general, su aplicación deberá anunciar su existencia explícitamente. Esto a menudo se puede hacer utilizando bibliotecas proporcionadas por el sistema (comunes en OS X) o bibliotecas personalizadas (por ejemplo, Net :: Bonjour de perl).

¿Cómo se puede transmitir mi aplicación exactamente? ¿Puedo usar la línea de comando para registrar un servicio (para que todas las aplicaciones que usan Bonjour sepan que apareció un nuevo servicio)

No conozco una herramienta de línea de comandos que haga esto, pero muchos lenguajes de programación principales tienen bibliotecas disponibles para hacerlo.

Además, me gustaría tener una aplicación que use la red IP creada por Bonjour. Para eso, mi aplicación necesita saber qué dispositivos / servicios están presentes en la red. En más detalles, mi aplicación necesita tener una lista de servicios. Cada servicio en la lista debe tener un nombre, la dirección IP donde se está ejecutando y el puerto que utiliza la aplicación. ¿Bonjour puede proporcionar esta información de alguna manera?

La mayoría de las bibliotecas de Bonjour deberían poder hacer esto por usted; vea el primer ejemplo en http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

Si es el caso, cómo funciona exactamente. ¿Cómo puede mi programa obtener esta información de Bonjour? ¿Puede mi programa leer algún archivo creado por Bonjour y que contenga la información mencionada anteriormente? ¿Puedo usar algunos comandos en la línea de comandos para recuperar esta información?

Usando las bibliotecas apropiadas, el programa usa el protocolo Bonjour para pedirle a todas las otras computadoras en su red local que le digan qué servicios tienen disponibles. Esa biblioteca analizará las respuestas y se las presentará en un formato más útil.

Tengo un interés especial en acceder a la información sobre servicios desde archivos, variables de entorno o comandos en la línea de comandos. ¡Estas opciones me parecen las más simples! Como en este caso no necesito usar ninguna biblioteca adicional para comunicarme con Bonjour desde un lenguaje de programación en particular.

No conozco una herramienta que haga esto, pero podría existir.

PD: Haga preguntas si algo no está claro en mi pregunta. Trataré de formular mi pregunta de una manera más clara.

Un poco más de información sobre lo que hará el programa que está escribiendo y en qué idioma lo está escribiendo, facilitaría su ayuda.

Para obtener más información introductoria, intente ambos:

cáliz
fuente
caelyx, agregué la información requerida por usted al final de mi pregunta original.
Roman
caelyx, escribió que Bonjour no asigna direcciones IP: "DHCP (generalmente) se usa para asignar direcciones IP". Pero Bonjour implementa el protocolo ZeroConf y una de las principales tecnologías del protocolo ZeroConf (según la wikipedia) es "Asignación de direcciones de red numéricas para dispositivos en red (configuración automática de dirección local de enlace)".
Roman
En las redes IPv4 sin servidor DHCP / BootP, los hosts se asignarán una dirección 168. *. Bonjour funciona correctamente con esas direcciones. O eso o se refiere a direcciones IPv6 Link-Local.
jdizzle
3

Bonjour no asigna direcciones IP, es un protocolo de descubrimiento, aún necesita direcciones IP DHCP / Estática / Enlace Local (APIPA) para que funcione.

Utiliza DNS multidifusión (mDNS) para descubrir qué hosts están en el mismo dominio de difusión que él mismo y, esencialmente, se convierte en su propio servidor DNS.

Vea Bonjour y Zeroconf para conocer los detalles.

A menos que su aplicación sea para una red doméstica / no administrada, es decir, que carece de un servidor DNS local, simplemente no la necesita.

Jon Rhoades
fuente
¿ZeroConf no asigna direcciones IP?
Gobliins