Le multicast, ou multidiffusion, permet la diffusion vers plusieurs partenaires sur un réseau. Ces partenaires ont, en plus de leur adresse IP de classe A, B ou C (adresse privée), une adresse de multicast : l'adresse de groupe. Cette adresse est de classe D, c'est à dire qu'elle se trouve dans la plage allant de 224.0.0.0 jusqu'à 239.255.255.255.
Lorsqu'une application s'adresse à une adresse de groupe, tous les éléments du réseau (ordinateur, imprimante, switch managable, routeur, etc.) qui font partie de ce groupe réceptionnent la trame TCP/IP.
Pour simplifier on peut dire que le multicast est un broadcast sélectif.
On parle de multicast statique lorsque, dans un même réseau, on définit une adresse de groupe pour atteindre certains éléments du réseau.
C'est à dire que les différents éléments du réseau sont configurés pour accepter des trames TCP/IP adressées à une adresse de groupe.
On peut imaginer, par exemple, un cluster de PC au sein d'un réseau. Pour la communication entre ces PC, sachant que le nombre de PC pourrait être amené à varier, le plus simple est de définir une adresse unique à laquelle tous les PC du cluster répondent : une adresse de groupe ⇒ le multicast est né.
Le fait de n'avoir qu'une seule adresse permet de ne pas avoir à gérer la liste des adresses IP de tous les PC du cluster. Il suffit qu'un PC fasse partie du groupe multicast pour faire partie du cluster.
En parlant de cluster, le multicast est utilisable pour heartbeat
Le noyau Linux que vous utilisez doit être compilé avec l'option CONFIG_IP_MULTICAST activée. pour le vérifier :
cat /boot/config-`uname -r` | grep CONFIG_IP_MULTICAST
CONFIG_IP_MULTICAST=y
Si CONFIG_IP_MULTICAST=n, vous devez recompiler votre noyau en activant cette option ou en installer une version avec cette option activée.
Par défaut Ubuntu est configuré de sorte de ne pas activer les fonctions multicast. Pour vérifier cela :
sysctl net.ipv4.icmp_echo_ignore_broadcasts
net.ipv4.icmp_echo_ignore_broadcasts = 1
Les fonctionnalités multicast sont désactivées.
Pour les activer :
sudo sysctl net.ipv4.icmp_echo_ignore_broadcasts=0
net.ipv4.icmp_echo_ignore_broadcasts = 0
Vérifions que le multicast est fonctionnel :
ping 224.0.0.1 -c 3
PING 224.0.0.1 (224.0.0.1) 56(84) bytes of data. 64 bytes from 192.168.1.141: icmp_seq=1 ttl=64 time=0.037 ms 64 bytes from 192.168.1.200: icmp_seq=1 ttl=64 time=1.94 ms (DUP!) 64 bytes from 192.168.1.141: icmp_seq=2 ttl=64 time=0.025 ms 64 bytes from 192.168.1.200: icmp_seq=2 ttl=64 time=1.76 ms (DUP!) 64 bytes from 192.168.1.141: icmp_seq=3 ttl=64 time=0.024 ms --- 224.0.0.1 ping statistics --- 3 packets transmitted, 3 received, +2 duplicates, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 0.024/0.760/1.949/0.898 ms
→ Explications : l'adresse IP 224.0.0.1 est une adresse pour atteindre tous les partenaires du réseau qui gèrent du multicast.
l'adresse IP de mon PC est 192.168.1.141, mon PC répond. Mais l'adresse 192.168.1.200 répond aussi au ping, c'est mon routeur ADSL, il gère le multicast et donc il répond à l'adresse 224.0.0.1 lui aussi.
Pour faire en sorte que cette modification reste même après un redémarrage, il faut éditer le fichier /etc/sysctl.conf et remplacer
# Ignore ICMP broadcasts #net.ipv4.icmp_echo_ignore_broadcasts = 1
par
# Ignore ICMP broadcasts net.ipv4.icmp_echo_ignore_broadcasts = 0
L'outil qui sert à rejoindre une adresse de groupe multicast est smcroute. Il se lance comme un daemon et gère le multicast.
Installez le paquet smcroute.
Pour rejoindre (Join) l'adresse de groupe 239.0.0.10 :
sudo smcroute -j eth0 239.0.0.10
Pour quiter (Leave) l'adresse de groupe 239.0.0.10 :
sudo smcroute -l eth0 239.0.0.10
Pour l'exemple, j'ai utilisé une machine virtuelle dans VMware-player qui est membre de l'adresse de groupe 239.0.0.10. J'ai fait en sorte que la carte virtuelle vmnet8 qui relie mon PC au PC virtuel dans VMware-player rejoigne la même adresse de groupe, puis j'ai « pingué » cette adresse pour vérifier.
Avant l'opération, seul le PC virtuel répond au ping. Puis mon PC rejoint l'adresse de groupe. Et enfin les 2 PC répondent au ping.
ping 239.0.0.10 -c 3 -I vmnet8
PING 239.0.0.10 (239.0.0.10) from 192.168.214.1 vmnet8: 56(84) bytes of data. 64 bytes from 192.168.214.10: icmp_seq=1 ttl=64 time=0.602 ms 64 bytes from 192.168.214.10: icmp_seq=2 ttl=64 time=0.303 ms 64 bytes from 192.168.214.10: icmp_seq=3 ttl=64 time=0.415 ms --- 239.0.0.10 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 0.303/0.440/0.602/0.123 ms
sudo smcroute -j vmnet8 239.0.0.10 ping 239.0.0.10 -c 3 -I vmnet8
PING 239.0.0.10 (239.0.0.10) from 192.168.214.1 vmnet8: 56(84) bytes of data. 64 bytes from 192.168.214.1: icmp_seq=1 ttl=64 time=0.042 ms 64 bytes from 192.168.214.10: icmp_seq=1 ttl=64 time=0.329 ms (DUP!) 64 bytes from 192.168.214.1: icmp_seq=2 ttl=64 time=0.047 ms 64 bytes from 192.168.214.10: icmp_seq=2 ttl=64 time=0.326 ms (DUP!) 64 bytes from 192.168.214.1: icmp_seq=3 ttl=64 time=0.046 ms --- 239.0.0.10 ping statistics --- 3 packets transmitted, 3 received, +2 duplicates, 0% packet loss, time 1999ms rtt min/avg/max/mdev = 0.042/0.158/0.329/0.138 ms
(source)
Adresse | Description | Adresse | Description |
---|---|---|---|
224.0.0.0 | Adresse de base (réservée) | 224.0.1.14 | IETF-2-AUDION |
224.0.0.1 | Tous les systèmes multicast sur ce sous-réseau | 224.0.1.15 | IETF-2-VIDEO |
224.0.0.2 | Tous les routeurs multicast sur ce sous-réseau | 224.0.1.16 | MUSIC-SERVICE |
224.0.0.3 | Non affecté | 224.0.1.17 | SEANET-TELEMETRY |
224.0.0.4 | Routeurs DVMRP | 224.0.1.18 | SEANET-IMAGE |
224.0.0.5 | Tous les routeurs OSPFIGP | 224.0.1.19 | MLOADD |
224.0.0.6 | Routeurs spécifiés OSPFIGP | 224.0.1.20 | Expérimentations privées |
224.0.0.7 | Routeurs ST | 224.0.1.21 | DVMRP on MOSPF |
224.0.0.8 | Hôtes ST | 224.0.1.22 | SVRLOC |
224.0.0.9 | Routeurs RIP2 | 224.0.1.23 | XINGTV |
224.0.0.10 | IGRP | 224.0.1.24 | Microsoft-ds |
224.0.0.11 | Agents mobiles | 224.0.1.25 | Nbc-pro |
224.0.0.13 | Tous les routeurs multicast qui support le protocole PIM-SM sur ce réseau | 224.0.1.26 | Nbc-pnf |
224.0.0.14-255 | Non affectés | 224.0.1.27-255 | Non affectés |
224.0.1.0 | Groupes de gestionnaires VMTP | 224.0.2.1 | Groupe « rwho » (BSD, non officiel) |
224.0.1.1 | Network Time Protocol | 224.0.2.2 | SUN RPC PMAPPROC_CALLIT |
224.0.1.2 | SGI-Dogfight | 224.0.3.0-255 | Service générique RFE |
224.0.1.3 | Rwhod | 224.0.4.0-255 | Conférences individuelles RFE |
224.0.1.4 | VNP | 224.0.5.0-127 | Groupes CDPD |
224.0.1.5 | Artificial Horizons-Aviator | 224.0.5.128-255 | Non affectés |
224.0.1.6 | Name Service Server | 224.0.6.0-127 | Projet ISIS de Cornell |
224.0.1.7 | AUDIONEWS | 224.0.6.128-255 | Non affecté |
224.0.1.8 | Service d’informations SUN NIS+ | 224.1.0.0-255.255 | Groupes multidiffusion ST |
224.0.1.9 | Multicast transport protocol | 224.2.0.0-255.255 | Appels conférences multimédias |
224.0.1.10 | IETF-1-LOW-AUDIO | 224.252.0.0-255.255.255 | Groupes transcient DIS |
224.0.1.11 | IETF-1-AUDION | 232.0.0.0-255.255.255 | Groupes transcient VMTP |
224.0.1.12 | IETF-1-VIDEO | ||
224.0.1.13 | IETF-2-LOW-AUDIO |
Masque de réseau multicast en IPV6: ff00::/8 Ajoutez ceci a vos règles ip6tables pour en profiter
ip6tables -A INPUT -d ff00::/8 -j ACCEPT
Et éventuellement
ip6tables -A OUTPUT -s ff00::/8 -j ACCEPT