Система CentOS 5, похоже, не выходит из коробки с маршрутом для многоадресного трафика. Что это делает Похоже, что нужно использовать маршрут по умолчанию, если он настроен. Другими словами, таблица маршрутизации такая:
# netstat -rn
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
10.42.128.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
0.0.0.0 10.42.128.1 0.0.0.0 UG 0 0 0 eth0
будет работать с моим клиентским приложением многоадресной рассылки на основе Java (или приведенным ниже тестовым примером), которое предполагает возможность отправки на локальный адрес многоадресной рассылки.
Эта установка работает. Если у меня нет маршрута по умолчанию, например
Destination Gateway Genmask Flags MSS Window irtt Iface
10.42.128.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
мое приложение Java завершится ошибкой при попытке отправки. Я могу исправить это, добавив многоадресный маршрут:
# route add -net 224.0.0.0/4 via eth0
И делать это постоянно:
# echo 224.0.0.0/4 via eth0 >>/etc/sysconfig/network-scripts/route-eth0
Должен ли я все равно создавать этот маршрут? Есть ли какой-нибудь вред в том, чтобы позволить маршруту по умолчанию обрабатывать многоадресный трафик, кроме того факта, что он перестанет работать, если маршрут по умолчанию исчезнет?
Вот небольшой тестовый пример, который можно запустить, выполнив javac Sender.java; java Sender
. Он отправляет 0-байтовый пакет UDP на локальный адрес сайта 239.192.0.1. Если у меня нет маршрута по умолчанию, он не сработает с
Exception in thread "main" java.io.IOException: Network is unreachable
at java.net.PlainDatagramSocketImpl.send(Native Method)
at java.net.DatagramSocket.send(DatagramSocket.java:629)
at Sender.main(MulticastSender.java:7)
Однако, если присутствует маршрут по умолчанию (или маршрут многоадресной рассылки, о котором я упоминал выше), он успешно отправит пакет на 239.192.0.1.
Sender.java
import java.net.*;
class Sender {
public static void main(String[] args) throws Throwable {
MulticastSocket socket = new MulticastSocket();
InetAddress groupAddress = InetAddress.getByName("239.192.0.1");
socket.send(new DatagramPacket(new byte[0], 0, groupAddress, 9999));
}
}
Чтобы разобраться в этом, я создал виртуальную сеть между двумя системами. Ответ на вопрос, нужен ли маршрут 224.0.0.0/4, зависит от приложения и конфигурации сети.
Эти ответы действительны для моего приложения, которое является слепым отправителем. Он не присоединяется ни к одной многоадресной группе, потому что он не заинтересован в получении трафика - он только отправляет его в другие системы, присоединенные к группе, в которую он отправляет. Таким образом, я не оценивал требования для присоединения к какой-либо конкретной группе многоадресной рассылки.
Сценарии следующие:
Приложение устанавливает сокет на определенный интерфейс перед отправкой (например, с помощью Java setNetworkInterface метод). Это не требует покрытия таблиц маршрутизации сети 224.0.0.0/4. Многоадресные пакеты будут передаваться через связанный интерфейс.
Приложение не устанавливает сокет на определенный интерфейс перед отправкой, и существует маршрут по умолчанию. Многоадресные пакеты будут передаваться через интерфейс, указанный в маршруте по умолчанию.
Приложение не устанавливает сокет на конкретный интерфейс перед отправкой, и маршрут по умолчанию не существует, но есть покрытие адреса группы многоадресной рассылки в таблице маршрутизации. Многоадресные пакеты будут передаваться по интерфейсу, указанному маршрутом, который покрывает групповой адрес многоадресной рассылки.
Приложение не устанавливает сокет на определенный интерфейс перед отправкой, и не существует маршрута, который бы охватывал адрес группы многоадресной рассылки. Приложение выйдет из строя, если «нет маршрута к хосту».
Бонусный сценарий: приложение не устанавливает сокет на определенный интерфейс, и как маршрут по умолчанию на одном интерфейсе, так и маршрут многоадресной рассылки на другой интерфейс существует, последний покрывает адрес группы многоадресной рассылки. По последнему интерфейсу будут передаваться многоадресные пакеты.
Кажется, ответ состоит в том, что многоадресный маршрут действительно необходим, если приложение не выбирает интерфейс для передачи. Он также вытесняет маршрут по умолчанию, что в ретроспективе имеет смысл. Похоже, что используется только интерфейсная часть маршрутов.
Обычно вам не нужен многоадресный маршрут. Не нужно.
Что значит netstat -gn
шоу? Соединения должны выходить из интерфейса с наименьшим номером eth0 по умолчанию.
См. Шаги, которые я отметил по адресу: Многоадресная рассылка, похоже, не работает на RHEL 5.5
Вам нужно только добавить маршрут, если ваш хост является многосетевым.
Видеть:
http://sourceforge.net/apps/trac/ganglia/wiki/Ganglia%203.1.x%20Installation%20and%20Configuration
В противном случае маршрут по умолчанию будет работать правильно.