Qual é a diferença entre os endereços bind, network (interface) e multicast?

4

O DatagramSocketImpl em Java tem um método joinGroup que recebe um endereço de soquete (IP e PORT) mais o endereço da interface (IP e PORT). Estou tentando entender a diferença e a finalidade de cada um desses três endereços na pilha multicast:

  1. Qual é o objetivo do endereço de ligação? Precisa de uma porta?
  2. Qual é o objetivo do endereço da interface? Precisa de uma porta?
  3. Qual é o objetivo do endereço multicast? Precisa de uma porta?

Estou confuso: não sei a diferença entre o endereço de ligação e o endereço da interface. Além disso, não tenho certeza se o endereço multicast realmente precisa de uma porta. Posso chamar o IP do endereço multicast do grupo de endereços multicast?

    
por chrisapotek 24.02.2012 / 16:03

1 resposta

3

Na verdade, existem três métodos que você mistura aqui. O primeiro é bind que é usado para ligar o socket a um endereço e porta especificados. Usando este método basicamente você abre uma porta udp e espera por dados para esta porta naquele endereço. O segundo é o método join que é usado para permitir que um soquete se una a um grupo multicast especificado. Um exemplo de um grupo multicast é 224.0.0.1 - o grupo multicast "Todos os hosts" - que aborda todos os hosts no mesmo segmento de rede. O terceiro método é joinGroup, que permite que um soquete se una a um grupo multicast especificado em uma interface de rede especificada. Como você pode ver, o método dois e três são usados para multicast IP e o método um é usado para UDP (não necessariamente em combinação com multicast). Ao ingressar em um grupo de multicast, o soquete pode receber datagramas enviados usando multicast de IP. Ambos podem, é claro, ser combinados, por exemplo, receber dados usando multicast e, se necessário, responder usando multicast (se os dados forem interessantes para todos os hosts do grupo) ou diretamente para o remetente (se os dados forem interessantes apenas para o remetente) .

  1. Quando você liga um soquete a um endereço usando o método bind, isso também envolve uma porta. Somente datagramas para esse endereço específico / combinação de portas são / podem ser recebidos, a menos que o soquete também se junte a um grupo multicast.

  2. Não sei ao certo como você chegou de joinGroup ao endereço da interface. O que você precisa é de um SocketAddress e uma NetworkInterface. A NetworkInterface pode ser recuperada pelo nome da interface (NetworkInterface.getByName) ou pelo endereço (NetworkInterface.getByInetAddress). No caso de getByInetAddress, você provavelmente poderia chamá-lo de endereço de interface, mas tudo o que ele faz é recuperar a NetworkInterface que possui o endereço especificado e, portanto, não usa um número de porta.

  3. Os endereços multicast são usados na difusão seletiva de IP, que é usada para enviar datagramas IP para um grupo de hosts (se eles estiverem interessados em receber os datagramas). Você pode usar uma porta (se você usa UDP), mas você não precisa. O CIDR dos endereços multicast IPv4 é 224.0.0.0/4 (224.0.0.0 - 239.255.255.255) e os endereços multicast IPv6 possuem o prefixo ff00 :: / 8. Cada endereço IP nesses intervalos representa um grupo multicast. Existem diferentes blocos de endereços multicast (e grupos multicast) que devem ser tratados de forma diferente. Por exemplo, 224.0.0.0/24 não devem ser roteados para fora de sua sub-rede de origem, enquanto 239.192.0.0/14 podem ser roteados e se roteados globalmente precisam ser encapsulados.

por 27.02.2012 / 01:07