Comment utiliser Bonjour?

26
  1. Tout d'abord, que fait exactement Bonjour (merci de lire mes suppositions écrites ci-dessous)?
    Ici, j'ai découvert que Bonjour permet la découverte automatique des ordinateurs, des périphériques et des services sur les réseaux IP. Mais je pensais que non seulement "il découvre les périphériques sur le réseau IP", il crée également un réseau IP en attribuant des adresses IP aux périphériques sur lesquels Bonjour s'exécute. Ai-je raison?

  2. Et l'essentiel me manque toujours. Cela fonctionne-t-il de la manière suivante? Je connecte d'abord les appareils (par exemple les ordinateurs portables) physiquement afin qu'ils puissent potentiellement communiquer entre eux. Ensuite, disons, sur certains ordinateurs portables, je fais fonctionner Bonjour, puis, en conséquence, ces ordinateurs portables leur attribuent automatiquement des adresses IP. Ainsi, les ordinateurs portables (sur lesquels Bonjour s'exécute) construisent un réseau IP. Cela fonctionne-t-il de cette façon?

  3. Ou peut-être qu'un ordinateur exécutant Bonjour n'est pas considéré comme un service et qu'il ne se diffuse pas simplement parce que Bonjour s'exécute sur cet ordinateur. Je veux dire que les applications fonctionnant sur les ordinateurs doivent utiliser Bonjour pour se diffuser. Ce sont donc les applications qui se diffusent elles-mêmes (pas les ordinateurs) et cela ne se fait pas automatiquement (l'application doit se diffuser explicitement). Est ce juste?

  4. Comment exactement ma candidature peut-elle se diffuser? Puis-je utiliser la ligne de commande pour enregistrer un service (afin que toutes les applications utilisant Bonjour sachent qu'un nouveau service est apparu)?

  5. De plus, j'aimerais avoir une application qui utilise le réseau IP créé par Bonjour. Pour cela, mon application a besoin de savoir quels appareils / services sont présents sur le réseau. Plus en détail, mon application doit avoir une liste de services. Chaque service de la liste doit avoir un nom, l'adresse IP où il s'exécute et le port utilisé par l'application. Bonjour peut-il fournir ces informations d'une manière ou d'une autre? Si tel est le cas, comment cela fonctionne exactement. Comment mon programme peut-il obtenir ces informations de Bonjour? Mon programme peut-il lire un fichier créé par Bonjour et contenant les informations mentionnées ci-dessus? Puis-je utiliser certaines commandes en ligne de commande pour récupérer ces informations?

  6. J'ai un intérêt particulier à accéder aux informations sur les services à partir de fichiers, de variables d'environnement ou de commandes en ligne de commande. Ces options me semblent être les plus simples! Étant donné que dans ces cas, je n'ai pas besoin d'utiliser de bibliothèques supplémentaires pour communiquer avec Bonjour à partir d'un langage de programmation particulier.

PS Pleas pose des questions si quelque chose n'est pas clair dans ma question. Je vais essayer de formuler ma question de manière plus claire.

PPS J'utilise Windows 7 .

AJOUT: J'ai l'intention d'écrire mes applications en PHP. Chaque ordinateur doit exécuter un serveur Web Apache. Et je veux utiliser Bonjour pour aider les ordinateurs à se découvrir mutuellement (les ordinateurs fonctionnent dans un réseau local).

romain
la source

Réponses:

54
  1. Oui. Stuart Cheshire, qui était le créateur et est le principal mainteneur de Rendezvous / Bonjour chez Apple, qui a également coprésidé le groupe de travail IETF ZeroConf, et a écrit le livre O'Reilly sur Zero Configuration Networking, a décrit Bonjour comme un «trois- tabouret à pattes ”où les jambes sont:

    1. Adressage de liaison locale IPv4 (et IPv6)
    2. Résolution de nom de multidiffusion (mDNS)
    3. Découverte du service DNS (DNS-SD)

    Le groupe de travail IETF ZeroConf et Apple considèrent tous deux l'adressage lien local, en particulier l'adressage lien local IPv4 ( 169.254.0.0/16adresses) comme faisant partie de ZeroConf / Bonjour, même si l'adressage lien local a été livré des années avant les deux autres «jambes du tabouret».

    Notez que, puisque Windows prend déjà en charge l'adressage local par lien automatique, même sans le logiciel Bonjour pour Windows d'Apple, de nombreux utilisateurs de Windows ne pensent pas que l'adressage local par lien IPv4 fasse partie de Bonjour / ZeroConf.

  2. Oui. Les ordinateurs Mac et Windows, par défaut, effectuent l'adressage IPv4 link-local s'ils sont configurés pour DHCP mais qu'aucun serveur DHCP n'est disponible. Les machines Linux et BSD avec Avahi (ou éventuellement d'autres implémentations ZeroConf) installées le feront également.

  3. Si un ordinateur exécute Bonjour, son nom d'hôte est publié sur le LAN via mDNS. Si le nom de votre machine est «Alice», ce sera Alice.localvia mDNS. À partir d'un autre ordinateur (appelons-le «Bob») sur le même LAN (en particulier, sur le même domaine de multidiffusion lien-local), vous devriez pouvoir simplement taper ping Alice.local, et Bob devrait faire une recherche mDNS Alice.localpour découvrir l'adresse IP d'Alice ( es), et envoyez une requête ping à l'une des adresses qu'il récupère.

    Notez, cependant, que Bonjour fait la différence entre les noms d'hôte et les noms de service. Par exemple, si vous avez deux imprimantes USB distinctes, disons «HP» et «Canon», connectées à Alice, et qu'Alice agit comme, disons, un lprserveur d'impression pour les deux, elles peuvent chacune apparaître comme leur propre service , qui correspond à Alice.locall'hôte.

    Leurs noms de service apparaîtront à l'utilisateur comme «HP» et «Canon» sans aucune mention d'Alice. Dans les coulisses, ils seraient connus sous le nom de HP._printer._tcp.localet Canon._printer._tcp.local, et les recherches DNS-SD sur ces noms de service montreraient que ces services sont disponibles Alice.localsur deux ports TCP différents.

    Donc, oui, les applications doivent informer le démon Bonjour (appelé mDNSResponderdans l'implémentation d'Apple) qu'elles ont les services qu'elles souhaitent annoncer. macOS dispose de mécanismes pour gérer automatiquement la publication de services pour les services hérités qui ne sont pas nativement compatibles avec Bonjour. Par exemple, macOS sshdest OpenSSH, qui ne prend pas directement en charge Bonjour, mais macOS s'occupe de la publicité du sshservice via Bonjour afin que vous puissiez uniquement à ssh [email protected]partir d'autres machines sur le LAN.

  4. Sur macOS, il existe un outil de ligne de commande "dns-sd" qui peut enregistrer un service à l'aide de cette syntaxe:

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

    Ainsi, par exemple:

    dns-sd -R MyWebsite _http._tcp local 80
    

    Je ne serais pas surpris s'il est inclus dans Bonjour pour Windows, ou le SDK Bonjour pour Windows, ou si vous pouvez le compiler pour Windows à partir du projet open source mDNSResponder d'Apple . Googler pour dns-sd.exe, je vois une telle chose existe. Je ne suis pas sûr que je téléchargerais juste un binaire pour cela. Au lieu de cela, j'essaierais de l'obtenir à partir d'un des packages mentionnés ci-dessus, ou de le compiler moi-même à partir des sources du projet mDNSResponder.

  5. Vous pouvez également utiliser l' dns-sdoutil de ligne de commande pour rechercher des services et les rechercher. Voici un exemple de recherche d'un service Web local:

    Recherchez des services Web locaux avec -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
    

    Recherchez celle que je veux, "My Cool Web App", avec -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  
    

    Recherchez les adresses IP de MyWebServer.local, avec -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  
    

    Notez dans ces exemples que vous devez Ctrl-Csortir de l' dns-sdoutil. Sinon, il restera ouvert pour toujours, surveillant en permanence le réseau et signalant tout changement dans les résultats de la requête que vous avez émise (comme les serveurs Web qui vont et viennent sur le réseau, pendant que vous êtes assis avec une -Brequête de navigation ouverte). J'ai trouvé que pour cela et pour d'autres raisons, l' dns-sdoutil n'est pas bien adapté pour être appelé à partir d'un script. Vous voudrez peut-être regarder ce que les bibliothèques ZeroConf pour votre langue préférée après tout.

Pour répondre à l'une de vos autres questions, je ne connais aucune implémentation ZeroConf qui vous permet d'effectuer des requêtes et d'obtenir des résultats simplement en lisant / écrivant des fichiers. La plupart des applications qui utilisent Bonjour le font en appelant les API, soit directement (applications C / C ++ / Obj-C / Swift) soit via une bibliothèque spécifique au langage (langages interprétés / de script).

Spiff
la source
Meilleure explication de Bonjour / Zeroconf que j'ai vue. Vous devriez contribuer à l'article de wikipedia :)
Kamil Kisiel
Ceci est assez complet, mais si vous souhaitez développer la façon dont les enregistrements DNS sont utilisés, n'hésitez pas à voler sur serverfault.com/questions/18565/…
andrewtj
4

Tout d'abord, que fait exactement Bonjour (merci de lire mes suppositions écrites ci-dessous)? Ici, j'ai découvert que Bonjour permet la découverte automatique des ordinateurs, des périphériques et des services sur les réseaux IP. Mais je pensais que non seulement "il découvre les périphériques sur le réseau IP", il crée également un réseau IP en attribuant des adresses IP aux périphériques sur lesquels Bonjour s'exécute. Ai-je raison?

Pas assez; comme Jon l'a souligné, DHCP (généralement) est utilisé pour allouer des adresses IP. De la même manière que le DNS ordinaire traduit les noms de domaine en adresses IP, Bonjour est utilisé pour traduire les noms de domaine temporaires (au sein du réseau local) vers les adresses IP qui les fournissent.

Et l'essentiel me manque toujours. Cela fonctionne-t-il de la manière suivante? Je connecte d'abord les appareils (par exemple les ordinateurs portables) physiquement afin qu'ils puissent potentiellement communiquer entre eux. Ensuite, disons, sur certains ordinateurs portables, je fais fonctionner Bonjour, puis, en conséquence, ces ordinateurs portables leur attribuent automatiquement des adresses IP. Ainsi, les ordinateurs portables (sur lesquels Bonjour s'exécute) créent un réseau IP. Cela fonctionne-t-il de cette façon?

Nan; les ordinateurs portables obtiennent généralement leurs adresses IP à partir d'un serveur DHCP local. Bonjour les aide simplement à déterminer quels services chacun peut fournir aux autres.

Ou peut-être qu'un ordinateur exécutant Bonjour n'est pas considéré comme un service et qu'il ne se diffuse pas simplement parce que Bonjour s'exécute sur cet ordinateur. Je veux dire que les applications exécutées sur les ordinateurs doivent utiliser Bonjour pour se diffuser. Ce sont donc les applications qui se diffusent elles-mêmes (pas les ordinateurs) et cela ne se fait pas automatiquement (l'application doit se diffuser explicitement). Est ce juste?

Oui - généralement, votre application devra annoncer explicitement son existence. Cela peut souvent être fait en utilisant des bibliothèques fournies par le système (courantes sur OS X) ou des bibliothèques personnalisées (par exemple Net :: Bonjour de perl).

Comment exactement ma candidature peut-elle se diffuser? Puis-je utiliser la ligne de commande pour enregistrer un service (pour que toutes les applications utilisant Bonjour sachent qu'un nouveau service est apparu)

Je ne connais pas d'outil de ligne de commande qui le fasse, mais de nombreux langages de programmation majeurs ont des bibliothèques disponibles pour ce faire.

De plus, j'aimerais avoir une application qui utilise le réseau IP créé par Bonjour. Pour cela, mon application a besoin de savoir quels appareils / services sont présents sur le réseau. Plus en détail, mon application doit avoir une liste de services. Chaque service de la liste doit avoir un nom, l'adresse IP où il s'exécute et le port utilisé par l'application. Bonjour peut-il fournir ces informations d'une manière ou d'une autre?

La plupart des bibliothèques Bonjour devraient pouvoir le faire pour vous; voir le premier exemple à http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

Si tel est le cas, comment cela fonctionne exactement. Comment mon programme peut-il obtenir ces informations de Bonjour? Mon programme peut-il lire un fichier créé par Bonjour et contenant les informations mentionnées ci-dessus? Puis-je utiliser certaines commandes en ligne de commande pour récupérer ces informations?

À l'aide des bibliothèques appropriées, le programme utilise le protocole Bonjour pour demander à tous les autres ordinateurs de votre réseau local de lui indiquer les services dont ils disposent. Cette bibliothèque analysera ensuite les réponses et vous les présentera dans un format plus utile.

J'ai un intérêt particulier à accéder aux informations sur les services à partir de fichiers, de variables d'environnement ou de commandes en ligne de commande. Ces options me semblent être les plus simples! Étant donné que dans ces cas, je n'ai pas besoin d'utiliser de bibliothèques supplémentaires pour communiquer avec Bonjour à partir d'un langage de programmation particulier.

Je ne suis pas au courant d'un outil qui fait cela, mais il pourrait exister.

PS Pleas pose des questions si quelque chose n'est pas clair dans ma question. Je vais essayer de formuler ma question de manière plus claire.

De plus amples informations sur ce que fera le programme que vous écrivez, et sur la langue dans laquelle vous l'écrivez, vous faciliteraient la tâche.

Pour plus d'informations d'introduction, essayez les deux:

caelyx
la source
caelyx, j'ai ajouté les informations requises par vous à la fin de ma question d'origine.
Roman
caelyx, vous avez écrit que Bonjour n'attribue pas d'adresses IP: "DHCP (généralement) est utilisé pour allouer les adresses IP". Mais Bonjour implémente le protocole ZeroConf et l'une des technologies de base du protocole ZeroConf (selon le wikipedia) est "Attribution d'adresses réseau numériques pour les appareils en réseau (autoconfiguration d'adresse de liaison locale)".
Roman
Sur les réseaux IPv4 sans serveur DHCP / BootP, les hôtes se verront attribuer une adresse 168. *. Bonjour fonctionne correctement avec ces adresses. Soit cela, soit il fait référence aux adresses IPv6 Link-Local.
jdizzle
3

Bonjour n'attribue pas d'adresses IP - c'est un protocole de découverte - vous avez toujours besoin d'adresses IP DHCP / Static / Link-Local (APIPA) pour que cela fonctionne.

Il utilise le DNS multicast (mDNS) pour découvrir quels hôtes se trouvent sur le même domaine de diffusion que lui et, essentiellement, il devient son propre serveur DNS.

Voir Bonjour et Zeroconf pour la liste déroulante.

Sauf si votre application est destinée à un réseau domestique / non géré, c'est-à-dire sans un serveur DNS local, vous n'en avez tout simplement pas besoin.

Jon Rhoades
la source
ZeroConf n'attribue pas d'adresses IP?
Gobliins