Wie benutzt man Bonjour?


26
  1. Was genau macht Bonjour?
    Hier fand ich heraus, dass Bonjour die automatische Erkennung von Computern, Geräten und Diensten in IP-Netzwerken ermöglicht. Aber ich dachte, dass es nicht nur "Geräte im IP-Netzwerk erkennt", sondern auch ein IP-Netzwerk erstellt, indem es Geräten, auf denen Bonjour ausgeführt wird, IP-Adressen zuweist. Habe ich recht?

  2. Und ich vermisse immer noch das Wesentliche. Funktioniert es wie folgt? Zuerst verbinde ich Geräte (zum Beispiel Laptops) physisch, damit sie möglicherweise miteinander kommunizieren können. Nehmen wir an, auf einigen Laptops läuft Bonjour, und in der Folge weisen diese Laptops sich selbst automatisch IP-Adressen zu. Laptops (auf denen Bonjour ausgeführt wird) bauen also ein IP-Netzwerk auf. Funktioniert das so?

  3. Möglicherweise wird ein Computer, auf dem Bonjour ausgeführt wird, nicht als Dienst angesehen und sendet sich nicht selbst, nur weil Bonjour auf diesem Computer ausgeführt wird. Ich meine, dass die Anwendungen, die auf den Computern ausgeführt werden, Bonjour verwenden müssen, um sich selbst zu verbreiten. Es sind also Anwendungen, die sich selbst senden (keine Computer), und dies erfolgt nicht automatisch (die Anwendung muss sich selbst explizit senden). Ist es richtig?

  4. Wie genau kann meine Anwendung sich selbst übertragen? Kann ich einen Dienst über die Befehlszeile registrieren (damit alle Anwendungen, die Bonjour verwenden, wissen, dass ein neuer Dienst angezeigt wurde)?

  5. Außerdem hätte ich gerne eine Anwendung, die das von Bonjour erstellte IP-Netzwerk verwendet. Zu diesem Zweck muss meine Anwendung wissen, welche Geräte / Dienste im Netzwerk vorhanden sind. Im Einzelnen muss meine Anwendung eine Liste von Diensten enthalten. Jeder Dienst in der Liste sollte einen Namen haben, die IP-Adresse, unter der er ausgeführt wird, und den Port, der von der Anwendung verwendet wird. Kann Bonjour diese Informationen auf irgendeine Weise bereitstellen? Wenn ja, wie genau funktioniert das? Wie kann mein Programm diese Informationen von Bonjour erhalten? Kann mein Programm Dateien lesen, die von Bonjour erstellt wurden und die oben genannten Informationen enthalten? Kann ich einige Befehle in der Befehlszeile verwenden, um diese Informationen abzurufen?

  6. Ich habe ein besonderes Interesse daran, auf Informationen zu Diensten aus Dateien, Umgebungsvariablen oder Befehlen in der Befehlszeile zuzugreifen. Diese Optionen scheinen mir die einfachsten zu sein! Da ich in diesem Fall keine zusätzlichen Bibliotheken verwenden muss, um mit Bonjour aus einer bestimmten Programmiersprache heraus zu kommunizieren.

PS Bitte stellen Sie Fragen, wenn etwas in meiner Frage nicht klar ist. Ich werde versuchen, meine Frage klarer zu formulieren.

PPS Ich benutze Windows 7 .

HINZUGEFÜGT: Ich plane, meine Anwendungen in PHP zu schreiben. Auf jedem Computer sollte ein Apache-Webserver ausgeführt werden. Und ich möchte Bonjour verwenden, um Computer bei der gegenseitigen Erkennung zu unterstützen (Computer arbeiten in einem lokalen Netzwerk).

Antworten:


54
  1. Ja. Stuart Cheshire, der Erfinder und Hauptbetreuer von Rendezvous / Bonjour bei Apple, der auch den Vorsitz der IETF ZeroConf-Arbeitsgruppe innehatte und das O'Reilly-Buch über Zero Configuration Networking schrieb, beschrieb Bonjour als Hocker mit Beinen “, wo die Beine sind:

    1. IPv4- (und IPv6-) Link-Local-Adressierung
    2. Multicast-Namensauflösung (mDNS)
    3. DNS-Dienstermittlung (DNS-SD)

    Die IETF ZeroConf-Arbeitsgruppe und Apple betrachten beide die linklokale Adressierung, insbesondere die IPv4- 169.254.0.0/16linklokale Adressierung ( Adressen), als Teil von ZeroConf / Bonjour, obwohl die linklokale Adressierung Jahre vor den beiden anderen „Beinen des Schemels“ ausgeliefert wurde.

    Beachten Sie, dass Windows die automatische Link-Local-Adressierung bereits unterstützt, auch wenn die Bonjour für Windows-Software von Apple nicht installiert ist. Daher denken viele Windows-Benutzer nicht, dass die IPv4-Link-Local-Adressierung Teil von Bonjour / ZeroConf ist.

  2. Ja. Macs und Windows-Computer führen standardmäßig eine IPv4-Link-Local-Adressierung durch, wenn sie für DHCP konfiguriert sind, aber kein DHCP-Server verfügbar ist. Linux- und BSD-Maschinen mit Avahi (oder möglicherweise anderen ZeroConf-Implementierungen) werden dies ebenfalls tun.

  3. Wenn auf einem Computer Bonjour ausgeführt wird, wird der Hostname über mDNS im LAN veröffentlicht. Lautet der Name Ihres Geräts „Alice“, erfolgt dies Alice.localüber mDNS. Von einem anderen Computer (nennen wir ihn „Bob“) im selben LAN (insbesondere in derselben verbindungslokalen Multicast-Domäne) sollten Sie in der Lage sein, einfach zu tippen ping Alice.local, und Bob sollte eine mDNS-Suche durchführen Alice.local, um die IP-Adresse von Alice zu ermitteln ( es) und pingen Sie eine der Adressen, die es zurückbekommt.

    Beachten Sie jedoch, dass Bonjour zwischen Hostnamen und Dienstnamen unterscheidet. Wenn Sie beispielsweise zwei separate USB-Drucker haben, sagen wir „HP“ und „Canon“, die mit Alice verbunden sind, und Alice als lprDruckserver für beide fungiert, kann jeder als eigener Dienst angezeigt werden , das Alice.localals Host zurückbelegt wird .

    Die Dienstnamen werden dem Benutzer als "HP" und "Canon" angezeigt, ohne dass Alice erwähnt wird. Hinter den Kulissen werden sie als HP._printer._tcp.localund bezeichnet Canon._printer._tcp.local, und DNS-SD-Suchvorgänge für diese Dienstnamen zeigen an, dass diese Dienste Alice.localan zwei verschiedenen TCP-Ports verfügbar sind .

    Ja, Anwendungen müssen dem Bonjour-Daemon ( mDNSResponderin Apples Implementierung aufgerufen ) mitteilen, dass sie über Dienste verfügen, für die sie Werbung schalten möchten. macOS verfügt über Mechanismen zur automatischen Verarbeitung von Dienstwerbung für Legacy-Dienste, die von Haus aus Bonjour nicht kennen. Zum Beispiel ist macOS sshdOpenSSH, das Bonjour nicht direkt unterstützt, aber macOS kümmert sich darum, den sshDienst über Bonjour zu bewerben, so dass Sie nur ssh username@Alice.localvon anderen Rechnern im LAN aus arbeiten können.

  4. Unter macOS gibt es ein Befehlszeilentool "dns-sd", mit dem ein Dienst mithilfe der folgenden Syntax registriert werden kann:

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

    Also zum Beispiel:

    dns-sd -R MyWebsite _http._tcp local 80
    

    Es würde mich nicht wundern, wenn es in Bonjour für Windows oder im Bonjour SDK für Windows enthalten ist oder wenn Sie es aus Apples mDNSResponder- Open-Source-Projekt für Windows kompilieren können . Googeln nach dns-sd.exe, ich sehe so etwas existiert. Ich bin mir nicht sicher, ob ich einfach eine Binärdatei dafür herunterladen würde. Stattdessen würde ich versuchen, es aus einem der oben genannten Pakete zu erhalten, oder es selbst aus den Projektquellen von mDNSResponder kompilieren.

  5. Sie können auch das dns-sdBefehlszeilentool verwenden, um nach Diensten zu suchen und diese nachzuschlagen. Hier ist ein Beispiel für die Suche nach einem lokalen Webdienst:

    Suchen Sie nach lokalen Webdiensten mit -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
    

    Suchen Sie die gewünschte "My Cool Web App" mit -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  
    

    Fragen Sie die IP-Adressen für MyWebServer.local ab mit -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  
    

    Beachten Sie in diesen Beispielen, dass Sie Ctrl-Cdas dns-sdTool verlassen müssen. Andernfalls bleibt es für immer geöffnet, überwacht kontinuierlich das Netzwerk und meldet alle Änderungen in den Ergebnissen der von Ihnen ausgegebenen Abfrage (z. B. Webserver, die im Netzwerk ein- und ausgehen, während Sie mit einer -Bgeöffneten Suchabfrage sitzen ). Ich habe festgestellt, dass das dns-sdTool aus diesem und anderen Gründen nicht gut dafür geeignet ist, aus einem Skript heraus aufgerufen zu werden. Vielleicht möchten Sie doch einmal nachsehen, welche ZeroConf-Bibliotheken für Ihre bevorzugte Sprache geeignet sind.

Um eine Ihrer anderen Fragen zu beantworten, ist mir keine ZeroConf-Implementierung bekannt, mit der Sie Abfragen durchführen und Ergebnisse erzielen können, indem Sie Dateien lesen / schreiben. Die meisten Apps, die Bonjour verwenden, rufen die APIs entweder direkt (C / C ++ / Obj-C / Swift-Apps) oder über eine für die Sprache spezifische Bibliothek (interpretierte / Skriptsprachen) auf.


Beste Erklärung von Bonjour / Zeroconf, die ich gesehen habe. Sie sollten einiges zum Wikipedia-Artikel beitragen :)
Kamil Kisiel

Dies ist ziemlich vollständig, aber wenn Sie die Verwendung von DNS-Einträgen erweitern möchten,
andrewtj,

4

Was genau macht Bonjour? Hier fand ich heraus, dass Bonjour die automatische Erkennung von Computern, Geräten und Diensten in IP-Netzwerken ermöglicht. Aber ich dachte, dass es nicht nur "Geräte im IP-Netzwerk erkennt", sondern auch ein IP-Netzwerk erstellt, indem es Geräten, auf denen Bonjour ausgeführt wird, IP-Adressen zuweist. Habe ich recht?

Nicht ganz; Wie Jon betonte, wird DHCP (normalerweise) verwendet, um IP-Adressen zuzuweisen. Genauso wie gewöhnliches DNS Domainnamen in IP-Adressen übersetzt, wird Bonjour verwendet, um temporäre Domainnamen (innerhalb des lokalen Netzwerks) in die IP-Adressen zu übersetzen, die sie bereitstellen.

Und ich vermisse immer noch das Wesentliche. Funktioniert es wie folgt? Zuerst verbinde ich Geräte (zum Beispiel Laptops) physisch, damit sie möglicherweise miteinander kommunizieren können. Nehmen wir an, auf einigen Laptops läuft Bonjour, und in der Folge weisen diese Laptops sich selbst automatisch IP-Adressen zu. Laptops (auf denen Bonjour ausgeführt wird) bauen also ein IP-Netzwerk auf. Funktioniert das so?

Nee; Meistens beziehen die Laptops ihre IP-Adressen von einem lokalen DHCP-Server. Bonjour hilft ihnen nur dabei, herauszufinden, welche Dienstleistungen jeder für den anderen erbringen kann.

Möglicherweise wird ein Computer, auf dem Bonjour ausgeführt wird, nicht als Dienst angesehen und sendet sich nicht selbst, nur weil Bonjour auf diesem Computer ausgeführt wird. Ich meine, dass die Anwendungen, die auf den Computern laufen, Bonjour verwenden müssen, um sich selbst zu verbreiten. Es sind also Anwendungen, die sich selbst senden (keine Computer), und dies erfolgt nicht automatisch (die Anwendung muss sich selbst explizit senden). Ist es richtig?

Ja, in der Regel muss Ihre Anwendung explizit für ihre Existenz werben. Dies kann häufig mithilfe von vom System bereitgestellten Bibliotheken (häufig unter OS X) oder benutzerdefinierten Bibliotheken (z. B. Net :: Bonjour von Perl) erfolgen.

Wie genau kann meine Anwendung sich selbst übertragen? Kann ich einen Dienst über die Befehlszeile registrieren (damit alle Anwendungen, die Bonjour verwenden, wissen, dass ein neuer Dienst angezeigt wurde)?

Mir ist kein Befehlszeilentool bekannt, das dies ausführt, aber in vielen wichtigen Programmiersprachen stehen hierfür Bibliotheken zur Verfügung.

Außerdem hätte ich gerne eine Anwendung, die das von Bonjour erstellte IP-Netzwerk verwendet. Zu diesem Zweck muss meine Anwendung wissen, welche Geräte / Dienste im Netzwerk vorhanden sind. Im Einzelnen muss meine Anwendung eine Liste von Diensten enthalten. Jeder Dienst in der Liste sollte einen Namen haben, die IP-Adresse, unter der er ausgeführt wird, und den Port, der von der Anwendung verwendet wird. Kann Bonjour diese Informationen auf irgendeine Weise bereitstellen?

Die meisten Bonjour-Bibliotheken sollten dies für Sie tun können. Das erste Beispiel finden Sie unter http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

Wenn ja, wie genau funktioniert das? Wie kann mein Programm diese Informationen von Bonjour erhalten? Kann mein Programm Dateien lesen, die von Bonjour erstellt wurden und die oben genannten Informationen enthalten? Kann ich einige Befehle in der Befehlszeile verwenden, um diese Informationen abzurufen?

Unter Verwendung der entsprechenden Bibliotheken fragt das Programm mithilfe des Bonjour-Protokolls alle anderen Computer in Ihrem lokalen Netzwerk, welche Dienste verfügbar sind. Diese Bibliothek analysiert dann die Antworten und präsentiert sie Ihnen in einem nützlicheren Format.

Ich habe ein besonderes Interesse daran, auf Informationen zu Diensten aus Dateien, Umgebungsvariablen oder Befehlen in der Befehlszeile zuzugreifen. Diese Optionen scheinen mir die einfachsten zu sein! Da ich in diesem Fall keine zusätzlichen Bibliotheken verwenden muss, um mit Bonjour aus einer bestimmten Programmiersprache heraus zu kommunizieren.

Mir ist kein Tool bekannt, das dies tut, aber es könnte existieren.

PS Bitte stellen Sie Fragen, wenn etwas in meiner Frage nicht klar ist. Ich werde versuchen, meine Frage klarer zu formulieren.

Weitere Informationen darüber, was das von Ihnen geschriebene Programm bewirkt und in welcher Sprache Sie es schreiben, erleichtern die Hilfe.

Versuchen Sie für weitere einführende Informationen beide:


caelyx, ich habe die von dir geforderten Informationen am Ende meiner ursprünglichen Frage hinzugefügt.
Roman

caelyx, du hast geschrieben, dass Bonjour keine IP-Adressen zuweist: "DHCP wird (normalerweise) verwendet, um IP-Adressen zuzuweisen". Bonjour implementiert jedoch das ZeroConf-Protokoll und eine der Kerntechnologien des ZeroConf-Protokolls (laut Wikipedia) ist die "Zuweisung numerischer Netzwerkadressen für vernetzte Geräte (link-local address autoconfiguration)".
Roman

In IPv4-Netzwerken ohne DHCP / BootP-Server weisen sich Hosts selbst 168. * -Adressen zu. Bonjour arbeitet korrekt mit diesen Adressen. Entweder das oder es bezieht sich auf IPv6 Link-Local-Adressen.
Jdizzle

3

Bonjour weist keine IP-Adressen zu - es ist ein Erkennungsprotokoll - Sie benötigen weiterhin DHCP / Static / Link-Local (APIPA) -IP-Adressen, damit dies funktioniert.

Es verwendet Multicast-DNS (mDNS), um herauszufinden, welche Hosts sich in derselben Broadcast-Domäne befinden, und wird im Wesentlichen zu einem eigenen DNS-Server.

Weitere Informationen finden Sie unter Bonjour & Zeroconf .

Wenn Ihre Anwendung nicht für ein Heimnetzwerk oder ein nicht verwaltetes Netzwerk bestimmt ist, dh wenn kein lokaler DNS-Server vorhanden ist, benötigen Sie ihn einfach nicht.


ZeroConf weist keine IP-Adressen zu?
Gobliins
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.