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:
-
Le client fait une requête
et le serveur accepte la connexion utilisant soit le port par défaut
ou le port spécifié par le client.
-
Le client envoie une
requête au serveur.
-
Le serveur envoie une
réponse au client.
-
La connexion est fermée.
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 :
-
http://www.jmarshall.com/easy/http/
-
http://www.ics.uci.edu/pub/ietf/http/rfc1945.html
-
http: //www.w3.org/Protocols/
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.