UDP многоадресная рассылка: как узнать, какую группу отправлять?
У меня есть небольшая программа, которая должна общаться между двумя компьютерами в одной локальной сети. Я довольно плохо знаком с сетью, но из того, что я прочитал, звучит так, будто я хочу многоадресную передачу по протоколу UDP, чтобы два компьютера могли обнаруживать друг друга, после чего я могу установить TCP-соединение для реальной передачи данных. Я нашел этот маленький пример для многоадресной рассылки UDP, которому я могу следовать. Однако мне интересно про группу многоадресной рассылки (HELLO_GROUP
в этом примере, который 225.0.0.37
).
Как я могу узнать группу, которую я должен использовать? Эта программа будет работать в разных сетях, поэтому я не могу жестко ее кодировать (насколько я знаю). Получу ли я группу от роутера, и если да, то как мне это сделать?
3 ответа
Вы можете выбрать любой многоадресный адрес (от 224.0.0.0 до 239.255.255.255), который не указан как зарезервированный IANA.
Возможно (если маловероятно), что другая программа также будет использовать тот же адрес. Вы можете свести к минимуму вероятность того, что это может привести к путанице, сделав анонсирующие сообщения, которые ваша программа отправляет соответствующим образом. например
CORNSTALKS-DISCOVERY
HOST: {address:port}
[newline]
Это сообщит вашим получателям адрес, который будет использоваться для их соединения TCP, но при этом его первая строка будет отклонена любыми другими получателями.
Вы неправильно поняли.
То, о чем ты говоришь - это трансляция. Широковещательная UDP-датаграмма отправляется на каждый компьютер в подсети. (Технически вы отправляете датаграмму по адресу 255.255.255.255.)
Широковещательная рассылка UDP работает внутри определенной подсети, но не пересекает границы подсети. То есть большинство маршрутизаторов настроены на то, чтобы не маршрутизировать дейтаграммы широковещания (уменьшить количество спама).
OTOH multicast - это нечто совершенно другое. Цель многоадресной рассылки - избежать использования TCP (или любой другой одноадресной передачи) для передачи данных. Это хорошо, когда вам нужно отправить что-то многим другим получателям "сразу". Эти машины предварительно согласовывают конкретный адрес многоадресной рассылки (например, 225.0.0.37 в вашем примере) и "присоединяются" к этой группе многоадресной рассылки. Внутри определенной подсети все работает примерно так же, как широковещательная рассылка, однако в отличие от широковещательной рассылки многоадресная рассылка также может пересекать границы подсети Это связано с тем, что когда машины присоединяются к группе многоадресной рассылки, соответствующие маршрутизаторы получают уведомление и могут соответствующим образом маршрутизировать дейтаграммы многоадресной рассылки.
РЕДАКТИРОВАТЬ:
Заключение (для уточнения).
- Для использования многоадресной рассылки необходимо выбрать адрес многоадресной рассылки. Это похоже на выбор порта для приложения.
- Основное назначение многоадресной рассылки - доставка контента (передача данных) нескольким получателям. В этом случае это более эффективно, чем одноадресная.
- "Обнаружение сети" обычно осуществляется через широковещательную рассылку. Многоадресная рассылка теоретически может быть использована и для этого, но это похоже на убийство мухи с помощью пушки (потому что маршрутизаторы должны также отслеживать время жизни многоадресной сессии).
Я бы посоветовал вам не использовать многоадресную рассылку напрямую.
Скорее используйте сеть с нулевой конфигурацией. Это, в его воплощении mDNS / DNS-SD, доступно через библиотеку Apple Bonjour для OS X и Windows и Avahi для Unix (и, возможно, также для OS X и Windows, не уверен).
С помощью DNS-SD вы определяете имя для вашей службы, а затем используете библиотеку для объявления о ее доступности на данном хосте или для поиска хостов, где она доступна. Именно так Mac обнаруживает принтеры, общие папки и т. Д. Это простая, но очень эффективная технология. И это открытый стандарт с хорошей реализацией с открытым исходным кодом, так что это не какая-то запатентованная Apple страшная пора.