Альтернатива использованию протокола Bonjour для одноранговой связи iPhone - PullRequest
5 голосов
/ 19 марта 2012

Я внедряю приложение для iPhone / iPad, которое позволяет пользователям отправлять друг другу сообщения, используя протокол Bonjour. По сути, сервер публикует свой сервис через Bonjour, и клиенты, подключенные к одному и тому же Wi-Fi, могут обнаружить его сервис и подключиться к нему, чтобы начать отправку сообщений. Проблема, которую я обнаружил, заключается в том, что некоторые маршрутизаторы, похоже, имеют проблемы с Bonjour. Когда я запускаю приложение дома или в других местах, оно отлично работает. Публикация и открытие сервисов Bonjour работает безупречно. Однако, когда я попробовал свое приложение в одной из квартир моего друга, некоторые (не все) клиенты не смогли обнаружить опубликованную услугу Bonjour. Я также заметил, что другие приложения, которые используют Bonjour (например, приложение Apple Remote), также имели проблемы в указанной сети. После некоторых копаний я обнаружил, что у других людей были похожие проблемы с bonjour и некоторыми роутерами. Поэтому у меня есть 2 вопроса:

1) Кто-нибудь знает, является ли эта проблема с Bonjour, которая, по-видимому, у некоторых роутеров, широко распространенной проблемой? Другими словами, если мое приложение использует Bonjour для того, чтобы функционировать вообще, нужно ли мне беспокоиться о том, что оно не будет работать в 50% сетей WLAN или у большинства маршрутизаторов нет проблем с Bonjour. Очевидно, я не могу ожидать, что кто-то узнает, как каждый маршрутизатор работает с пакетами Bonjour, но, возможно, есть некоторые сетевые гуру, которые могут указать мне правильное направление: -p.

2) Во-вторых, если Bonjour слишком рискован для протокола, на котором будет построено мое приложение, каковы некоторые альтернативы с похожими функциями? Функции, которые мне (желательно) понадобятся, будут публиковать и обнаруживать сервисы без необходимости вручную вводить IP-адреса других телефонов.

Хорошо, спасибо за вашу помощь! Я понимаю, что это довольно широкий вопрос, но любая помощь приветствуется! :)

1 Ответ

3 голосов
/ 19 сентября 2012

Это потенциально крепкий орешек. Проблема, приводящая к тому, что устройства не могут находить друг друга в определенных сетях, связана с базовым транспортом (т. Е. Многоадресным UDP), а не с Bonjour (или mDNS или как угодно, как вы хотите его назвать).

В высокоуровневых, не строгих терминах многоадресные данные увеличивают нагрузку на маршрутизаторы. Крупные корпоративные и университетские сети иногда предпочитают сбрасывать сообщения Bonjour (например, UDP-пакеты, отправленные в группу многоадресной рассылки 224.0.0.251 через порт 5353), потому что это означает, что сеть не заполнена тысячами клиентов, рекламирующих свои библиотеки iTunes или что-то подобное, и в масштабе это может улучшить общую производительность. На другом конце спектра некоторые внутренние маршрутизаторы отбрасывают многоадресные пакеты из коробки по причинам, известным только производителю. Вы не можете многое сделать в любой ситуации.

Попробуйте запустить tcpdump в сети, чтобы увидеть, действительно ли пакеты проходят. Я не сталкивался с домашним маршрутизатором, который не пересылает их некоторое время. Если это не так, вам придётся придумать какой-нибудь центральный [интернет-ориентированный, возможно?) Механизм поиска. Если они видны, значит, что-то не так с вашей реализацией.

Ничто не мешает вам написать свой собственный более простой протокол для обнаружения служб, который будет отправлен через многоадресную рассылку - просто есть множество клиентов Bonjour на тонне различных языков, уже написанных и протестированных.

...