Как обнаружить диапазон адресов многоадресной рассылки в Java? - PullRequest
0 голосов
/ 28 августа 2018

Может быть, этот вопрос странный. Я не знаю. Например, получение многоадресных пакетов в Java:

byte[] buf = new byte[1500];
MulticastSocket socket = new MulticastSocket(1234);
InetAddress group = InetAddress.getByName("233.0.0.1");
socket.joinGroup(group);

while (true) {
   DatagramPacket packet = new DatagramPacket(buf, buf.length);
   socket.receive(packet);
   // doing something with packet
}
socket.leaveGroup(group);
socket.close();

Но это хорошо работает, если я знаю адрес многоадресной группы. А что если я не знаю? Мне нужно сканировать сеть и найти все доступные многоадресные потоки по порту. Я не знаю адрес, но я знаю порт. Возможно ли это?

Предположим, у меня есть 3 потока с адресами 233.0.0.1:1234, 233.0.0.2:1234, 233.0.0.3:1234. Мне нужно обнаружить сеть по порту 1234 и найти этот адрес. Как я могу сделать это без прохождения всех многоадресных адресов в цикле и присоединения к каждой группе?

1 Ответ

0 голосов
/ 28 августа 2018

Как обнаружить многоадресные адреса в Java?

AFAIK, нет способа сделать это из Java (в настоящее время).

Проблема заключается в том, что многоадресная маршрутизация по существу управляется приемником. Это выглядит примерно так:

  • Когда приложение инициирует многоадресную группу, оно использует один из протоколов PIM, чтобы выяснить, как маршрутизировать свои исходящие пакеты. Это приводит к созданию дерева распространения.
  • Когда приложение присоединяется к многоадресной группе, локальный хост отправляет IGMP-запрос в сеть. Это происходит через коммутаторы в локальном домене маршрутизации.
  • Если один из коммутаторов распознает группу, локальный хост добавляется в дерево рассылки для группы.
  • Если IGMP запрашивает шлюз в Интернет без распознавания (и многоадресный IP-адрес не является частным), шлюз затем использует MBGP, чтобы попытаться найти группу.
  • Если BGMP-запрос находит группу, шлюз присоединяется к дереву распространения.

Как видите, это работает без каких-либо централизованных полномочий. Действительно, если в вашем локальном домене маршрутизации в данный момент не используется данная группа многоадресной рассылки, в сети может не быть ее следа. Можно отслеживать трафик IGMP ... но он говорит только о группах, которые используются локально, а не обо всех доступных группах.

Для получения дополнительной информации, статья в Википедии о IP Multicast - хорошее место для начала.


Обычно большая часть многоадресной маршрутизации и связанных протоколов реализованы в сетевых коммутаторах. Тем не менее, существует программное обеспечение на основе Linux, которое поддерживает многоадресную маршрутизацию и так далее; см. http://troglobit.com/howto/multicast/. Вы можете использовать это для отслеживания IGMP ... хотя это имеет ограничения; см. выше.


Ваш код не выполняет многоадресное обнаружение адресов вообще. Скорее, он присоединяется к определенной группе и получает многоадресный трафик по IP-адресу.

AFAIK, вы не можете отслеживать "весь многоадресный трафик" из стандартной Java. Java не поддерживает беспорядочный режим. Тем не менее, это может быть возможно сделать с помощью библиотеки jpcap ... с оговоркой, что вы будете видеть только трафик, который попадает в сегмент вашей локальной сети.

...