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

26
  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, чтобы помочь компьютеру обнаружить друг друга (компьютеры работают в локальной сети).

Римский
источник

Ответы:

54
  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-адрес Алисы ( es) и пинг (один из) адресов, которые он получает.

    Однако обратите внимание, что 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 . Погуглил 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) или через библиотеку, специфичную для языка (интерпретируемые / скриптовые языки).

Spiff
источник
Лучшее объяснение Bonjour / Zeroconf, которое я видел. Вы должны внести свой вклад в статью в Википедии :)
Kamil Kisiel
Это довольно полно, как есть, но если вы хотите подробнее
рассказать
4

Во-первых, что конкретно делает 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 Прошу задавать вопросы, если что-то не понятно в моем вопросе. Я постараюсь сформулировать свой вопрос более четко.

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

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

caelyx
источник
caelyx, я добавил нужную тебе информацию в конец моего первоначального вопроса.
Роман
caelyx, вы писали, что Bonjour не назначает IP-адреса: «DHCP (обычно) используется для распределения IP-адресов». Но Bonjour реализует протокол ZeroConf, и одной из основных технологий протокола ZeroConf (согласно википедии) является «Назначение числовых сетевых адресов для сетевых устройств (автоконфигурация локального адреса канала)».
Роман
В сетях IPv4 без сервера DHCP / BootP хосты назначают себе 168. * адреса. Добрый день работает правильно с этими адресами. Либо это, либо это относится к локальным адресам IPv6.
jdizzle
3

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

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

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

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

Джон Роудс
источник
ZeroConf не назначает IP-адреса?
Гоблины