Как использовать Bonjour?

  1. Во-первых, что конкретно делает Bonjour (пожалуйста, прочитайте мои догадки, написанные ниже)?
    Здесь я обнаружил, что Bonjour позволяет автоматически обнаруживать компьютеры, устройства и службы в IP-сетях. Но я подумал, что он не только "обнаруживает устройства в IP-сети", но и создает IP-сеть, назначая IP-адреса устройствам, на которых работает Bonjour. Я прав?

  2. И я до сих пор скучаю по сути. Это работает следующим образом? Сначала я физически подключаю устройства (например, ноутбуки), чтобы они потенциально могли общаться друг с другом. Затем, скажем, на некоторых ноутбуках у меня запущен Bonjour, и, как следствие, эти ноутбуки автоматически присваивают им IP-адреса. Итак, ноутбуки (где работает Bonjour) создают IP-сеть. Это работает таким образом?

  3. Или, может быть, компьютер под управлением Bonjour не считается службой и не транслируется сам по себе только потому, что Bonjour работает на этом компьютере. Я имею в виду, что приложения, работающие на компьютерах, должны использовать Bonjour для прямой трансляции. Таким образом, это приложения, которые транслируют себя (не компьютеры), и это не делается автоматически (приложение должно транслировать себя непосредственно). Это правильно?

  4. Как именно мое приложение может транслироваться само? Могу ли я использовать командную строку для регистрации службы (чтобы все приложения, использующие Bonjour, знали, что появилась новая служба)?

  5. Кроме того, я хотел бы иметь приложение, которое использует IP-сеть, созданную Bonjour. Для этого моему приложению необходимо знать, какие устройства / сервисы присутствуют в сети. Более подробно, мое приложение должно иметь список услуг. У каждой службы в списке должно быть имя, IP-адрес, на котором она работает, и порт, который используется приложением. Может ли Bonjour предоставить эту информацию каким-либо образом? Если это так, то как именно это работает. Как моя программа может получить эту информацию от Bonjour? Может ли моя программа прочитать какой-нибудь файл, созданный Bonjour и содержащий вышеупомянутую информацию? Могу ли я использовать некоторые команды в командной строке для получения этой информации?

  6. У меня есть особый интерес к доступу к информации об услугах из файлов, переменных среды или команд в командной строке. Эти варианты кажутся мне самыми простыми! Поскольку в этом случае мне не нужно использовать какие-либо дополнительные библиотеки для связи с Bonjour с определенного языка программирования.

PS Прошу задавать вопросы, если что-то не понятно в моем вопросе. Я постараюсь сформулировать свой вопрос более четко.

PPS я использую Windows 7.

ДОБАВЛЕНО: я планирую писать свои приложения на PHP. На каждом компьютере должен быть установлен веб-сервер Apache. И я хочу использовать Bonjour, чтобы помочь компьютеру обнаружить друг друга (компьютеры работают в локальной сети).

3 ответа

  1. Да. Стюарт Чешир, который был создателем и основным помощником Rendezvous/Bonjour в Apple, который также был сопредседателем рабочей группы IETF ZeroConf и написал книгу О'Рейли по сети с нулевой конфигурацией, охарактеризовал Bonjour как "три стул на ножках ", где ноги:

    1. IPv4 (и IPv6) локальная адресация
    2. Разрешение многоадресного имени (mDNS)
    3. Обнаружение службы DNS (DNS-SD)

    Рабочая группа IETF ZeroConf и Apple рассматривают локальную адресацию, особенно локальную IPv4-адресацию (169.254.0.0/16 адреса) быть частью ZeroConf/Bonjour, даже несмотря на то, что локальная адресация отправляется за годы до двух других "ножек табуретки".

    Обратите внимание, что поскольку Windows уже поддерживает автоматическую локальную адресацию ссылок даже без установленного программного обеспечения Apple Bonjour для Windows, многие пользователи Windows не считают, что локальная адресация IPv4 является частью Bonjour/ZeroConf.

  2. Да. Компьютеры Mac и Windows по умолчанию выполняют локальную адресацию IPv4, если они настроены для DHCP, но DHCP-сервер недоступен. Машины Linux и BSD с установленной Avahi (или, возможно, другими реализациями ZeroConf) также будут делать это.

  3. Если на компьютере запущен Bonjour, его имя хоста публикуется в локальной сети через mDNS. Если ваша машина называется "Алиса", она будет Alice.local через mDNS. С другого компьютера (назовем его "Боб") в той же локальной сети (в частности, в том же домене многоадресной рассылки) вы можете просто набрать ping Alice.localи Боб должен сделать mDNS поиск Alice.local узнать IP-адрес (а) Алисы и пропинговать (один из) адрес (а), который он получает.

    Однако обратите внимание, что Bonjour различает имена хостов и имена сервисов. Например, если у вас есть два отдельных USB-принтера, скажем, "HP" и "Canon", подключенные к Алисе, и Алиса действует, скажем, как lpr сервер печати для них обоих, каждый из них может отображаться как их собственный сервис, который сопоставляется с Alice.local как хозяин.

    Их сервисные имена будут отображаться пользователю как "HP" и "Canon" без упоминания об Алисе. За кулисами они будут известны как HP._printer._tcp.local а также Canon._printer._tcp.localи просмотр DNS-SD по этим именам служб показал бы, что эти службы доступны на Alice.local на двух разных портах TCP.

    Так что да, приложения должны уведомить демона Bonjour (называется mDNSResponder в реализации Apple), что у них есть услуги, которые они хотят рекламировать. В macOS есть механизмы для автоматической обработки рекламы сервисов для устаревших сервисов, которые изначально не поддерживают Bonjour. Например, MacOS sshd OpenSSH, который не поддерживает Bonjour напрямую, но macOS заботится о рекламе ssh сервис через Bonjour, так что вы можете просто ssh username@Alice.local с других машин в локальной сети.

  4. В macOS есть инструмент командной строки "dns-sd", который может зарегистрировать сервис, используя следующий синтаксис:

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

    Так, например:

    dns-sd -R MyWebsite _http._tcp local 80
    

    Я не удивлюсь, если он будет включен в Bonjour для Windows или Bonjour SDK для Windows, или вы сможете скомпилировать его для Windows из проекта Apple с открытым исходным кодом mDNSResponder. Поиск в Google dns-sd.exeЯ вижу, такая вещь существует. Я не уверен, что просто скачал бы бинарный файл для него. Вместо этого я бы попытался получить его из одного из пакетов, упомянутых выше, или скомпилировать его из источников проекта mDNSResponder.

  5. Вы также можете использовать dns-sd инструмент командной строки для поиска сервисов и поиска их. Вот пример поиска локального веб-сервиса:

    Найдите локальные веб-сервисы с -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
    

    Найдите нужное мне "My Cool Web App" с -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  
    

    Запросите IP-адреса для MyWebServer.local, с -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  
    

    Обратите внимание, что в этих примерах вы должны Ctrl-C вне dns-sd орудие труда. В противном случае он останется открытым навсегда, постоянно наблюдая за сетью и сообщая о любых изменениях в результатах выполненного вами запроса (таких как веб-серверы, входящие и выходящие из сети, пока вы сидите с -B просмотр запроса открыт). Я обнаружил, что по этой и другим причинам dns-sd инструмент не очень подходит для вызова из скрипта. Возможно, вы захотите посмотреть, какие библиотеки ZeroConf для вашего предпочтительного языка в конце концов.

Чтобы ответить на один из ваших других вопросов, я не знаю ни одной реализации ZeroConf, которая позволяет вам выполнять запросы и получать результаты, просто читая / записывая файлы. Большинство приложений, которые используют Bonjour, делают это, вызывая API напрямую (приложения C/C++/Obj-C/Swift) или через библиотеку, специфичную для языка (интерпретируемые / скриптовые языки).

Во-первых, что конкретно делает Bonjour (пожалуйста, прочитайте мои догадки, написанные ниже)? Здесь я обнаружил, что Bonjour позволяет автоматически обнаруживать компьютеры, устройства и службы в IP-сетях. Но я подумал, что он не только "обнаруживает устройства в IP-сети", но и создает IP-сеть, назначая IP-адреса устройствам, на которых работает Bonjour. Я прав?

Не совсем; как указал Джон, DHCP (обычно) используется для распределения IP-адресов. Почти так же, как обычный DNS переводит доменные имена в IP-адреса, Bonjour используется для преобразования временных доменных имен (в локальной сети) в IP-адреса, предоставляющие их.

И я до сих пор скучаю по сути. Это работает следующим образом? Сначала я физически подключаю устройства (например, ноутбуки), чтобы они потенциально могли общаться друг с другом. Затем, скажем, на некоторых ноутбуках у меня запущен Bonjour, и, как следствие, эти ноутбуки автоматически присваивают им IP-адреса. Итак, ноутбуки (где работает Bonjour) создают IP-сеть. Это работает таким образом?

Нет; ноутбуки чаще всего получают свои IP-адреса с локального DHCP-сервера. Добрый день только помогает им решить, какие услуги каждый может предоставить другим.

Или, может быть, компьютер под управлением Bonjour не считается службой и не транслируется сам по себе только потому, что Bonjour работает на этом компьютере. Я имею в виду, что приложения, работающие на компьютерах, должны использовать Bonjour для прямой трансляции. Таким образом, это приложения, которые транслируют себя (не компьютеры), и это не делается автоматически (приложение должно транслировать себя непосредственно). Это правильно?

Да, как правило, ваше приложение должно будет явно объявить о своем существовании. Это часто можно сделать с помощью системных библиотек (распространенных в OS X) или пользовательских библиотек (например, perl's Net::Bonjour).

Как именно мое приложение может транслироваться само? Могу ли я использовать командную строку для регистрации службы (чтобы все приложения, использующие Bonjour, знали, что появилась новая служба)

Я не знаю об инструменте командной строки, который делает это, но у многих основных языков программирования есть библиотеки, доступные для этого.

Кроме того, я хотел бы иметь приложение, которое использует IP-сеть, созданную Bonjour. Для этого моему приложению необходимо знать, какие устройства / сервисы присутствуют в сети. Более подробно, мое приложение должно иметь список услуг. У каждой службы в списке должно быть имя, IP-адрес, на котором она работает, и порт, который используется приложением. Может ли Bonjour предоставить эту информацию каким-либо образом?

Большинство библиотек Bonjour должны быть в состоянии сделать это для вас; см. первый пример на http://search.cpan.org/~chlige/Net-Bonjour-0.96/lib/Net/Bonjour.pm

Если это так, то как именно это работает. Как моя программа может получить эту информацию от Bonjour? Может ли моя программа прочитать какой-нибудь файл, созданный Bonjour и содержащий вышеупомянутую информацию? Могу ли я использовать некоторые команды в командной строке для получения этой информации?

Используя соответствующие библиотеки, программа использует протокол Bonjour, чтобы попросить все другие компьютеры в вашей локальной сети сообщить ему, какие услуги они имеют. Затем эта библиотека проанализирует ответы и представит их вам в более полезном формате.

У меня есть особый интерес к доступу к информации об услугах из файлов, переменных среды или команд в командной строке. Эти варианты кажутся мне самыми простыми! Поскольку в этом случае мне не нужно использовать какие-либо дополнительные библиотеки для связи с Bonjour с определенного языка программирования.

Я не знаю инструмента, который делает это, но он может существовать.

PS Прошу задавать вопросы, если что-то не понятно в моем вопросе. Я постараюсь сформулировать свой вопрос более четко.

Еще немного информации о том, что программа, которую вы пишете, и на каком языке вы пишете, поможет вам в этом.

Для получения дополнительной вводной информации попробуйте оба варианта:

Bonjour не назначает IP-адреса - это протокол обнаружения - вам все еще нужны IP-адреса DHCP/Static/Link-Local(APIPA) для его работы.

Он использует многоадресный DNS (mDNS), чтобы обнаружить, какие хосты находятся в том же широковещательном домене, что и он сам, и, по сути, он становится своим собственным DNS-сервером.

Посмотрите Bonjour & Zeroconf для более низкого уровня.

Если ваше приложение не предназначено для домашней / неуправляемой сети, то есть без локального DNS-сервера, оно просто не нужно.

Другие вопросы по тегам