В DatagramSocketImpl
в Java есть joinGroup
метод, который принимает адрес сокета (IP и ПОРТ) плюс адрес интерфейса (IP и ПОРТ). Я пытаюсь понять разницу и назначение каждого из этих трех адресов в стеке многоадресной рассылки:
Я сбит с толку: я не знаю разницы между адресом привязки и адресом интерфейса. Кроме того, я не уверен, действительно ли для многоадресного адреса нужен порт. Могу ли я назвать IP-адрес многоадресной рассылки группой многоадресных адресов?
На самом деле вы смешиваете здесь три метода. Первый - это привязка, которая используется для привязки сокета к указанному адресу и порту. Используя этот метод, вы в основном открываете udp-порт и ждете данных на этот порт по этому адресу. Второй - это метод соединения, который позволяет сокету присоединиться к указанной группе многоадресной рассылки. Примером многоадресной группы является 224.0.0.1 - многоадресная группа «Все узлы», которая адресует все узлы в одном сегменте сети. Третий метод - joinGroup, который позволяет сокету присоединяться к указанной многоадресной группе на указанном сетевом интерфейсе. Как видите, второй и третий методы используются для многоадресной IP-рассылки, а первый метод - для UDP (не обязательно в сочетании с многоадресной рассылкой). Присоединяясь к группе многоадресной рассылки, сокет может получать дейтаграммы, отправленные с использованием многоадресной рассылки IP. Оба, конечно, могут быть объединены, например, получать данные с помощью многоадресной рассылки, а затем, при необходимости, отвечать либо с помощью многоадресной рассылки (если данные интересны для всех хостов в группе), либо напрямую отправителю (если данные интересны только отправителю) .
Когда вы привязываете сокет к адресу с помощью метода привязки, это также включает порт. Принимаются / могут быть получены только дейтаграммы для этой конкретной комбинации адреса / порта, если только сокет не присоединяется к многоадресной группе.
Я не уверен, как вы перешли от joinGroup к адресу интерфейса. Вам нужны SocketAddress и NetworkInterface. NetworkInterface может быть получен либо по имени интерфейса (NetworkInterface.getByName), либо по адресу (NetworkInterface.getByInetAddress). В случае getByInetAddress вы, вероятно, могли бы назвать его адресом интерфейса, но все, что он делает, - это извлекает NetworkInterface, который имеет указанный адрес и, следовательно, не использует номер порта.
Multicast-адреса используются в многоадресной IP-рассылке, которая используется для отправки дейтаграмм IP группе хостов (если они заинтересованы в получении дейтаграмм). Вы можете использовать порт (если используете UDP), но в этом нет необходимости. CIDR многоадресных IPv4-адресов - 224.0.0.0/4 (224.0.0.0 - 239.255.255.255), а многоадресные IPv6-адреса имеют префикс ff00 :: / 8. Каждый IP-адрес в этих диапазонах представляет группу многоадресной рассылки. Существуют разные блоки многоадресных адресов (и многоадресные группы), которые нужно обрабатывать по-разному. Например, 224.0.0.0/24 не должны маршрутизироваться из исходной подсети, в то время как 239.192.0.0/14 может маршрутизироваться и, если маршрутизируется глобально, должен быть инкапсулирован.