Як користуватися Bonjour?


26
  1. По-перше, що саме робить Бонжур (прохання читати мої здогадки, написані нижче)?
    Тут я дізнався, що 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 і написав книгу O'Reilly про мережу Zero Configuration, описав Bonjour як "три- нога табурета », де ноги:

    1. Локальна адресація посилань IPv4 (та IPv6)
    2. Дозвіл імені багатоадресної пошти (mDNS)
    3. Відкриття служби DNS (DNS-SD)

    Робоча група IETF ZeroConf і Apple вважають адресацію локальних посилань, особливо IPv4- 169.254.0.0/16адреса локальної адреси ( адреси) частиною ZeroConf / Bonjour, навіть незважаючи на те, що адресація локальних посилань надсилається за роки до двох інших «ніжок табуретки».

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

  2. Так. Маки та машини Windows за замовчуванням роблять локальну адресацію IPv4 посилання, якщо вони налаштовані для DHCP, але немає сервера DHCP. Машини Linux та BSD з встановленими Avahi (або, можливо, іншими реалізаціями ZeroConf) також будуть це робити.

  3. Якщо на комп'ютері працює Bonjour, його ім'я хоста публікується в локальній мережі через mDNS. Якщо назва вашої машини "Alice", це буде Alice.localчерез mDNS. З іншого комп’ютера (назвемо його «Боб») у тій же локальній мережі (конкретно, на тому ж домені багатоадресної передачі посилань), ви повинні мати можливість просто ввести ping Alice.local, і Боб повинен здійснити пошук mDNS, Alice.localщоб виявити IP-адресу Аліси ( es) і ping (одна з) адреси, яку вона отримує назад.

    Зауважте, що Bonjour розрізняє імена хостів та імена послуг. Наприклад, якщо у вас є два окремі принтери USB, скажімо, "HP" і "Canon", підключені до Alice, а Alice діє як, скажімо, lprсервер друку для обох, вони можуть відображатись як власна служба , яка повертається до Alice.localхоста.

    Їх імена служб відображатимуться користувачеві як "HP" та "Canon", не згадуючи про Alice. Позаду, вони будуть відомі як 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 із проекту відкритого коду mDNSResponder від Apple . Гуглити 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 / Zeroconf, який я бачив. Ви маєте внести частину статті у вікіпедію :)
Каміль Кісієль,

Це досить повно, але якщо ви хочете розширити, як використовуються записи DNS, не соромтеся красти з serverfault.com/questions/18565/…
andrewtj

4

По-перше, що саме робить Бонжур (прохання читати мої здогадки, написані нижче)? Тут я дізнався, що Bonjour дозволяє автоматично знаходити комп’ютери, пристрої та сервіси в мережах IP. Але я подумав, що він не тільки «виявляє пристрої в IP-мережі», але й створює мережу IP, призначаючи IP-адреси пристроям, де працює Bonjour. Чи правий я?

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

І я все одно сумую по суті. Чи працює це таким чином? Спочатку я фізично підключаю пристрої (наприклад, ноутбуки), щоб вони потенційно могли спілкуватися один з одним. Тоді, скажімо, на деяких ноутбуках у мене працює Bonjour, і, як наслідок, ці ноутбуки автоматично присвоюють їм IP-адреси. Отже, ноутбуки (де працює Bonjour) будують мережу IP. Чи працює це таким чином?

Ніп; ноутбуки, як правило, отримують свої IP-адреси з локального сервера DHCP. Bonjour просто допомагає їм розібратися, які послуги кожен може надати іншим.

Або комп'ютер під управлінням Bonjour не розглядається як послуга, і він не транслює себе лише тому, що Bonjour працює на цьому комп’ютері. Я маю на увазі, що програми, що працюють на комп’ютерах, повинні використовувати Bonjour для самої трансляції. Отже, це програми, які транслюють їх самі (а не комп’ютери), і це не робиться автоматично (програмі потрібно транслювати їх явно). Це правильно?

Так - як правило, вашій програмі потрібно буде чітко рекламувати своє існування. Це часто можна зробити за допомогою наданих системних бібліотек (загальних для OS X) або користувацьких бібліотек (наприклад, Net :: Bonjour) perl.

Як саме моя програма може транслювати себе? Чи можу я використовувати командний рядок для реєстрації послуги (щоб усі програми, що використовують 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, ви писали, що Bonjour не призначає IP-адреси: "DHCP (як правило) використовується для розподілу IP-адрес". Але Бонжур реалізує протокол ZeroConf, і однією з основних технологій протоколу ZeroConf (згідно з wikipedia) є "Присвоєння числових мережевих адрес мережевим пристроям (автоконфігурація адреси локальної адреси)".
Роман

У мережах IPv4 без сервера DHCP / BootP хости призначать собі 168. * адреси. Bonjour правильно працює з цими адресами. Або це, або це посилання на IPv6 Link-Local адреси.
jdizzle

3

Bonjour не присвоює IP-адреси - це протокол виявлення - для його роботи все ще потрібні IP-адреси DHCP / Static / Link-Local (APIPA).

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

Дивіться інформацію про Bonjour & Zeroconf щодо нижнього спаду.

Якщо ваша програма не призначена для домашньої / некерованої мережі, тобто не вистачає локального DNS-сервера, вам це просто не потрібно.


ZeroConf не призначає IP-адреси?
Гоблінс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.