Mini-projet1

Cours: INF4402
Projet: 1
Nom de famille: Pieraut, Prénom: Francis, Matricule: 60104
Nom de famille: AZIZI, Prénom: Oussama, Matricule: 1006964

Introduction

    Le but du présent laboratoire était de nous donner un point de vue concret de l'utilisation d'un protocole de communication sur un réseau distribué ainsi que des notions de client serveur. Pour se faire nous avons programmé, au moyen des mécanismes de communications de POSIX,  une application répartie client-serveur dans laquelle le client se connecte au serveur et transfert un fichier quelconque ainsi que d'autres informations au moyen du protocole HTTP. 

Description du protocole utilisé

HTTP: Le protocole "HyperText Transfer Protocol" est utilisé par notre client pour effectuer les taches demandées. Le protocole spécifie les messages utilisés lors des échanges Resquest-Reply, les méthodes, les arguments, les résultats et les règles nécessaires à leur représentation à l?intérieur des messages. Le protocole supporte un ensemble de méthodes fixes notamment GET, HEAD, OPTION, PUT, POST, etc.

Il permet la négociation du contenu ( Content negociation ) de sorte que le client peut spécifier par exemple le type de représentation de données qu?il supporte tel que les données la langue, les données audio, vidéo etc.

Le protocole HTTP utilise le protocole TCP de la couche Transport. Nous avons utilisé la version 1.0 de HTTP et avons éffectué les interactions entre le client et le serveur de la facon suivante:

Avec la version initiale du protocole, l?établissement de la connexion et sa fermeture lors de chaque échange requête-réponse s?imposaient, ce qui surchargeaient le serveur et le réseau en même temps. En plus, les fureteurs généralement font des requêtes multiples au même serveur. Avec la version 1.1 par contre l?utilisation de l?option persistent connection est possible : la connexion persiste tant que le client ou le serveur ne la ferme pas.

Le contenu des arguments et des résultats est structuré selon le standard MIME (Multipurpose Internet Mail Extensions) qui permet d?envoyer des données contenant à la fois des images, du texte et du son dans des messages e-mail ( Multipart data). Les données sont préfixées des types Mime pour permettre leur manipulation par le client. Text/plain, text/html, image/gif, image/jpeg sont des exemples des Mime type. 

Nous présentons maintenant la forme des requêtes et des réponses HTTP

Requête HTTP
 
Method
URL
HTTP version
Headers
Message body
GET
www.m3.polymtl.ca
HTTP/1.1
Connection : persistent-connection

Réponse HTTP
 
HTTP version
Status code
Reason
Headers
Message body
HTTP/1.1
200
OK
Resource data

Nos références a propos du protocole HTTP sont le suivantes : 

Liste des status code 

Les valeurs numériques du status code du protocole HTTP sont : 

Þ Success 2xx 

§ OK 200 

§ CREATED 201 

§ Accepted 202 

§ Partial Information 203 

§ No Response 204 

Þ Error 4xx, 5xx 

§ Bad request 400 

§ Unauthorized 401 

§ Payment Required 402 

§ Forbidden 403 

§ Not found 404 

§ Internal Error 500 

§ Not implemented 501 

§ Service temporarily overloaded 502 (TO BE DISCUSSED) 

§ Gateway timeout 503 (TO BE DISCUSSED) 

Þ Redirection 3xx 

§ Moved 301 

§ Found 302 

§ Method 303 

§ Not Modified 30

Implantation des fonctions requises

Afin de pouvoir connecter avec le serveur, il nous faut créer un socket par lequel nous allons pouvoir communiquer avec le serveur.

localSock = socket (AF_INET, SOCK_STREAM, 0);// Creation de mon socket
Par la suite, nous devons nous connecter avec le serveur. Pour ce faire, on doit créer une stucture struct sockaddr qui contient les paramètres nécessaires pour se connecter avec notre serveur. Comme nous récupérons sur la ligne de commande le nom de l'ordinateur sur lequel nous voulons nous connecter, il nous faut transformer cette adresse en une adresse Internet
mon_host = gethostbyname(host);//return a pointer to a hostent structure
           ip_addr = *(struct in_addr *)(mon_host->h_addr);// acces a la premiere adresse
Une fois que nous avons récupérer l'adresse internet du Host, nous devons créer la structure struct sockaddr.
serverSock.sin_addr.s_addr = inet_addr(inet_ntoa(ip_addr));//adresse internet
           serverSock.sin_family = AF_INET;//This identifies the address family or format of the socket address.
serverSock.sin_port   = htons(no_port);// conversion du port etant en byte host en byte reseau
 Finalement, nous pouvons communiquer avec celui-ci en utilisant la commande connect.
con_server = connect(localSock, (struct sockaddr *) & serverSock, sizeof (serverSock));
Une fois que la connection est établie, nous pouvons envoyer la commande au serveur. Pour ce faire, nous avons utliser la commande write. Comme motre socket était déjà créer, il ne nous restaite qu'à formuler la commande. Le nom du fichier était indiqué sur la ligne de commande.

nom_fichier = *(++argv);// pointeur au pathname
           sprintf(iobuf,"GET %s HTTP/1.0\r\n\r\n",nom_fichier);// iobuf contient la commande
           con_server = write(localSock, iobuf, strlen(iobuf));/* Envoie de la commande au serveur*/
Afin de récupérer la réponse du serveur, nous devons attendre la réponse de celui. Pour ce faire, nous utilisons la fonction read. La réponse du serveur étant mise dans le tampon iobuf( nom de tampon)

con_server = read(localSock, donnee_recu, MAX_SIZE); * Lecture de la reponse du serveur*/
Pour fermer la connection, la commande close a été utilisée.

       close(localSock);   /* Fermeture du socket et de la connection*/

Conclusion

    Nous avons programmé en C une applicationclient qui se connecte à un serveur et qui va chercher un fichier et qui affiche son type, sa taille et le type du serveur surlequel il se trouve. Durant la réalisation de ce travail pratique, nous avons rencontré des difficultés mineures telle que la manipulation de  la structure "struct sockaddr_in" et la manipulation des chaînes de caractères avec les fonctions C . Concernant l'utilisation de la structure "struct sockaddr_in", un exemple sur l'Internet nous a permis de voir une manière simple d'utilisation de cette structure (http://www.salemioche.com/http_prog1.htm).

Afin d'augmenter les performances dans un contexte d'utilisation réel, il nous faudrait implanter un mécanisme pour conserver et réutiliser la connexion sur les serveurs ainsi qu'un mécanisme de cache au niveau client.

Concernant le mécanisme de conservation de la connection, il est utile de savoir qu'il est implanté dans la version 1.1 du protocole HTTP avec l'option "persistent-connection"Ce mecanisme permet de concerver la connection à un serveur dans le cas ou de multiples requêtes doivent etre faites. 

Pour réduire la surchange des serveurs ainsi que du réseau, les caches au niveau client ou proxy serveur sont utilisées. Nous entendons par cache, un répertoire qui contient les ressources ou résultats des dernières requêtes.Un temps d'expiration de chaque ressource maintenues dans la cache permet au fureteur de juger de la l'éventuel validitée des celles-ci. Le mécanisme d'utilisation de la cache s'assure que l'information demandée n'a pas déjà été demandée et qu'elle n'est plus dans la cache. Dans le cas ou cette information a déjà été demandée et qu'elle est toujours stockée et à jour sur le réseau local (proxy serveur) ou sur l'ordinateur effectuant la requête, la requête ne sera pas effectuée et les données seront directement accessibles au moyen d'une référence à cette cache. Ce mécanisme permet d'alléger le nombre de requêtes faites aux serveurs en conservant un historique des fichiers accédés sur l?ordinateur local ou sur un "proxy serveur". 

Une autre technique consite à aviser les clients interressés d'une mise à jour au niveau serveur. Ce mécanisme permet aux serveurs de reduire leurs surchages en période de pointe en envoyant dans les temps morts des mises à jours des ressources. Il est bien entendu que le serveurs voulant implanter un tel mécanisme doit concerver une liste de clients ou proxy serveurs interressés pour chacunes des ressources.