Documente Academic
Documente Profesional
Documente Cultură
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.
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
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 :
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.
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
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
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;
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
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);
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);
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