# Le multicast
## C'est quoi?
C'est la diffusion de données d'un émetteur vers un groupe de récepteurs (on parle aussi de diffusion de groupe).
## Pourquoi?
Plus efficace par le fait qu'on envoie moins de données sur le support : on optimise ainsi la **bande passante**.
On peut dire aussi qu'il y a moins de traitements réalisés au niveau des hosts et les routeurs.
## A noter
Dans ce type de communication, l'émetteur ne connaît donc pas les adressses des destinataires puisqu'il envoie à un groupe de récepteurs.
## Les 3 types de transmission IP
### 1 - La transmission unicast
On l'appelle aussi la transmission **point à point**. Dans ce cas de figure, le paquet IP ne transite qu'entre l'émetteur et **1 seul destinataire.**
### 2 - La transmission broadcast
C'est la diffusion du paquet à tous les destinataires au sein du même **domaine de diffusion** [*(Définition, site de IONOS)*](https://www.ionos.fr/digitalguide/serveur/know-how/domaine-de-diffusion/), qui est délimité par les routeurs.
### 3 - La transmission multicast
Appelé aussi transmission **multipoint**. Ici les destinataires peuvent se situer dans différents réseaux.
```mermaid
graph TB
subgraph Unicast
E1[Émetteur] --> |Flux 1| R1[Router]
R1 --> |Flux 1| D1[Destinataire 1]
R1 --> |Flux 2| D2[Destinataire 2]
R1 --> |Flux 3| D3[Destinataire 3]
E1 --> |Flux 2| R1
E1 --> |Flux 3| R1
style E1 fill:#f9f,stroke:#333
style R1 fill:#ff9,stroke:#333
style D1 fill:#9ff,stroke:#333
style D2 fill:#9ff,stroke:#333
style D3 fill:#9ff,stroke:#333
end
subgraph Multicast
E2[Émetteur] --> |Flux unique| R2[Router]
R2 --> |Copie 1| D4[Destinataire 1]
R2 --> |Copie 2| D5[Destinataire 2]
R2 --> |Copie 3| D6[Destinataire 3]
style E2 fill:#f9f,stroke:#333
style R2 fill:#ff9,stroke:#333
style D4 fill:#9ff,stroke:#333
style D5 fill:#9ff,stroke:#333
style D6 fill:#9ff,stroke:#333
end
```
> Ce schéma montre la différence fondamentale entre un système à transmission multicast et unicast. Tout se joue sur l'optimisation de la bande passante : au lieu de générer autant de flux qu'il y ait de destinataires (ce qui consommera en bande passante), le multicast permet de réduire fortement cet aspect.
> Le routeur sera moins sollicité aussi par le nombre de flux qu'il doit traiter.
## Caractéristiques du multicast IP
* La standardisation du multicast IP s'est faite dans les RFC suivant : [RFC 1112](https://www.rfc-editor.org/rfc/rfc1112), [RFC 3228](https://www.rfc-editor.org/rfc/rfc3228) et [RFC 3376](https://www.rfc-editor.org/rfc/rfc3376).
* Un groupe multicast est identifié par une adresse de [classe D](https://fr.wikipedia.org/wiki/Classe_d'adresse_IP) .
* La localisation réseau des déstinataires importe peu dans une transmission multicast. En effet, les destinataires peuvent se situer dans différents réseaux et appartenir au même groupe de multicast.
* Pour informer d'une arrivée ou un départ d'un récepteur d'un groupe multicast, il faut que la station communique cela au routeur concerné via le protocole standardisé [IGMP (Internet Group Management Protocol)](https://www.ionos.fr/digitalguide/serveur/know-how/igmp-internet-group-management-protocol/)
* Un groupe multicast peut ne pas contenir de membres
* Un hôte peut appartenir à plusieurs groupes multicast
* L'émetteur n'est pas obligé d'appartenir à un groupe alors qu'un récepteur est forcément membre d'un groupe.
## Adressage
```mermaid
graph TB
subgraph Adresses_IP[Structure des Adresses IP]
IP[Adresses IPv4<br/>0.0.0.0 à 255.255.255.255]
IP --> Unicast[Adresses Unicast<br/>Ex: 192.168.1.1]
IP --> Multicast[Adresses Multicast<br/>224.0.0.0 à 239.255.255.255]
subgraph Plages_Unicast[Plages Unicast Principales]
Unicast --> ClassA[Classe A<br/>1.0.0.0 à 126.255.255.255]
Unicast --> ClassB[Classe B<br/>128.0.0.0 à 191.255.255.255]
Unicast --> ClassC[Classe C<br/>192.0.0.0 à 223.255.255.255]
end
subgraph Plages_Multicast[Plages Multicast]
Multicast --> Local[Local Network Control Block<br/>224.0.0.0 à 224.0.0.255]
Multicast --> InternetWork[InterNetwork Control<br/>224.0.1.0 à 238.255.255.255]
Multicast --> Reserved[Reserved<br/>239.0.0.0 à 239.255.255.255]
end
style IP fill:#f9f,stroke:#333
style Unicast fill:#9ff,stroke:#333
style Multicast fill:#ff9,stroke:#333
style ClassA fill:#e6f3ff,stroke:#333
style ClassB fill:#e6f3ff,stroke:#333
style ClassC fill:#e6f3ff,stroke:#333
style Local fill:#fff2cc,stroke:#333
style InternetWork fill:#fff2cc,stroke:#333
style Reserved fill:#fff2cc,stroke:#333
end
```
```mermaid
graph TB
subgraph Structure_Adresses[Différence Structurelle]
Unicast[Adresse Unicast] --> UN[Partie Network] & UH[Partie Host]
Multicast[Adresse Multicast] --> GID[ID Groupe Unique<br/>Pas de séparation Network/Host]
end
subgraph Paquet_IP[Structure Paquet IP Multicast]
IP[Paquet IP] --> SRC[Adresse Source:<br/>Toujours Unicast] & DST[Adresse Destination:<br/>Peut être Multicast]
end
style Unicast fill:#9ff,stroke:#333
style Multicast fill:#ff9,stroke:#333
style UN fill:#cef,stroke:#333
style UH fill:#cef,stroke:#333
style GID fill:#ffd,stroke:#333
style IP fill:#f9f,stroke:#333
style SRC fill:#cef,stroke:#333
style DST fill:#ffd,stroke:#333
```
```mermaid
graph TB
subgraph Structure_Adresses[Structure des Adresses IP]
subgraph Unicast[Structure Adresse Unicast]
U_Header[Adresse Unicast<br/>Ex: 192.168.1.10]
U_Header --> Network[Partie Réseau<br/>Ex: 192.168.1]
U_Header --> Host[Partie Hôte<br/>Ex: .10]
Network --> Masque[Masque de sous-réseau<br/>définit la séparation<br/>Ex: 255.255.255.0]
end
subgraph Multicast[Structure Adresse Multicast]
M_Header[Adresse Multicast<br/>Ex: 224.0.0.1]
M_Header --> GroupID[Identifiant de Groupe<br/>pas de séparation réseau/hôte<br/>Ex: tout l'ID 224.0.0.1<br/>identifie le groupe]
end
style U_Header fill:#9ff,stroke:#333
style Network fill:#cef,stroke:#333
style Host fill:#cef,stroke:#333
style Masque fill:#f9f,stroke:#333
style M_Header fill:#ff9,stroke:#333
style GroupID fill:#ffd,stroke:#333
end
```
## Mapping d'adressage
Il est important de comprendre comment se fait la correspondance entre les adresses IP multicast et les adresses ethernet multicast.
#### Multicast Ethernet
Les adresses multicast ethernet se fait de la manière suivante : *le bit de poids faible de l'octet du poids le plus fort, est à 1* . Ainsi, on obtient :
```
x1.xx.xx.xx.xx.xx
```
L'**IANA** a réservé un bloc spécifique pour l'adressage multicast dans un réseau ethernet: **00:00:5E:xx:xx:xx**. En appliquant le principe ci-dessus, la plage serait à partir de **01:00:5E:00:00:00** --> **01:00:5E:7F:FF:FF**.
```mermaid
graph TB
subgraph IP_Multicast[Structure Adresse IP Multicast]
IP[Adresse IP Multicast]
IP --> Prefix[Préfixe 1110<br/>4 bits]
IP --> GroupIP[ID Groupe IP<br/>28 bits]
style IP fill:#f9f,stroke:#333
style Prefix fill:#cef,stroke:#333
style GroupIP fill:#cef,stroke:#333
end
subgraph MAC_Multicast[Structure Adresse MAC Multicast]
MAC[Adresse MAC Multicast<br/>01:00:5E:XX:XX:XX]
MAC --> MACPrefix[Préfixe MAC<br/>25 bits<br/>01-00-5E-0]
MAC --> GroupMAC[ID Groupe MAC<br/>23 bits]
style MAC fill:#ff9,stroke:#333
style MACPrefix fill:#ffd,stroke:#333
style GroupMAC fill:#ffd,stroke:#333
end
subgraph Mapping[Mappage IP vers MAC]
Map[Mappage des bits]
Map --> Lost[5 bits perdus<br/>du groupe IP]
Map --> Used[23 bits utilisés<br/>pour l'adresse MAC]
Note[Plusieurs adresses IP<br/>peuvent correspondre à<br/>la même adresse MAC]
style Map fill:#d9f,stroke:#333
style Lost fill:#f99,stroke:#333
style Used fill:#9f9,stroke:#333
style Note fill:#fff,stroke:#333
end
GroupIP --> Lost
GroupIP --> Used
Used --> GroupMAC
```
### Remarque
La conséquence de ce mappage est que **32 (2^5) adresses IP multicast différentes** peuvent correspondre à la **même adresse MAC multicast.**
Cette limitation signifie que le filtrage au niveau Ethernet n'est pas aussi précis qu'au niveau IP, et les stations doivent effectuer un filtrage supplémentaire au niveau IP pour s'assurer qu'elles ne reçoivent que le trafic multicast qui les intéresse.
## Multicast au sein d'un LAN
```mermaid
graph TB
subgraph LAN[Exemple de multicast dans un réseau local]
SRC[Source Multicast<br/>192.168.1.10] -->|"Paquet Multicast<br/>Dest: 224.0.0.1<br/>MAC: 01:00:5E:00:00:01"| SW{Switch}
SW -->|"1. IGMP Join<br/>2. Copie du flux"| PC1[PC1<br/>Membre du groupe<br/>IGMP Join envoyé]
SW -->|"1. IGMP Join<br/>2. Copie du flux"| PC2[PC2<br/>Membre du groupe<br/>IGMP Join envoyé]
SW -.->|"Pas de copie<br/>Non membre"| PC3[PC3<br/>Non membre<br/>Pas d'IGMP Join]
SW -->|"1. IGMP Join<br/>2. Copie du flux"| PC4[PC4<br/>Membre du groupe<br/>IGMP Join envoyé]
style SRC fill:#f9f,stroke:#333
style SW fill:#ff9,stroke:#333
style PC1 fill:#9f9,stroke:#333
style PC2 fill:#9f9,stroke:#333
style PC3 fill:#f99,stroke:#333
style PC4 fill:#9f9,stroke:#333
end
```
Dans un environnement LAN, le processus commence par l'adhésion des machines au groupe multicast qui les intéresse. Pour cela, elles utilisent le protocole IGMP (Internet Group Management Protocol) en envoyant un message "IGMP Join" vers l'adresse du groupe multicast désiré. Le switch, équipé de la fonctionnalité "IGMP snooping", écoute ces messages et maintient une table de correspondance entre les ports et les groupes multicast.
Lorsqu'une source souhaite transmettre des données au groupe, elle envoie un seul flux de données vers l'adresse multicast du groupe. Le switch, grâce à sa table d'adhésion construite via IGMP snooping, sait exactement quels ports hébergent des membres du groupe. Il peut ainsi dupliquer intelligemment le flux uniquement vers ces ports spécifiques. Les machines non membres du groupe, bien que physiquement connectées au même réseau, ne reçoivent aucune donnée du flux multicast.
### Avantages dans le LAN :
* Économie de bande passante : un seul flux depuis la source
* Filtrage efficace au niveau du switch
* Pas besoin de routeur pour le multicast local
* Les stations non intéressées ne sont pas impactées
## Multicast à l'échelle Internet
```mermaid
graph TB
subgraph LAN_A[Site Multicast A]
SRC[Source Multicast] -->|Flux| MR1[MRouteur A]
H1[Hôte 1] -->|IGMP Join| MR1
end
subgraph LAN_B[Site Multicast B]
H2[Hôte 2] -->|"1. IGMP Join"| MR2[MRouteur B]
H3[Hôte 3] -->|"1. IGMP Join"| MR2
end
subgraph Internet[Infrastructure Internet]
Cloud((Réseau Unicast<br/>Internet))
end
MR1 -.->|"2. Tunnel Multicast"| Cloud
Cloud -.->|"3. Tunnel Multicast"| MR2
style SRC fill:#f9f,stroke:#333
style MR1 fill:#ff9,stroke:#333
style MR2 fill:#ff9,stroke:#333
style H1 fill:#9f9,stroke:#333
style H2 fill:#9f9,stroke:#333
style H3 fill:#9f9,stroke:#333
style Cloud fill:#ddd,stroke:#333
```
Dans ce cas de figure, où les groupes multicasts sont situés dans des différents réseaux à différents endroits de la planète, les **Mrouteur** (formant le réseau *Mbone = backbone multicast*) jouent un rôle important dans l'achemeninement du flux. Ces routeurs spéciaux comprennent le protocole IGMP qui est utilisé par les hôtes pour informer ceux-ci de leur appartenance à un groupe.
Une subtilité qu'il y a, c'est que tous les routeurs dans Internet n'implémentent pas le protocole IGMP. C'est pour contourner cela qu'on fait appel à du **tunneling Multicast over Unicast** : encapsulant l'IP multicast dans de l'IP unicast pour pouvoir traverser ces routeurs non-multicast.
## Le protocole IGMP
Comme annoncé auparavant, c'est le protocole qui permet au routeur de savoir de **façon dynamique** s'il existe des hôtes dans les groupes multicast au sein d'un réseau auquel il est connecté.
IGMP est standardisé en plusieurs versions dans les [RFC 1112 - v1](https://www.rfc-editor.org/rfc/rfc1112) et [RFC 2236 - V2](https://www.rfc-editor.org/rfc/rfc2236). Le paquet IGMP est encapsulé dans un paquet IP permettant la communication entre le routeur et les hôtes de la manière suivante :
```mermaid
sequenceDiagram
Routeur->>Hôte: Request (requête)
Hôte->>Routeur: Report (rapport)
```
### Format de paquet IGMP

### Remarque
Comme IGMP est encapsulé dans IP, le module IP identifiera ce paquet IGMP grâce au **champ protocole** qui vaudra **2** dans le paquet IP.
Voici un diagramme illustrant les phases importantes pendant la communication IGMP.
### Les phases importantes de IGMP
```mermaid
sequenceDiagram
participant Host as Hôte
participant LocalRouter as Routeur de groupe local
participant OtherRouters as Autres routeurs de groupe
Note over Host: Phase 1 : Rejoindre un groupe
Host->>LocalRouter: Diffuse un rapport IGMP
LocalRouter->>LocalRouter: Reçoit le message et détermine le routage
LocalRouter->>OtherRouters: Communique les informations aux autres routeurs
Note over LocalRouter: Phase 2 : Vérification périodique
LocalRouter->>Host: Interroge périodiquement pour vérifier l'appartenance
Host-->>LocalRouter: Réponse (si toujours dans le groupe)
Note over Host, LocalRouter: Une seule réponse par groupe est suffisante
```
> Quand un hôte rejoint un groupe, il envoie un rapport (REPORT) IGMP au routeur de son sous-réseau via IGMP. Le routeur ayant reçu cette information, diffuse ensuite celle-ci aux autres Mrouters.
> La deuxième phase consiste en la vérification périodique des groupes par le routeur (REQUEST), pour s'assurer qu'il y a **au moins 1 hôte** existant au sein de chaque groupe, sinon il le relâche.
> Pour éviter la saturation des réseaux, il suffit qu'un seul hôte réponde pour que le routeur garde le groupe dans sa table.
### La version 2, qu'a-t-elle amené de plus?
L'amélioration apportée par la version 2 de IGMP c'est l'annonce de **départ ou désabonnement** d'une station. Ainsi, quand un hôte quitte un groupe multicast, il envoie un message **IGMP MEMBERSHIP LEAVE** à tous les Mrouters du sous-réseau via l'adresse réservée **224.0.0.2**.
Aussitôt que le routeur recoit ce message, il envoie donc une requête au groupe concerné pour savoir s'il reste au moins un hôte.
* Il faut savoir que le temps de réponse maximal à un REQUEST (QUERY) est modifiable.