Devo criar uma rota multicast no RHEL / CentOS para um remetente cego?

3

Um sistema CentOS 5 não parece sair da caixa com uma rota para o tráfego multicast. O que faz parece fazer é usar uma rota padrão, se configurada. Em outras palavras, uma tabela de roteamento como esta:

# 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

funcionará com meu aplicativo cliente multicast baseado em Java (ou o caso de teste abaixo), que espera poder enviar para um endereço multicast local-local.

Esta configuração funciona. Se eu não tiver uma rota padrão, por exemplo,

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

meu aplicativo Java falhará quando tentar enviar. Eu posso corrigir isso adicionando a rota multicast:

# route add -net 224.0.0.0/4 via eth0

E para fazer o acima permanentemente:

# echo 224.0.0.0/4 via eth0 >>/etc/sysconfig/network-scripts/route-eth0

Devo criar esta rota mesmo assim? Há algum problema em permitir que a rota padrão manipule o tráfego multicast, além do fato de que ela pararia de funcionar se a rota padrão fosse embora?

Aqui está um breve caso de teste que pode ser executado executando javac Sender.java; java Sender . Ele envia um pacote UDP de 0 byte para o endereço local do site 239.192.0.1. Se eu não tiver uma rota padrão no lugar, ela falhará com

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)

No entanto, se uma rota padrão (ou a rota multicast mencionada acima) estiver presente, ela enviará o pacote com sucesso para 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));
    }
}
    
por zigg 01.04.2013 / 19:36

3 respostas

0

Para chegar ao fim, criei uma rede virtual entre dois sistemas. A resposta para saber se a rota 224.0.0.0/4 é necessária depende da configuração da aplicação e da rede.

Essas respostas são válidas para meu aplicativo, que é um remetente cego. Ele não se junta a nenhum grupo de multidifusão, porque não está interessado em receber tráfego - enviando-o somente para outros sistemas associados ao grupo para o qual está enviando. Portanto, não avaliei os requisitos para ingressar em nenhum grupo de multidifusão específico.

Os cenários são os seguintes:

  1. O aplicativo define o soquete para uma interface específica antes de enviar (por exemplo, com Java setNetworkInterface método). Isso não requer nenhuma cobertura de tabela de roteamento da rede 224.0.0.0/4. Pacotes multicast serão transmitidos na interface vinculada.

  2. O aplicativo não configura o soquete para uma interface específica antes do envio e existe uma rota padrão. Os pacotes multicast serão transmitidos na interface especificada pela rota padrão.

  3. O aplicativo não configura o soquete para uma interface específica antes do envio e não existe uma rota padrão; no entanto, há cobertura do endereço do grupo de multicast na tabela de roteamento. Pacotes multicast serão transmitidos na interface especificada pela rota que cobre o endereço do grupo multicast.

  4. O aplicativo não configura o soquete para uma interface específica antes do envio e não existe rota que cubra o endereço do grupo multicast. O aplicativo falhará com "nenhuma rota para hospedar".

  5. Cenário de bônus: o aplicativo não define o soquete para uma interface específica e uma rota padrão em uma interface e uma rota multicast na outra interface existem, o último cobrindo o endereço do grupo multicast. Os pacotes multicast serão transmitidos na última interface.

A resposta parece ser que uma rota multicast é realmente necessária se o aplicativo não selecionar uma interface para transmitir. Também previne a rota padrão, que em retrospectiva faz sentido. Apenas a parte da interface das rotas parece ser usada.

    
por 03.04.2013 / 18:28
0

Você só precisa adicionar uma rota em seu host com hospedagem múltipla.

Veja:

link

Caso contrário, a rota padrão fará o correto.

    
por 01.04.2013 / 20:08
0

Você normalmente não quer uma rota multicast no lugar. Não é necessário.

O que netstat -gn mostra? As joins devem sair da interface de menor número eth0 por padrão.

Veja as etapas que observei em: Multicast não parece estar funcionando no RHEL 5.5

    
por 02.04.2013 / 16:37