Multicast Broadcasting для самоочищения - PullRequest
0 голосов
/ 24 января 2019

Установка:

У пользователя есть два приложения - одно отправитель, один получатель - запущенные на одном хосте / сервере. Пользователь настраивает его так, чтобы отправитель отправлял сообщения на свой собственный IP-адрес, а не 127.0.0.1. Допустим, его IP-адрес и порт x: y для простоты. Затем пользователь настраивает приемник на прием сообщений на x: y. Опять же, это на том же хосте / сервере.

Вопросы:

  1. Насколько я понимаю, это невозможно, поскольку порт уже зарезервирован. Поэтому я не могу использовать один и тот же порт, чтобы попытаться отправить пакеты себе. Можно ли использовать порт для отправителя и получателя на одном узле?
  2. Это решается, если я использую SO_REUSEADDR или это только разрешает конфликт IP, а не повторное использование порта?
  3. Если программа не настроена с IP_MULTICAST_LOOP, хост не будет многоадресно передавать сообщение самому себе, правильно?
  4. При установленном IP_MULITCAST_LOOP, если я только хочу отправить сообщение себе, могу ли я использовать 127.0.0.1 или я должен использовать другой адрес? Кроме того, как разрешаются порты?
  5. Если я не вижу сообщений на одном и том же узле, можно ли предположить, что IP_MULITCAST_LOOP не установлен?

1 Ответ

0 голосов
/ 11 февраля 2019

Давайте рассмотрим шаг за шагом:

  1. Порт отправки не имеет значения вообще. Таким образом, вы можете выбрать произвольный порт для отправителя и использовать конкретный номер порта для вашей услуги только для получателя.

  2. Нет, SO_REUSEADDR / PORT не решает эту проблему. Даже если вам удастся этого добиться: не запускайте несколько слушателей на одном и том же порту. Это вызовет странные эффекты. Основная цель SO_REUSEADDR / PORT - позволить серверам создавать сокет TCP (не UDP), когда предыдущий серверный процесс только что умер, без ожидания тайм-аута конечного автомата TCP устаревшего сокета.

  3. Исправляет, предполагая, что вы имеете в виду многоадресная рассылка вместо широковещательная рассылка ,

  4. Да и нет: если вы хотите только отправлять сообщения себе, вы можете отправлять пакеты на 127.0.0.1, и тогда ваше сообщение будет обычным одноадресным пакетом, а не многоадресным пакетом, а IP_MULTICAST_LOOP этого не делает. имеет значение вообще. Многоадресные пакеты - это обычные UDP-пакеты, которые имеют адрес назначения в диапазоне многоадресных адресов (то есть 224.0.0.0-239.255.255.255). Принимающий сокет не может легко определить, был ли пакет отправлен с помощью одноадресной или многоадресной рассылки.

  5. IP-маршрутизация на одном хосте между интерфейсами далека от тривиальной. Здесь задействовано множество механизмов и правил маршрутизации, которые не показаны в обычной таблице маршрутизации, которая предназначена только для исходящего трафика. Это также зависит от того, какими средствами вы пытаетесь наблюдать сообщения. Там нет ни одной точки, где вы можете увидеть все сообщения, проходящие через узел (к сожалению). Обычно это все привязано к интерфейсам, а также к входной и выходной стороне, и последняя обычно не документируется и не настраивается. Мониторинг локального трафика может быть сложным и может потребовать виртуальных сетевых интерфейсов. Действительно грязный.

В итоге: вы пытаетесь отправить сообщения от одного процесса другому процессу на том же хосте. Используйте одноадресный UDP для этого, и все готово. Нет многоадресной передачи.

...