Jak korzystać z Bonjour?

26
  1. Po pierwsze, co dokładnie robi Bonjour (prośby czytają moje domysły napisane poniżej)?
    Tutaj dowiedziałem się, że Bonjour umożliwia automatyczne wykrywanie komputerów, urządzeń i usług w sieciach IP. Pomyślałem jednak, że nie tylko „odkrywa urządzenia w sieci IP”, ale także tworzy sieć IP, przypisując adresy IP urządzeniom, na których działa Bonjour. Czy mam rację?

  2. I wciąż tęsknię za istotą. Czy to działa w następujący sposób? Najpierw podłączam urządzenia (na przykład laptopy) fizycznie, aby potencjalnie mogły się ze sobą komunikować. Następnie, powiedzmy, na niektórych laptopach mam uruchomioną Bonjour, a następnie, w konsekwencji, te laptopy przydzielają im adresy IP w sposób automatyczny. Tak więc laptopy (gdzie działa Bonjour) budują sieć IP. Czy to działa w ten sposób?

  3. Lub może być komputerem, na którym działa Bonjour, nie jest uważany za usługę i sam nie nadaje się tylko dlatego, że Bonjour działa na tym komputerze. Mam na myśli, że aplikacje działające na komputerach muszą używać Bonjour do samodzielnego nadawania. Tak więc to aplikacje, które same się nadają (nie komputery) i nie odbywa się to automatycznie (aplikacja musi nadawać się jawnie). Czy to jest poprawne?

  4. Jak dokładnie moja aplikacja może sama się nadawać? Czy mogę użyć wiersza polecenia do zarejestrowania usługi (aby wszystkie aplikacje korzystające z Bonjour wiedziały, że pojawiła się nowa usługa)?

  5. Ponadto chciałbym mieć aplikację, która korzysta z sieci IP stworzonej przez Bonjour. W tym celu moja aplikacja musi wiedzieć, które urządzenia / usługi są obecne w sieci. Bardziej szczegółowo, moja aplikacja musi mieć listę usług. Każda usługa na liście powinna mieć nazwę, adres IP, na którym jest uruchomiona, oraz port używany przez aplikację. Czy Bonjour może przekazać te informacje w jakiś sposób? Jeśli tak, to jak dokładnie to działa. W jaki sposób mój program może uzyskać te informacje od Bonjour? Czy mój program może odczytać plik utworzony przez Bonjour i zawierający wyżej wymienione informacje? Czy mogę użyć niektórych poleceń w wierszu poleceń, aby pobrać te informacje?

  6. Szczególnie interesuje mnie dostęp do informacji o usługach z plików, zmiennych środowiskowych lub poleceń w wierszu poleceń. Te opcje wydają mi się najprostsze! Ponieważ w takim przypadku nie muszę używać żadnych dodatkowych bibliotek do komunikacji z Bonjour z określonego języka programowania.

PS Pleas zadaje pytania, jeśli coś nie jest jasne w moim pytaniu. Postaram się sformułować moje pytanie w bardziej przejrzysty sposób.

PPS Używam Windows 7 .

DODANO: Planuję pisać moje aplikacje w języku PHP. Każdy komputer powinien obsługiwać serwer WWW Apache. I chcę użyć Bonjour, aby pomóc komputerowi odkryć się nawzajem (komputery pracują w sieci lokalnej).

rzymski
źródło

Odpowiedzi:

54
  1. Tak. Stuart Cheshire, który był twórcą i głównym opiekunem Rendezvous / Bonjour w Apple, który współprzewodniczył grupie roboczej IETF ZeroConf i napisał książkę O'Reilly o Zero Configuration Networking, opisał Bonjour jako „trzy- stołek z nogami ”, gdzie znajdują się nogi:

    1. Adresowanie lokalne dla łącza IPv4 (i IPv6)
    2. Rozpoznawanie nazw multiemisji (mDNS)
    3. Wykrywanie usług DNS (DNS-SD)

    Zarówno grupa robocza IETF ZeroConf, jak i Apple uważają adresowanie lokalne za pomocą łącza, szczególnie adresowanie lokalne za pomocą łącza IPv4 ( 169.254.0.0/16adresy), jako część ZeroConf / Bonjour, mimo że adresowanie lokalne za pośrednictwem łącza zostało wysłane lata przed pozostałymi dwoma „nogami stołka”.

    Należy pamiętać, że ponieważ system Windows obsługuje już automatyczne adresowanie lokalne dla łącza, nawet bez zainstalowanego oprogramowania Apple Bonjour dla Windows, wielu użytkowników systemu Windows nie uważa adresowania lokalnego łącza IPv4 za część Bonjour / ZeroConf.

  2. Tak. Komputery Mac i komputery z systemem Windows domyślnie wykonują adresowanie lokalne dla łącza IPv4, jeśli są skonfigurowane dla DHCP, ale serwer DHCP nie jest dostępny. Robią to również maszyny Linux i BSD z zainstalowanym Avahi (lub ewentualnie innymi implementacjami ZeroConf).

  3. Jeśli na komputerze działa Bonjour, jego nazwa hosta jest publikowana w sieci LAN za pośrednictwem mDNS. Jeśli nazwa twojego komputera to „Alice”, będzie to Alice.localprzez mDNS. Z innego komputera (nazwijmy go „Bob”) w tej samej sieci LAN (konkretnie w tej samej domenie multiemisji z lokalnymi linkami), powinieneś być w stanie po prostu pisać ping Alice.local, a Bob powinien wykonać mDNS, Alice.localaby znaleźć adres IP Alicji ( es) i ping (jeden z) adresów, które odzyskuje.

    Należy jednak pamiętać, że Bonjour rozróżnia nazwy hostów i nazwy usług. Na przykład, jeśli masz dwie oddzielne drukarki USB, powiedzmy „HP” i „Canon”, podłączone do Alice, a Alice działa, powiedzmy, jako lprserwer druku dla obu z nich, każda z nich może pojawić się jako osobna usługa , który odwzorowuje z powrotem Alice.localjako host.

    Nazwy ich usług będą wyświetlane użytkownikowi jako „HP” i „Canon” bez żadnej wzmianki o Alice. Za kulisami będą one znane jako HP._printer._tcp.locali Canon._printer._tcp.local, a wyszukiwania DNS-SD tych nazw usług pokazałyby, że usługi te są dostępne Alice.localna dwóch różnych portach TCP.

    Tak, aplikacje muszą powiadomić demona Bonjour (wywoływanego mDNSResponderw implementacji Apple'a), że mają usługi, które chcą reklamować. macOS ma mechanizmy do automatycznej obsługi reklam usług dla starszych usług, które nie są natywnie świadome Bonjour. Na przykład macOS sshdto OpenSSH, który nie obsługuje Bonjour bezpośrednio, ale macOS zajmuje się reklamą sshusługi za pośrednictwem Bonjour, dzięki czemu można tylko ssh [email protected]z innych komputerów w sieci LAN.

  4. W systemie macOS istnieje narzędzie wiersza polecenia „dns-sd”, które może zarejestrować usługę przy użyciu tej składni:

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

    Na przykład:

    dns-sd -R MyWebsite _http._tcp local 80
    

    Nie zdziwiłbym się, gdyby został dołączony do Bonjour dla Windows lub Bonjour SDK dla Windows lub jeśli możesz go skompilować dla Windows z projektu open source firmy Apple mDNSResponder . Googling dns-sd.exe, widzę, że coś takiego istnieje. Nie jestem pewien, czy po prostu pobrałbym plik binarny. Zamiast tego spróbowałbym pobrać go z jednego z wyżej wymienionych pakietów lub sam skompilować ze źródeł projektu mDNSResponder.

  5. Możesz także użyć dns-sdnarzędzia wiersza polecenia do przeglądania usług i ich wyszukiwania. Oto przykład wyszukiwania lokalnej usługi internetowej:

    Przeglądaj lokalne usługi internetowe za pomocą -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
    

    Znajdź tę, którą chcę, „My Cool Web App”, z -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  
    

    Zapytaj o adresy IP MyWebServer.local, używając -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  
    

    Zauważ w tych przykładach, że musisz Ctrl-Cwyjść z dns-sdnarzędzia. W przeciwnym razie pozostanie otwarty na zawsze, stale obserwując sieć i zgłaszając wszelkie zmiany w wynikach wysłanego zapytania (np. Serwery internetowe przychodzące i wychodzące z sieci, gdy siedzisz przy -Botwartym zapytaniu do przeglądania). Odkryłem, że z tego i innych powodów dns-sdnarzędzie nie nadaje się do wywoływania ze skryptu. W końcu warto przyjrzeć się, jakie biblioteki ZeroConf dla preferowanego języka.

Aby odpowiedzieć na jedno z pozostałych pytań, nie jestem świadomy żadnej implementacji ZeroConf, która pozwala na wykonywanie zapytań i uzyskiwanie wyników tylko poprzez czytanie / zapisywanie plików. Większość aplikacji korzystających z Bonjour robi to, wywołując interfejsy API, bezpośrednio (aplikacje C / C ++ / Obj-C / Swift) lub poprzez bibliotekę specyficzną dla języka (języki interpretowane / skryptowe).

Spiff
źródło
Najlepsze wyjaśnienie Bonjour / Zeroconf, jakie widziałem. Powinieneś przyczynić się do artykułu w Wikipedii :)
Kamil Kisiel,
Jest to dość kompletne, ale jeśli chcesz rozwinąć sposób używania rekordów DNS, możesz ukraść z serverfault.com/questions/18565/…
andrewtj
4

Po pierwsze, co dokładnie robi Bonjour (prośby czytają moje domysły napisane poniżej)? Tutaj dowiedziałem się, że Bonjour umożliwia automatyczne wykrywanie komputerów, urządzeń i usług w sieciach IP. Pomyślałem jednak, że nie tylko „odkrywa urządzenia w sieci IP”, ale także tworzy sieć IP, przypisując adresy IP urządzeniom, na których działa Bonjour. Czy mam rację?

Nie do końca; jak zauważył Jon, DHCP (zwykle) służy do przydzielania adresów IP. W podobny sposób, w jaki zwykły DNS tłumaczy nazwy domen na adresy IP, Bonjour służy do tłumaczenia tymczasowych nazw domen (w sieci lokalnej) na adresy IP, które je udostępniają.

I wciąż tęsknię za istotą. Czy to działa w następujący sposób? Najpierw podłączam urządzenia (na przykład laptopy) fizycznie, aby potencjalnie mogły się ze sobą komunikować. Następnie, powiedzmy, na niektórych laptopach mam uruchomioną Bonjour, a następnie, w konsekwencji, te laptopy przydzielają im adresy IP w sposób automatyczny. Tak więc laptopy (gdzie działa Bonjour) budują sieć IP. Czy to działa w ten sposób?

Nie; laptopy najczęściej uzyskują adresy IP z lokalnego serwera DHCP. Bonjour pomaga im po prostu ustalić, jakie usługi każdy może świadczyć innym.

Lub może być komputerem, na którym działa Bonjour, nie jest uważany za usługę i sam nie nadaje się tylko dlatego, że Bonjour działa na tym komputerze. Mam na myśli, że aplikacje działające na komputerach muszą używać Bonjour do samodzielnego nadawania. Tak więc, to aplikacje, które same się nadają (nie komputery) i nie odbywa się to automatycznie (aplikacja musi nadawać się jawnie). Czy to jest poprawne?

Tak - generalnie aplikacja będzie musiała jawnie zareklamować swoje istnienie. Często można to zrobić za pomocą bibliotek systemowych (typowych dla OS X) lub bibliotek niestandardowych (np. Net :: Bonjour).

Jak dokładnie moja aplikacja może sama się nadawać? Czy mogę użyć wiersza polecenia do zarejestrowania usługi (aby wszystkie aplikacje korzystające z Bonjour wiedziały, że pojawiła się nowa usługa)

Nie znam narzędzia wiersza polecenia, które to robi, ale wiele głównych języków programowania ma do tego celu biblioteki.

Ponadto chciałbym mieć aplikację, która korzysta z sieci IP stworzonej przez Bonjour. W tym celu moja aplikacja musi wiedzieć, które urządzenia / usługi są obecne w sieci. Bardziej szczegółowo, moja aplikacja musi mieć listę usług. Każda usługa na liście powinna mieć nazwę, adres IP, na którym jest uruchomiona, oraz port używany przez aplikację. Czy Bonjour może przekazać te informacje w jakiś sposób?

Większość bibliotek Bonjour powinna to zrobić za Ciebie; zobacz pierwszy przykład na stronie http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

Jeśli tak, to jak dokładnie to działa. W jaki sposób mój program może uzyskać te informacje od Bonjour? Czy mój program może odczytać plik utworzony przez Bonjour i zawierający wyżej wymienione informacje? Czy mogę użyć niektórych poleceń w wierszu poleceń, aby pobrać te informacje?

Korzystając z odpowiednich bibliotek, program korzysta z protokołu Bonjour, aby zapytać wszystkie inne komputery w sieci lokalnej o informację, jakie usługi są dostępne. Ta biblioteka następnie przeanalizuje odpowiedzi i przedstawi je w bardziej przydatnym formacie.

Szczególnie interesuje mnie dostęp do informacji o usługach z plików, zmiennych środowiskowych lub poleceń w wierszu poleceń. Te opcje wydają mi się najprostsze! Ponieważ w takim przypadku nie muszę używać żadnych dodatkowych bibliotek do komunikacji z Bonjour z określonego języka programowania.

Nie znam narzędzia, które to robi, ale może istnieć.

PS Pleas zadaje pytania, jeśli coś nie jest jasne w moim pytaniu. Postaram się sformułować moje pytanie w bardziej przejrzysty sposób.

Więcej informacji o tym, co zrobi program, który piszesz, oraz w jakim języku piszesz, ułatwi ci pomoc.

Aby uzyskać więcej informacji wprowadzających, wypróbuj oba:

caelyx
źródło
caelyx, dodałem wymagane przez ciebie informacje na końcu mojego pierwotnego pytania.
Rzym.
caelyx, napisałeś, że Bonjour nie przypisuje adresów IP: „DHCP (zwykle) służy do przydzielania adresów IP”. Ale Bonjour implementuje protokół ZeroConf, a jedną z podstawowych technologii protokołu ZeroConf (zgodnie z wikipedią) jest „Przypisanie numerycznych adresów sieciowych dla urządzeń sieciowych (autokonfiguracja adresu lokalnego)”.
Rzym.
W sieciach IPv4 bez serwera DHCP / BootP hosty przypiszą sobie adresy 168. *. Bonjour działa poprawnie z tymi adresami. Albo to, albo odnosi się do adresów lokalnych adresów IPv6.
jdizzle
3

Bonjour nie przypisuje adresów IP - jest to protokół wykrywania - nadal potrzebujesz adresów IP DHCP / Static / Link-Local (APIPA), aby działał.

Używa multiemisji DNS (mDNS), aby dowiedzieć się, które hosty znajdują się w tej samej domenie rozgłoszeniowej, co ona sama, i zasadniczo staje się własnym serwerem DNS.

Zobacz Bonjour i Zeroconf, aby dowiedzieć się więcej.

O ile twoja aplikacja nie jest przeznaczona do sieci domowej / niezarządzanej, to znaczy bez lokalnego serwera DNS, po prostu go nie potrzebujesz.

Jon Rhoades
źródło
ZeroConf nie przypisuje adresów IP?
Gobliiny