Le multicast Le multicast permet d atteindre un groupe d usagers en même temps: Participants à une conférences audio et vidéo Classe virtuelle Utilise les adresses mutipoint Une source émet un seul paquet à tous Économie de bande passante. Multicast 1 Adresses multicast Une adresse (de groupe) représente plusieurs utilisateurs. Permet de pallier aux gains de capacité requise pour le multimédia. (9 paquets) E R1 Unicast R2 R3 R4 E R1 Multicast R2 R3 R4 (4 paquets) Multicast 2
Le réseau Mbone Réseau virtuel de LAN et des tunnels reliant des routeurs muticast. Les tunnels reliant ces réseaux sont des liaisons unipoint. Les routeurs multicast exécutent un démon spécialisé (mrouted). Les paquets multicast sur les tunnels sont encapsulés dans des paquets unipoint. Multicast 3 Le réseau Mbone Réseau multipoint routeur multicast Tunnel Multicast 4
Adresses multicast Un groupe multicast possède une adresse de Classe D dans l'ensemble: 224.0.0.0-239.255.255.255 Les adresses 224.0.0.0-224.0.0.255 sont réservées aux informations des protocoles de routage multicast (ex. IGMP). Il n'est pas nécessaire d'être membre d'un groupe pour envoyer des datagrammes au groupe. Multicast 5 Adresses spéciales Adresses de classe A,B, C spéciales: 0.0.0.0 Cette machine (this host) 0.1.1.25 La machine 1.1.25 sur ce LAN-ci 255.255.255.255 Adresse broadcast sur le LAN 193.1.1.255 Adresse broadcast sur le réseau 193.1.1 127.x.x.x: Boucle locale Différences entre braodact et multicast: Broadcast: tout le monde sur le réseau. Multicast: tous les membres d'un groupe. Adresse broadcast: FF:FF:FF:FF:FF:FF Multicast 6
Trames en unicast Sendto Dest : 128.7.6.5 Dest. Port: 7433 Port: 7433 128.7.6.99 128.7.6.255 128.7.6.5 128.7.6.255 08:00:20:03:f6:42 02:60:8c:2f:4e:00 128.7.6 02:60:8c:2f:4e:00 128.7.6.5 7433 Dest. Dest Port Dest Multicast 7 Transfert en broadcast L'interface effectue l'association broadcast - broadcast. Sendto Dest. : 128.7.6.255 Dest. Port: 520 Port: 520 128.7.6.99 128.7.6.255 128.7.6.5 128.7.6.255 08:00:20:03:f6:42 02:60:8c:2f:4e:00 128.7.6 ff:ff:ff:ff:ff:ff 128.7.6.255 520 Dest Dest. Port Dest Multicast 8
Associations d'adresses multicast Il existe une association entre adresses multicast et adresses multicast. 23 bits Adresse de groupe classe D: e Adresse multicast Ethernet de : 01 00 5e 0 Multicast 9 Transfert multicast de trames Sendto Dest : 224.0.1.1 Dest. Port: 123 Port: 123 Join: 224.0.1.1 02:60:8c:2f:4e:00 01:00:5e:00:01:01 224.0.1.1 123 Receive: 01:00:5e:00:01:01 08:00:20:03:f6:42 128.7.6 Dest Dest Dest Port Multicast 10
ications muticast Il existe plusieurs types d'applications multicast: Vidéoconférence Distribution en masse Enseignement à distance Tableau blanc Audio: Visual Audio Tool (VAT), Network Voice Terminal (NVT) Vidéo: Network Video, INRIA Videoconferencing System (IVS) Contrôle de sessions: Session Directory (SD) Multicast 11 Programmtion du multicast Spécifier le TTL désiré (déf. 1) unsigned char ttl; setsockopt(sock,proto_,_multicast_ttl, &ttl,sizeof(ttl)); Joindre le groupe avant de recevoir: struct ip_mreq { struct in_addr imr_multiaddr; /* groupe à joindre */ struct in_addr imr_interface; /* interface à utiliser */ } struct ip_mreq mreq; setsockopt(sock, PROTO_, _ADD_MEMBERSH, &mreq,sizeof(mreq)); Multicast 12
Valeurs de TTL Le TTL est utilisé pour déterminer la distance à parcourir par les paquets pour le multicast (par défaut 1): 0: Même machine 1: Même sous-réseau 32: Même site 64: Même région 128: Même continent 255: Aucune restriction Multicast 13 Transfert de données On utilise généralement pour le transfert de données (multimédia et temps réekl) e multicast L'envoi de message avec sendto() vers l'adresse de groupe multicast. Pour a réception, le récepteur doit d'abord joindre le groupe multicast et recevoir avec la fonction rcvfrom(). Un port est utilisé pour lier une adresse à plusieurs récepteurs. Multicast 14
Exemple : un émeteur #include #include <sys/types.h> <sys/types.h> #include #include <sys/socket.h> <sys/socket.h> #include #include <netinet/in.h> <netinet/in.h> #include #include <arpa/inet.h> <arpa/inet.h> On construit une socket et on émet #include #include <time.h> <time.h> un message toutes les secondes dans une #include #include <string.h> <string.h> socket d'adresse multicast. #include #include <stdio.h> <stdio.h> #define #definehello_port 12345 12345 #define #definehello_group "225.0.0.37" "225.0.0.37" main(int main(int argc, argc, char char *argv[]) *argv[]) {{ struct struct sockaddr_in sockaddr_in addr; addr; int int fd, fd, cnt; cnt; struct struct ip_mreq ip_mreq mreq; mreq; char char *message="hello, *message="hello, World!"; World!"; if if ((fd=socket(af_inet,sock_dgram,0)) < 0) 0) exit(1); exit(1); memset(&addr,0,sizeof(addr)); addr.sin_family=af_inet; Multicast 15 Exemple : un émeteur addr.sin_addr.s_addr=inet_addr(hello_group); addr.sin_port=htons(hello_port); while while (1) (1){ { if if (sendto(fd,message,sizeof(message),0, (struct (struct sockaddr sockaddr *) *)&addr, sizeof(addr)) sizeof(addr)) < 0) 0) exit(1); exit(1); sleep(1); sleep(1); }} }} Multicast 16
Exemple : un récepteur #include #include <sys/types.h> <sys/types.h> #include #include <sys/socket.h> <sys/socket.h> #include #include <netinet/in.h> <netinet/in.h> #include #include <arpa/inet.h> <arpa/inet.h> #include #include <time.h> <time.h> #include #include <string.h> <string.h> #include #include <stdio.h> <stdio.h> #define #definehello_port 12345 12345 #define #definehello_group "225.0.0.37" "225.0.0.37" #define #definemsgbufsize 256 256 main(int main(int argc, argc, char char *argv[]) *argv[]) {{ struct struct sockaddr_in sockaddr_in addr; addr; int int fd, fd, nbytes,addrlen; nbytes,addrlen; struct struct ip_mreq ip_mreq mreq; mreq; char char msgbuf[msgbufsize]; if if ((fd=socket(af_inet, ((fd=socket(af_inet, SOCK_DGRAM,0)) SOCK_DGRAM,0)) < 0) 0) exit(1); exit(1); Multicast 17 Exemple : un récepteur memset(&addr,0,sizeof(addr)); addr.sin_family=af_inet; addr.sin_addr.s_addr=htonl(inaddr_any); addr.sin_port=htons(hello_port); if if (bind(fd,(struct (bind(fd,(struct sockaddr sockaddr *) *)&addr, sizeof(addr)) sizeof(addr)) < 0) 0) exit(1); exit(1); mreq.imr_multiaddr.s_addr=inet_addr(hello_group); mreq.imr_interface.s_addr=htonl(inaddr_any); if if (setsockopt(fd,proto_, _ADD_MEMBERSH, &mreq, &mreq, sizeof(mreq)) sizeof(mreq)) < 0) 0) exit(1); exit(1); while while (1) (1){ { addrlen=sizeof(addr); addrlen=sizeof(addr); if if ((nbytes=recvfrom(fd,msgbuf,msgbufsize,0, (struct (struct sockaddr sockaddr *) *)&addr,&addrlen)) < 0) 0) exit(1); exit(1); puts(message); puts(message); }} }} Multicast 18