Bonjour
Bonjour
Bonjour — это набор технологий Apple для автоматического обнаружения
устройств и сервисов в локальной сети без ручной настройки. За именем
стоят три открытых стандарта: link-local addressing, mDNS (Multicast DNS)
и DNS-SD (DNS-based Service Discovery).
История
-
2002, США, Купертино. Apple выпустила Mac OS X 10.2 (Jaguar) и
впервые встроила туда технологию под именем Rendezvous — «встреча»
по-французски. Автор — Stuart Cheshire, инженер Apple с 1999 года, до
этого — исследователь в Xerox PARC. Задача: чтобы Mac видел принтер и
сосед-Mac в одной Wi-Fi-сети без DNS-сервера, без ручного ввода IP, без
установки драйверов. -
2005. Rendezvous переименовали в Bonjour («здравствуйте»). Причина
— иск от компании TIBCO, у которой уже был продукт «Rendezvous» для
корпоративной шины сообщений. Apple судилась, судилась и в итоге просто
сменила имя. Технология осталась той же. -
Февраль 2013. IETF опубликовал два ключевых RFC — RFC 6762
(Multicast DNS) и RFC 6763 (DNS-Based Service Discovery). Оба —
за авторством того же Stuart Cheshire и Marc Krochmal, оба стали
стандартами. То есть Bonjour перестал быть «фирменной штукой Apple» и
стал открытым протоколом, который может реализовать кто угодно. -
С 2013 по 2020-е. Bonjour превратился в невидимую инфраструктуру
быта. AirPrint, AirPlay, AirDrop, HomeKit, iTunes Sharing, Handoff —
всё это опирается на Bonjour. Google Chromecast использует mDNS.
Умные лампы Philips Hue, колонки Sonos, приставки Roku — тоже. Linux
получил свою совместимую реализацию — Avahi (2004). -
Текущий статус. Apple выкладывает исходники своей реализации
(mDNSResponder) под лицензией Apache 2.0. На iPhone, iPad, Mac, Apple TV,
HomePod — Bonjour работает всегда, отключить его штатно нельзя. На
Windows он ставится вместе с iTunes или отдельным пакетом Bonjour Print
Services. На Linux — через пакетavahi-daemon.
Что это такое
Bonjour — это зонтичный бренд для набора протоколов, которые вместе решают
одну задачу: устройство должно уметь работать в сети, куда его только что
воткнули, без единой ручной настройки. Ни IP-адреса ввести, ни DNS-сервера
настроить, ни принтер найти вручную. Просто включил — работает.
Внутри Bonjour три составные части:
-
Link-local addressing (RFC 3927) — если в сети нет DHCP-сервера
(роутера, который раздаёт IP), устройство само выбирает себе адрес
из диапазона 169.254.0.0/16, проверяет, что он не занят, и берёт.
На macOS это называется «self-assigned IP». Работает без ничего. -
mDNS (Multicast DNS, RFC 6762) — резолвинг имён в зоне
.local
без DNS-сервера. Пишешьmac-pavel.local— и оно резолвится в IP
через широковещательный запрос по локальной сети. Никаких серверов,
никакой конфигурации. -
DNS-SD (DNS Service Discovery, RFC 6763) — поверх mDNS работает
протокол поиска сервисов. «Кто в этой сети предлагает печать по
протоколу IPP?» — и в ответ приходит список принтеров. «Кто
AirPlay-приёмник?» — список колонок и телевизоров.
Разница с обычным DNS: обычный DNS — это иерархия серверов, где
клиент спрашивает «где example.com?» у корневого сервера, потом у зоны
.com, потом у зоны example.com. Централизованно, требует настройки.
mDNS — это широковещательный запрос без сервера: клиент кричит
в локальную сеть «кто такой mac-pavel.local?», и тот, кто отзывается на
это имя, отвечает сам.
Разница с UPnP/SSDP (протокол обнаружения от Microsoft): SSDP решает ту же
задачу, но менее аккуратно (спам-запросы по всей сети, много legacy
проблем безопасности). Bonjour/mDNS считается более чистым и его выбрал
IETF как стандарт.
Аналогии из жизни
Аналогия 1 — коктейль-вечеринка. Заходишь в комнату, где никого не
знаешь. Тебе нужен Ваня. Кричишь на всю комнату: «Ваня, ты здесь?». Если
Ваня есть — отвечает. Все остальные молча его пропускают. Это ровно то,
что делает mDNS: multicast-запрос в локальную сеть, ответ только от
адресата. Где ломается: если в комнате 500 человек и все параллельно
ищут разных Вань — начнётся ор, никто никого не услышит. Именно поэтому
Bonjour плохо работает в больших офисных сетях: multicast там или
отключён, или тонет в шуме.
Аналогия 2 — блошиный рынок. Продавцы выставляют таблички: «Пирожки
свежие», «Часы швейцарские», «Ремонт зонтов». Покупатели ходят и читают.
Никто ни у кого ничего не спрашивает, все объявляют о себе сами. Это
DNS-SD: устройства «вывешивают» описание своих сервисов, клиенты сканируют
и выбирают. Где ломается: если у продавца шрифт мелкий и издалека не
видно, покупатель мимо пройдёт. У Bonjour есть похожая проблема — TXT-
записи (описание сервиса) ограничены по длине, детали приходится
запрашивать отдельным пакетом.
Аналогия 3 — детский лагерь. Каждое утро вожатый выстраивает всех и
кричит: «Кто хочет играть в футбол? Подойдите!». Кто хочет — подходит.
Никто не ведёт список, никто не заранее не регистрируется. Через час то
же самое с волейболом. Это — цикл multicast-запросов в Bonjour: клиенты
периодически перезапрашивают, кто есть в сети, потому что устройства
могли уйти или прийти. Где ломается: если ребёнок уходит с площадки
молча — вожатый всё равно будет считать его в списке. У Bonjour есть
специальный «goodbye»-пакет для корректного выхода, но не все устройства
его отправляют (например, если Wi-Fi отвалился внезапно) — тогда клиент
видит призрак в списке ещё несколько минут.
Как это работает
Возьмём типичный сценарий: у тебя Mac, ты воткнул в сеть новый принтер с
поддержкой AirPrint, и он появился в списке. Что происходит?
Шаг 1. IP-адрес.
Принтер включается, ищет DHCP-сервер (роутер). Если находит — получает от
него IP. Если нет — берёт себе адрес из диапазона 169.254.x.x, проверяет
через ARP, что этот адрес свободен, и оставляет за собой.
Шаг 2. Имя.
У принтера есть внутреннее имя, например Kyocera-M5521cdw.local.
Как только у него появился IP, он рассылает multicast Announcement —
пакет UDP на адрес 224.0.0.251:5353 (это зарезервированный «адрес всей
локальной сети» для mDNS). В пакете: «я — Kyocera-M5521cdw.local, мой
адрес такой-то». Все устройства в сети слышат и запоминают.
Шаг 3. Реклама сервисов.
Тем же multicast-ом принтер объявляет: «я умею IPP-печать
(_ipp._tcp.local)». В DNS-SD терминологии он публикует PTR-запись «есть
сервис такого-то типа», SRV-запись (какой хост и порт), TXT-запись (детали:
модель, поддерживаемые форматы).
Шаг 4. Обнаружение у Mac.
Твой Mac периодически шлёт multicast-запрос: «кто есть в сети из типа
_ipp._tcp.local?». Все принтеры отвечают, включая новый. macOS
показывает их в диалоге «Добавить принтер».
Шаг 5. Использование.
Ты выбираешь принтер, macOS запрашивает его TXT-запись целиком, читает
поддерживаемые форматы. В большинстве случаев драйвер не нужен: AirPrint
= IPP Everywhere = универсальный протокол. Печатаешь.
Ключевое, что все шаги происходят без единой ручной настройки. И самое
главное: всё в пределах одной локальной сети. Multicast-пакеты не
уходят за пределы Wi-Fi/Ethernet-сегмента. Твой iPhone в кафе не видит
принтеры твоего офиса — и это правильно.
Схема на пальцах:
[Принтер] [Mac]
| |
|-- "я Kyocera.local, IP 192.168.1.7" ----> (multicast)
| |
|-- "у меня есть сервис _ipp._tcp" ---------> (multicast)
| |
| <---- "кто из _ipp._tcp?" --------|
| |
|-- "я, вот мои детали" -------------------->|
| |
| <---- IPP-запрос: "печатай" ------|
| |
Технические детали для любителей: mDNS работает на UDP-порту 5353,
использует multicast-адреса 224.0.0.251 (IPv4) и ff02::fb (IPv6),
TTL=255 на link, формат пакета — обычный DNS-пакет с флагом QR=1 и
кучей расширений (unicast responses, cache flush и т.д.).
Где встречается в обычной жизни
-
Печать «просто работает». Ты купил принтер, воткнул в Wi-Fi через
экранчик, открыл документ на iPhone → «Печать» → и принтер уже в
списке. Это Bonjour + AirPrint (Apple-стандарт поверх IPP). -
AirDrop. Открыл фото, нажал «Поделиться», в списке появился Mac
соседа за столиком в кафе. Bonjour нашёл его устройство, а сам
AirDrop передал файл через Wi-Fi Direct. -
AirPlay на Apple TV. Открываешь YouTube на iPhone, нажимаешь на
значок трансляции — в списке появляется твой телевизор. Это тоже
Bonjour: Apple TV объявляет о себе как о_airplay._tcp.local. -
Умные колонки и лампы. Sonos, Philips Hue, Xiaomi Mi Home — все они
находятся в приложении, потому что заявляют о себе через mDNS. Даже
Chromecast от Google (не Apple!) использует Bonjour. -
Sharing между Mac-ами. Если у соседа на Mac включён Screen Sharing
или File Sharing, ты видишь его иконку в боковой панели Finder без
какой-либо настройки. Это тоже Bonjour: сервисы_smb._tcp.local,
_rfb._tcp.local.
Где встречается в IT и бизнесе
-
Service discovery в микросервисах для dev-окружения. Разработчики
часто используют mDNS-имена в стилеapi.local, чтобы локально
тестировать без ручного прописывания IP. -
IoT-устройства. Практически весь потребительский IoT (умный дом,
колонки, камеры) построен на mDNS для обнаружения. Отсюда стандарты
Matter/Thread — они включают Bonjour как обязательный компонент. -
Kubernetes и внутренние сети. Хотя в кластере обычно используется
свой DNS (kube-dns/CoreDNS), для локальной разработки часто
подключают mDNS через minikube-plugin. -
Инструменты разработчика. Nginx с Docker Compose часто
автоматически публикует_http._tcp.localчерез plugin. Локальный
frontend видит backend без правки/etc/hosts. -
Медиа-серверы. Plex, Emby, Jellyfin — все они находят друг друга и
клиентские устройства через Bonjour.
Кто пользуется
-
Apple — 100% встроен во все iOS/macOS/tvOS/watchOS-устройства. Это
примерно 2 миллиарда активных устройств (данные Apple на 2023). Всё,
что Apple выпускает после 2002 года, говорит на Bonjour. -
Google — Chromecast (сотни миллионов проданных устройств) целиком
строится на mDNS. Android с версии 4.1 (2012) имеет встроенный
Network Service Discovery на базе mDNS. -
Sonos — вся линейка колонок использует Bonjour для обнаружения.
Компания продала более 40 миллионов устройств к 2023 году. -
Philips Hue — Bridge (хаб для умных ламп) объявляет о себе через
mDNS. Более 100 миллионов ламп продано. -
Microsoft Windows — не встроен, но опционален. Устанавливается с
iTunes или отдельно как «Bonjour Print Services» (несколько
миллиардов установок за 20 лет). -
Открытые проекты — Avahi (Linux), pybonjour (Python),
node-mdns (Node.js), zeroconf для Go/Rust/Java.
Альтернативы и конкуренты
-
SSDP (Simple Service Discovery Protocol) / UPnP.
Плюсы: широко поддерживается в старых Windows и роутерах, много
готовых устройств.
Минусы: security-кошмар (в 2013 году десятки миллионов роутеров были
взломаны через UPnP), избыточный трафик, старый формат. -
LLMNR (Link-Local Multicast Name Resolution).
Плюсы: встроен в Windows Vista и позже, аналог mDNS.
Минусы: не совместим с mDNS, известен уязвимостями (LLMNR poisoning
— классическая атака в pentest), Microsoft начала отключать по
умолчанию с 2022 года. -
WS-Discovery (Web Services Dynamic Discovery).
Плюсы: часть стандартов SOAP, использовалась в корпоративной среде.
Минусы: тяжёлый XML, практически мёртв за пределами legacy-систем. -
Consul / etcd / ZooKeeper.
Плюсы: промышленные системы service discovery для датацентров, HA,
централизованное управление.
Минусы: избыточно для локальной сети, требуют серверов, конфигурации,
кластера.
Когда НЕ стоит использовать
-
В больших корпоративных сетях. Multicast-трафик обычно фильтруется
на уровне VLAN или отключается совсем — по соображениям безопасности
и производительности. Устройства не увидят друг друга, даже если
физически в одной сети. -
Через WAN, между офисами, через VPN. mDNS-пакеты живут только в
пределах одного broadcast-домена. Если тебе нужно найти сервис в
соседнем офисе — Bonjour не поможет. Используй обычный DNS или
service mesh (Consul, etcd). -
В публичных Wi-Fi. Bonjour раскрывает имена и типы твоих
сервисов всем в сети. В кафе не хочется, чтобы все видели твой Mac и
сервисы. macOS частично прикрывает это через AirDrop-Only-Contacts,
но в целом mDNS в публичной сети — утечка информации.
Связанные понятия
- mDNS (Multicast DNS) — сам протокол, RFC 6762, ядро Bonjour.
- DNS-SD (DNS Service Discovery) — надстройка над mDNS для поиска
сервисов, RFC 6763. - Zeroconf — общий термин для zero-configuration networking, включает
Bonjour, Avahi и все совместимые реализации. - Avahi — открытая реализация Zeroconf для Linux/BSD, совместима с
Bonjour. - IPP (Internet Printing Protocol) — стандарт печати, поверх которого
работает AirPrint. - UPnP / SSDP — конкурирующий подход к обнаружению устройств,
Microsoft-мир. - Multicast — способ отправки одного пакета группе получателей,
фундамент mDNS. - Link-local address — самоприсвоенный IP в диапазоне 169.254.x.x
без DHCP, часть Zeroconf.
Литература и источники
-
RFC 6762 «Multicast DNS» (Stuart Cheshire, Marc Krochmal, 2013) —
основной документ по mDNS. Читается тяжело, но короткие первые главы
дают хорошее общее понимание. Искать по номеру RFC на datatracker.ietf.org. -
RFC 6763 «DNS-Based Service Discovery» (те же авторы, 2013) —
парный документ, объясняет DNS-SD. -
«Zero Configuration Networking: The Definitive Guide» — Stuart
Cheshire, Daniel Steinberg (O'Reilly, 2005, en). Книга от самого
автора протокола, единственный полный источник в одном месте. -
Apple Developer Documentation → Bonjour. Официальная документация
для разработчиков, с примерами кода на Swift/Objective-C. Искать
«Bonjour Overview» на developer.apple.com. -
Wikipedia (en): «Bonjour (software)», «Zero-configuration
networking», «Multicast DNS». Хороший обзор для быстрого въезда,
ссылки на первоисточники. -
Проект Avahi (avahi.org). Открытая реализация, исходники на
GitHub. Полезно если разбираешься в Linux.
Где встретилось у меня
Вчера в логах Claude Code был большой блок про печать: конфигурация
принтеров Kyocera и HP LaserJet на Mac, почему принтер «пропал» из
системы и как заставить macOS его снова увидеть. Ответ на многие
подобные вопросы упирается именно в Bonjour: если mDNS-объявления
принтера не доходят до Mac (проблема с multicast на роутере, VLAN,
Wi-Fi изоляцией клиентов) — принтер не появится в списке, даже если он
физически в той же сети. Понимание того, что «магия обнаружения» —
не магия, а конкретный multicast-протокол, помогает диагностировать
такие ситуации.
Краткое резюме
- Bonjour = mDNS + DNS-SD + link-local IP. Три открытых стандарта под
одним брендом Apple. - Задача одна: подключить устройство к сети и сразу его увидеть —
без DHCP, без DNS-сервера, без ввода IP, без драйверов. - Работает через multicast на UDP:5353 в пределах одного broadcast-
домена. За пределы Wi-Fi/подсети не выходит. - Везде вокруг тебя: AirPrint, AirDrop, AirPlay, HomeKit, Chromecast,
Sonos, Philips Hue — всё это Bonjour или совместимые реализации. - Не для датацентров и не для публичных сетей: в корпоративных
сетях multicast обычно отключён, а в кафе — небезопасен.