Я новичок в продвинутом сетевом администрировании, и я хотел бы провести некоторое тестирование с широковещательной передачей UDP, поэтому мне нужно широковещательный адрес на моем интерфейсе обратной связи. Машина не в сети, то есть сети нет.
Как я могу добиться этого через ifconfig
без необходимости покупать коммутатор, как предложил один пользователь в комментариях. В Linux все, что мне нужно сделать, это использовать 127.255.255.255, и трансляции работают нормально без какой-либо сети или какого-либо переключателя. Если у меня есть сеть, я могу просто использовать 255.255.255.255, очевидно.
Вот как вы можете убедиться, что он работает в linux, но не в os / x:
Откройте два терминала и введите на обоих:
nc -u -l 55555
Откройте третий терминал, при необходимости установите socat и введите: (если вы спросите, netcat НЕ поддерживает трансляцию)
echo -n "TEST" | socat - udp-datagram:127.255.255.255:55555,broadcast
Тебе следует увидеть оба терминала получение сообщения.
Если вы попробуете тот же эксперимент с 127.0.0.1, только один терминал получит ожидаемое сообщение.
Выполнение того же теста в OS X не дает такого же поведения.
Я ищу программный обходной путь для трансляций, если это возможно.
Я не могу использовать многоадресную рассылку (она должна транслироваться), и я не могу проверить это по сети (машина отключена).
Вы не «добавляете» широковещательный адрес. Вы направлять трафик на широковещательный адрес сети.
Широковещательный адрес - это полностью виртуальная концепция, и не должна быть "добавленным" или иным образом назначенным любому хосту в обычной практике.
Исключением из приведенного выше правила является указание широковещательный адрес (с использованием
ifconfig broadcast
), что делается в случаях, когда широковещательный адрес может быть нестандартным. Как правило, если вы решите использоватьbroadcast
вариант ifconfig вы делаете что-то странное и, вероятно, неправильно...
Если вы хотите отправить широковещательную рассылку в сеть 127.0.0.0/8 (локальная / кольцевая), теоретически вы бы просто направили трафик на 127.255.255.255, но если вы попытаетесь это сделать, вы обнаружите, что это НЕ РАБОТАЕТ, потому что устройство обратной связи не поддерживает BROADCAST
трафик.
Вы можете убедиться в этом сами, запустив ifconfig lo0
на вашем Mac, который будет производить такой вывод:
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=3<RXCSUM,TXCSUM>
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
inet 127.0.0.1 netmask 0xff000000
nd6 options=1<PERFORMNUD>
Обратите внимание на отсутствие BROADCAST
в поле флагов.
Настройка устройства с указанным параметром широковещания (адресом) приводит к игнорированию адреса. Коробка BSD или Linux (Debian) ведет себя аналогичным образом, и я ожидаю, что другие платформы поступят так же, хотя вы можете найти странную утку, которая позволяет вам установить BROADCAST
установите флажок на устройстве с обратной связью, если вы ищете достаточно усердно.
Обсуждается логика этого в этом сообщении списка рассылки FreeBSD. Альтернативная причина запрета трансляции также обсуждается в комментариях к этот ответ сбоя сервера, который предлагает альтернативу использования MULTICAST
(который является обычно поддерживается интерфейсом обратной связи).
Конкретно в отношении вашего тестового примера: то, что вы видите, не является ожидаемым поведением. Мне удалось воспроизвести ваше поведение, но только в очень узком стечении обстоятельств.
Для более надежного теста, который показывает, что широковещательные сообщения на устройстве обратной связи на самом деле не работает в Linux попробуйте следующий тестовый пример на удобной машине с Linux (мой тестовый пример: Ubuntu 13.04):
Настройте второй адрес (третий, четвертый, пятый - сколько хотите) на вашем интерфейсе обратной связи.
Запустите экземпляр netcat, прослушивающий каждый адрес обратной связи, например -
nc -u -l 127.0.0.1 5555
nc -u -l 127.0.0.2 5555
nc -u -l 127.0.0.3 5555
...и т.д
Запустите команду теста вещания, используя socat
echo TEST | socat - udp-datagram:127.255.255.255:5555,broadcast
Вы заметите, что никто ваших окон netcat получит сообщение (Ожидаемое поведение поскольку интерфейс обратной связи не рекламирует поддержку BROADCAST
в поле флагов), однако если вы обратитесь к ним напрямую (например, echo TEST2 | socat - udp-datagram:127.0.0.2:5555
) они получают сообщение без проблем.
«Решение», о котором вы просите, не существует (или, по крайней мере, не должно работать) на любой платформе, если интерфейс обратной связи не поддерживает BROADCAST
(как можно определить по flags
поле в ifconfig) - платформы, о которых вы говорите не рекламировать поддержку широковещательной передачи на интерфейсе обратной связи, поэтому вы не можете делать то, что просите.