Vous êtes sur la page 1sur 19

Master R&S

Universit Abdelmalek Essaadi

Master Option : Rseaux et Systmes

Rapport de mini projet Thme : Sockets Multicast

Encadr par : -MR : Mhamed AIT KBIR

Raliser par : -HASSANI Mohamed -MOUCH Mohammed -MERIMI Mohammed -NOUNOU Hicham

2008-2009
1 /19

Master R&S

Sommaire

I)-Introduction ------------------------------------------------------------------------3 1-Rappel : l'unicast et le broadcast---------------------------------------------3 2-Le multicast--------------------------------------------------------------------4 3-Adresse multicast de niveau 2 couche liaison ------------------------5 a-Mappage IP/MAC----------------------------------------------------------5 II)-Emission/rception de paquets multicast sur une machine ---------------6 Limitation de la diffusion --------------------------------------------------6 Se joindre un groupe ------------------------------------------------------7 Pour quitter un groupe ------------------------------------------------------7 Dialogue machine utilisateur / routeur multicast------------------------8

III)-Mise en place ------------------------------------------------------------------10 1- Configuration de Routeur Multicast--------------------------------------11 2- Socket Client ------------------------------------------------------------13 3- Socket Serveur ----------------------------------------------------------16

2 /19

Master R&S

I)-Introduction
Le concept du multicast est n dans les annes 90. Steve Deering, dans le RFC 988, dcrit cette nouvelle mthode de transmission de datagrammes IP vers des groupes de machines. Deux autres versions de ce RFC ont suivi dont le RFC 1112 datant du mois d'aot 1989. Le premier tunnel a t tabli durant l't 1988, entre deux universits amricaines. Les premires expriences ont pu commencer. Il s'agissait de transmettre de l'audio grce au multicast. Ne disposant pas de routeurs Multicast , ils se sont rapidement aperus qu'il tait plus simple, pour l'expansion du rseau, de mettre en place des tunnels (change multicast via une liaison unicast) plutt que de demander de modifier les fonctionnalits de l'ensemble des routeurs. Le nom de Mbone (Dorsale Multicast) date de juillet 1992 et a t attribue la runion de l'IETF (Internet Engineering Task Force). Depuis, les expriences n'ont cess de se multiplier, crant progressivement un rseau virtuel bti au-dessus de l'Internet, appel le MBone. Le multicast s'avre des plus intressant pour toutes les applications gourmandes en bande passante : conversation audio plusieurs, diffusion de vido-confrence, diffusion de radio, tlvision... En effet le nombre de paquet circulant sur le rseau est largement diminu par rapport des dialogues unicast.

1-Rappel : l'unicast et le broadcast


Dans l'Internet, lorsque l'on dsire changer des donnes entre des machines, on utilise principalement l'unicast pour communiquer entre deux machines. L'unicast permet a une machine, dite source, d'envoyer des paquets vers une seule machine destinataire. Chaque machine possde une adresse Internet (IP) et l'change n'est possible entre applications que grce au couple (adresse IP/numro de port) des deux entits en jeu. Le numro de port de la destination (le serveur) doit tre un numro connu ( well known port ) l'expditeur (le client), il est associe un service rseau. Par contre le numro de port de l'expditeur peut tre attribu dynamiquement par le systme d'exploitation du client. Le broadcast permet une machine d'envoyer des paquets toutes les machines d'un rseau local.
3 /19

Master R&S

2-Le multicast
Le concept du multicast permet d'envoyer des paquets non plus destination d'une seule machine mais vers un groupes de machines. Pour cela on dfinit une adresse de groupe de machines. Un groupe est un ensemble de zro ou plus de machines. Il est reprsent/dsign par une adresse IP dite multicast. L'ensemble des membres d'un groupe est entirement dynamique. Cela signifie que toute machine peut, tout moment, se joindre au groupe ou bien le quitter. Il n'y a absolument aucune restriction sur le nombre de membres d'un groupe ainsi que sur leur localisation physique. Une machine peut tre en mme temps membre de plusieurs groupes. Il n'est toutefois pas ncessaire d'tre membre d'un groupe pour y envoyer des datagrammes. Un groupe multicast peut tre permanent ou non. Un groupe permanent est en fait un groupe qui possde une adresse assigne par une autorit. Il faut bien comprendre que c'est l'adresse qui est permanente et non pas l'ensemble des membres d'un groupe : tout moment un groupe permanent peut avoir n'importe quel nombre de membres y compris zro ! Les adresses IP, non assignes des groupes permanents peuvent tre utilises pour les groupes temporaires qui n'existent que tant qu'ils possdent des membres. Concrtement, les adresses IP disponibles pour le multicast sont les adresses IP de classe D comprises entre : 224.0.0.0 et 239.255.255.255. Cela reprsente approximativement 250 millions d'adresses. Remarque: Le multicast nest pas support par tous les gammes de routeurs.

4 /19

Master R&S

3-Adresse multicast de niveau 2


Les spcifications IEEE 802.3 dfinissent un bit dindication de ladresse de trame multicast. Normalement une carte rseau (NIC) rpond soit son adresse MAC, soit ladresse de broadcast de niveau 2 (0xFFFF.FFFF.FFFF). Le groupe dadresse 0100.5E00.0000 0100.5E7F.FFFF est rserv pour des adresses multicast de niveau 2. Derrire ces 25 bits de prfix (01:00:5E:0-7), restent 23 bits dadresse MAC disponibles pour faire correspondre un groupe multicast de niveau 3 (exemple : 224.90.21.1) une adresse multicast de niveau liaison de donne. On prendra les 23 bits de niveau faible de ladresse de niveau 3 du groupe. Exemple sur ladresse prcdente : 01:00:5E:3A:15:01 (3a:15:01 correspondant 90.21.1). Comme les adresses de groupe multicast de niveau 3 sont sur 28 bits (32-4 (1110)), les 5 bits de niveau haut de ces adresses sont mapps sur la mme adresse multicast de niveau 2. Ces 32 groupes sont le rsultat dune part des 4 premiers bits de loctet quatre de ladresse IP (qui donnent 16 valeurs) faisant varier cette plage de 255 239, dautre part du dernier bit de loctet trois qui oscille entre 0 et 128. On a donc 2*16=32 groupes IP qui correspondent au mme groupe de niveau 2.

Mappage des adresses IP multicast et MAC


Donc cela veut dire que pour une adresse MAC Multicast, le bit de poids faible de l'octet de poids fort sera gal En ralit, une adresse MAC Multicast commence toujours par 01-00-5E-XX-XX-XX. Pour la partie Zone Vendeur, l'adresse Multicast est construite partir de l'adresse IP. Les 23 bits de poids faible de l'adresse IP Multicast sont transfrs dans les 23 bits de poids faible de l'adresse MAC.

5 /19

Master R&S

Ainsi, pour l'adresse IP multicast 224.77.3.44, nous dterminons l'adresse MAC suivante :

Dans notre cas, voici le mappage IP-MAC pour chaque adresse multicast utilise :

II)-Emission/rception de paquets multicast


Le multicast est implmente dans l'interface classique des sockets. A l'heure actuelle, seuls les sockets AF INET de type SOCK DGRAM ou SOCK RAW sont supportes. Limitation de la diffusion : On peut limiter la diffusion des paquets multicast grce au champ TTL(Time To Live ou dure de vie) de l'entte IP. A chaque socket multicast est associe un TTL, qui par dfaut prend la valeur 1 correspondant au sous-rseau local. Le TTL permet de contrler la porte de l'mission.

6 /19

Master R&S

Ceux sont les routeurs multicast qui donnent un sens cette valeur, en dcrmentant (d'un palier donn) ce champ au passage d'un paquet et en dtruisant les paquets quand il passe en dessous de 0. La figure 2 donne les limitations suggres pour le TTL suivant la porte que l'on veut donner un paquet.

La valeur initiale du TTL est configurable grce la fonction setsockopt() :

u char ttl ; setsockopt(sock, IPPROTO IP, IP MULTICAST TTL, &ttl, sizeof(ttl)) ; Se joindre un groupe : Pour qu'une application puisse recevoir des datagrammes multicast, il est ncessaire qu'elle devienne membre d'un groupe. Cela se fait avec la mme fonction setsockopt () :

7 /19

Master R&S

struct ip mreq ( struct in addr imr multiaddr ; /* groupe multicast a joindre */ struct in addr imr interface ; /* interface (INADDR ANY) */ ) ; struct ip mreq mreq ; setsockopt(sock, IPPROTO IP, IP ADD MEMBERSHIP, &mreq, sizeof(mreq)) ;

Lorsque l'on joint un groupe, on ne spcifie que l'adresse IP du groupe. Pour le numro de port, il faut faire un traditionnel bind () sur ce port. Si l'on veut que plusieurs applications puissent utiliser la mme adresse de groupe (et donc le mme numro de port) sur la mme machine, il faut utiliser l'appel suivant : int one=1 ; setsockopt(sock, SOL SOCKET, SO REUSEADDR, &one, sizeof(one)) ; Pour quitter un groupe : On utilise nouveau la mme fonction setsockopt (sock, IPPROTO IP, IP DROP MEMBERSHIP, &mreq, sizeof (mreq) ) ;

On peut noter toutefois que lorsque le socket est ferm l'abandon du groupe est automatique. Dans un cas comme dans l'autre, si la machine possde d'autres sockets en liaison avec ce groupe, la machine reste membre de ce groupe. Remarque : Ces diffrents appels sont implments dans socklab (mode udp) avec les primitives (msocket, mbind, mjoin, mleave . . .). Dialogue machine utilisateur / routeur multicast Une application peut se joindre tout moment un groupe. L'appel de setsockopt () avec IP ADD MEMBERSHIP fait que la machine devient membre du groupe spcifi (appelons le, Groupe G).

8 /19

Master R&S

Au moment o elle se joint un groupe, la machine dclare au routeur multicast de son rseau local qu'elle fait partie de Groupe G. Ainsi les paquets multicast qui arrivent au routeur en provenance de G seront transmis jusqu' elle. Lorsque l'on quitte un groupe, il faut aussi le dclarer au routeur pour minimiser le traffic (les paquets destination du groupe ne seront plus envoys la machine). On peut dire qu'une machine fait partie d'un groupe tant qu'au moins une application tournant dessus possde un socket ouvert vers ce groupe. C'est le protocole IGMP (Internet Group Management Protocol) qui est utilis pour ce dialogue routeur/hte.

9 /19

Master R&S

III)-Mise en place

La Topologie de test Dans notre topologie : le groupe de 230.240.245.250 comprend les machines PC1, PC2 et PC4 qui se trouvent des rseaux diffrents spars par le routeur ENSA. Lorsque PC1 envoie un paquet destination de ce groupe, toutes les machines en faisant partie le recevront et le paquet n'est envoy qu'une seul fois. De plus, la machine PC3 bien que faisant partie du rseau local 1 n'appartient pas au groupe et ne reoit donc pas de paquet destination de ce groupe. Pour que le routeur puisse laisser passer tous les paquets Multicast du rseau Il a fallu dans un premier temps configurer le routeur pour quil gre le routage de paquets Multicast.

10 /19

Master R&S
Cest le rle de la commande :

Ensuite il faut choisir le style de multicasting, nous avons choisi le PIM (Protocol Independant Multicast) pour les raisons suivantes : PIM marche avec tous les protocoles de routage Multicast PIM a deux modes (dense et sparse) qui nous donnent un peu de libert quant la configuration.

On peut aussi utiliser IGMP (Internet Group Management Protocol), qui est bien pour les WAN, ou DVMRP (Distance Vector Multicast Routing Protocol) qui est trs peu support. Des deux choix que nous avions pour le PIM, nous avons retenu le mode dense. Voici la description des deux modes : Dense mode : Quand le routeur reoit un paquet Multicast. Le routeur envoie le paquet toutes les interfaces en sortie sauf linterface dorigine de lenvoi. Si le routeur dcouvre quune certaine interface na pas de destinataire Multicast, il envoie un message prune en retour lenvoyeur lui dclarant quil nest pas ncessaire denvoyer des messages cette interface/sous rseau/lien/hte. Sparse mode : Dans ce mode, il est suppos quil ny ait aucun hte qui veuille des paquets Multicast moins quun hte ne le demande spcifiquement . Donc contrairement lapproche brutale du dense mode, un routeur devient le foyer (hub). Ce foyer log tous les htes qui veulent recevoir du Multicast. De plus les paquets Multicast sont envoys uniquement ces hotes. Pour ne pas surcharger notre routeur dans le cas o beaucoup dhtes veulent du Multicast, nous avons choisi de mettre en place le dense mode.

11 /19

Master R&S

Puis il est ncessaire de dfinir le mode Multicast appliquer sur les interfaces du routeur qui vhiculent les paquets Multicast. Donc pour configurer le PIM en dense mode pour le routage Multicast il suffit de taper les commandes suivantes : Pour linterface FastEthernet 0/0

Pour linterface FastEthernet 0/1

12 /19

Master R&S

Socket Client
#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #define GROUP #define PORT "239.137.194.222" 55501

struct sockaddr_in sock_r, sock_w; int len_r = sizeof(sock_r); int len_w = sizeof(sock_w); void recvFile(int desc){ char buffer[65535]=""; int erreur=-4; int taille_fichier=0; FILE * fichier1;

fichier1=fopen("1.jpg","wb"); while(erreur<0){erreur=recvfrom(desc,(char*)&taille_fichier,sizeof(int),0, *)&sock_r, &len_r);} printf("la taille du fichier:%d",taille_fichier); while(taille_fichier>0){ int nombre_de_caractere=recvfrom(desc,buffer,1000,0, (struct sockaddr *)&sock_r, &len_r); if (nombre_de_caractere==-1) (struct sockaddr

13 /19

Master R&S

printf("\nDesole, je n'ai pas recu de donnee%s",buffer); else {

fwrite(buffer,1,nombre_de_caractere,fichier1); taille_fichier=taille_fichier-nombre_de_caractere; }} fclose(fichier1); } main(){ /* * descripteurs de socket * * sdr : pour la rception * sdw : pour l'mission */ int sdr, sdw;

/* * allocation de la structure imr */ struct ip_mreq imr;

/* * initialisation de la structure imr */ imr.imr_multiaddr.s_addr = inet_addr(GROUP); imr.imr_interface.s_addr = inet_addr("192.168.0.2"); /* 14 /19

Master R&S

* sockets * * sock_r : pour la reception * sock_w : pour l'emission */ /* * cration des sockets */ sdr = socket(PF_INET, SOCK_DGRAM, 0); if (sdr < 0) { perror("socket"); exit(1); } sdw = socket(PF_INET, SOCK_DGRAM, 0); if (sdw < 0) { perror("socket"); exit(1); }

/* * initialisation de la socket de rception */ memset(&sock_r, 0, sizeof(sock_r)); sock_r.sin_family = AF_INET; sock_r.sin_port = htons(PORT); sock_r.sin_addr.s_addr = 0; /* * initialisation de la socket d'mission */ 15 /19

Master R&S

memset(&sock_w, 0, sizeof(sock_w)); sock_w.sin_family = AF_INET; sock_w.sin_port = htons(PORT); sock_w.sin_addr.s_addr = inet_addr("192.168.0.1"); //inscription dans le groupe setsockopt(sdr, IPPROTO_IP, IP_ADD_MEMBERSHIP, (void *) &imr, sizeof(struct ip_mreq)); if (bind(sdr, (struct sockaddr *)&sock_r, sizeof(sock_r)) < 0) exit(1); recvFile(sdr); }

Socket Serveur

#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <netdb.h> #include <string.h> #define GROUP #define PORT "239.137.194.222" //adresse de groupe 55501 //port

struct in_addr imr_multiaddr; /* multicast group to join */

struct sockaddr_in sock_r, sock_w, sock_k;

16 /19

Master R&S

int len_r = sizeof(sock_r); int len_k = sizeof(sock_k); int len_w = sizeof(sock_w); int fsize(FILE * fp) { int pos, size;

pos = ftell(fp);

/* sauver la position courante */

fseek(fp, 0, SEEK_END); /* aller en fin */ size = ftell(fp); /* lire la taille */

fseek(fp, pos, SEEK_SET); /* revenir a la position initiale */ return size; } void sendFichier(int desc){int erreur=0;int k=0; char fich[20]=""; char bufferrec[10]=""; char buffer[65535]=""; FILE *fichier; fichier=fopen("1.jpg","rb"); int taille_fichier=fsize(fichier); printf("la taille du fichier:%d",taille_fichier); sendto(desc,(char*)&taille_fichier,sizeof(int),0,(struct sockaddr *)&sock_w, len_w);

while((k=fread(buffer,1,1000,fichier))!=0){ int nombre_de_caractere=sendto(desc,buffer,k,0, (struct sockaddr *)&sock_w, len_w); if (nombre_de_caractere==-1) 17 /19

Master R&S

printf("\nDesole, je n'ai pas envoyer les donnees du a l'erreur "); else printf("\nsend fclose(fichier);} main(){ /* * descripteurs de socket * * sdr : pour la reception * sdw : pour l'emission */ int sdr, sdw; // char buf[20]="",buff[20]="wa3alikoumSalam"; /* * creation des sockets avec famille des adresse PF_INET et protocole UDP */ sdr = socket(PF_INET, SOCK_DGRAM, 0); if (sdr < 0) { perror("socket"); exit(1); } sdw = socket(PF_INET, SOCK_DGRAM, 0); if (sdw < 0) { perror("socket"); exit(1); } /* 18 /19 : OK");}

Master R&S

* Initialisation de la socket de reception */ memset(&sock_r, 0, sizeof(sock_r)); sock_r.sin_family = PF_INET; sock_r.sin_port = htons(PORT); sock_r.sin_addr.s_addr = 0; /* * initialisation de la socket d'mission pour l'envoie au membre de groupe */ memset(&sock_w, 0, sizeof(sock_w)); sock_w.sin_family = PF_INET; sock_w.sin_port = htons(PORT); sock_w.sin_addr.s_addr = inet_addr(GROUP); /* * Operation bind */ if (bind(sdr, (struct sockaddr *)&sock_r, sizeof(sock_r)) < 0) exit(1); sendFichier(sdw); }

19 /19