Le samedi 9 juillet 2005 à 11:27:: Laurent - CyberSDF:: Monde de geek
Il m'arrive fréquemment de devoir expliquer à des non techniciens des choses très pointues en matière de système et de réseau. Il faut savoir que la plupart de ces personnes ont une culture informatique très faible et ne dépasse pas le cadre de l'utilisation.
Merci de prendre en compte que ce billet s'adresse à des débutants complets, donc ce billet ne se veut pas exhaustif mais suffisamment simple pour que n'importe qui puisse comprendre les principes généraux de HTTP ; si il y a des raccourcis rapides et des approximations, merci de ne pas m'en tenir rigueur... Cependant, si je suis trop abscons ou que vous désirez voir des points plus détaillés ou manquants, n'hésitez pas à en faire part dans les commentaires j'essayerais de compléter ce billet.
Voici comment, j'ai expliqué le fonctionnement de HTTP à quelqu'un il y a quelques semaines :
HTTP est un protocole asynchrone non connecté de transport de données et sert principalement à naviguer sur le web avec son navigateur.
Non connecté signifie que celui qui envoie les données et celui qui les reçoit ne restent pas en communication permanentes (du moins par ce protocole) ; En gros celui qui envoie les données ne fait que les envoyer sans s'assurer de leur bonne réception.
Regardons ce qui se passe quand je veux ouvrir la page d'accueil de ce site avec mon navigateur, je tape donc http://www.cybersdf.org/index.php dans la barre d'adresse de mon navigateur et je valide :
GET /index.php HTTP/1.1 Host: cybersdf.org User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.8) Gecko/20050612 Firefox/1.0 (Ubuntu package 1.0.4) Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5 Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive
Ici mon navigateur dit qu'il veut (GET) la page /index.php en utilisant le protocole HTTP 1.1 sur le serveur ayant pour nom (Host) cybersdf.org.
Ensuite il se présente (User-Agent), annonce le type de fichier qu'il sait traiter (Accept), son ordre de langues préférées (Accept-Language), qu'il supporte la compression de fichier (Accept-Encoding), la liste de jeu de caractères qu'il connait (Accept-Charset), et enfin, qu'il va essayer de garder la même connexion (en terme de connexion internet (TCP/IP) et non pas HTTP) pendant 300 secondes.
A partir de tout ça le serveur contacté va lui répondre :
HTTP/1.x 200 OK Date: Sat, 09 Jul 2005 09:26:11 GMT Server: Apache Last-Modified: Fri, 08 Jul 2005 17:37:42 GMT Cache-Control: must-revalidate, max-age=0 Keep-Alive: timeout=15, max=100 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html; charset=UTF-8 Content-Language: fr
OK la demande est traitée correctement (200), voici la date que j'ai, je m'appelle Apache (Server), le fichier demandé à été modifié la dernière fois le (Last-Modified), je n'utilise pas de cache (Cache-Control), ma connexion à moi ne durera pas plus de 100 secondes et si je n'ai pas de nouvelles dans les 15 secondes il faudra recommencer une nouvelle connexion (timeout=15), je vais t'envoyer les données par petits paquets (Transfer-Encoding: chunked), le fichier est un fichier texte de type HTML et utilise le jeu de caractère UTF-8 et pour finir tout le contenu du fichier demandé que je vous épargne.
Vous voyez donc que lors de la simple demande d'affichage d'une page web, le navigateur et le serveur se donnent beaucoup d'informations sur eux.
Une fois que le navigateur a reçus la page web, il va commencer à la lire pour l'afficher, et la c'est le drame il va se rendre compte que la page fait appel à des choses qu'il n'est pas sur d'avoir. Eh oui ! Toutes les images et les feuilles de style ? Les a-t-il ?
Eh bien pour être sur il va faire comme pour la page d'accueil, c'est a dire faire un GET pour chaque fichier.
Seulement, je visite régulièrement mon blog moi (je suis mon premier lecteur et mon lecteur le plus fidèle :p ) et il se peu que j'ai déjà les images et feuilles de style dans le cache de mon navigateur. Regardons ce qui se passe quand le navigateur veut en être sur :
La mon navigateur demande l'image de dotclear tout en bas de page :
GET /images/dotclear_pw.png HTTP/1.1 Host: cybersdf.org User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.7.8) Gecko/20050612 Firefox/1.0 (Ubuntu package 1.0.4) Accept: image/png,*/*;q=0.5 Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3 Accept-Encoding: gzip,deflate Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 Keep-Alive: 300 Connection: keep-alive Referer: http://cybersdf.org/index.php If-Modified-Since: Wed, 27 Apr 2005 17:11:24 GMT
La on peu voir qu'il y a quelques différences par rapport à la requête précédente, notamment il dit d'où il vient (Referer), et enfin, le plus intéressant, il ne veut le fichier que si il a été modifié depuis telle date (If-Modified-Since) car il a cette version dans son cache.
A partir de tout ça le serveur va regarder si la date de dernière modification est plus récente que celle dont dispose le navigateur. Si ce n'est pas le cas, il va répondre :
HTTP/1.x 304 Not Modified Date: Sat, 09 Jul 2005 10:07:00 GMT Server: Apache Connection: Keep-Alive Keep-Alive: timeout=15, max=94
Le fichier n'a pas été modifié par rapport à la date que tu m'a donné (304), tu peux donc utiliser celui de ton cache.
Mais HTTP ne sert pas seulement à recevoir des données, il peu également servir à en envoyer. Vous le faites d'ailleurs peut être tous les jours sans le savoir si vous utilisez un webmail ou que vous vous identifiez sur un site.
Exemple concret, pour pouvoir écrire mes billets je dois me connecter dans la partie d'administration, ça se passe comme ça :
La mon navigateur va faire :
POST /ecrire/auth.php HTTP/1.1 Host: cybersdf.org [...] Content-Type: application/x-www-form-urlencoded Content-Length: 44 user_id=MonLogin&user_pwd=MonMotDePasse
Ici ce qui change le plus c'est l'utilisation du mot POST au lieu de GET, cela indique au serveur que le navigateur va lui envoyer des données dans le corps de la requête HTTP. Le navigateur indique également qu'il envoie les données (Content-Type:) et qu'en plus elle proviennent d'un formulaire (application/x-www-form-urlencoded) et que la taille du contenu (Content-Length) sera de 44 octets et pour finir les données elles mêmes ou user_id et user_pwd sont les nom des champs du formulaire.
A partir de la, la réponse du serveur peut être diverse et variée, tout dépend de ce qu'il va faire avec les données qu'on lui a envoyé. Généralement c'est un simple 200 OK pour dire que tout s'est bien passé.
Bref vous l'aurez compris, tout se passe à coup de GET et de POST côté navigateur et le serveur l'informe à chaque fois par un code dit code de statut avant de faire quoique ce soit.
Les codes que vous rencontrerez le plus souvent sont :
En savoir plus :
Blogmark it ! :: trackback fermés :: fil rss des commentaires
1.
Le samedi 9 juillet 2005 à 14:29 ::
SuperDevy
Très intéressant, ce billet est une bonne base pour découvrir ce qui se passe en arrière-plan.
2.
Le samedi 9 juillet 2005 à 17:55 ::
NiKo
Super billet ! A noter qu'il existe un plugin FF pour visualiser les entetes HTTP en temps réel : livehttpheaders.mozdev.or...
3.
Le mardi 12 juillet 2005 à 09:33 ::
Choupinette
Les non techniciens... culture informatique très faible.
Comme moi... !
Et à chaque fois, grâce à toi, je comprends !!!
Que serais-je sans toi ?!
4.
Le lundi 18 juillet 2005 à 07:48 ::
JP
"En gros celui qui envoie les données ne fait que les envoyer sans s'assurer de leur bonne réception."
![]()
![]()
Erreur tres grossiere. Ca serait une definition de UDP ca. Le non-connecte de HTTP ~ stateless, autrement dit entre 2 requetes du meme client le serveur ne sait pas faire de lien, sauf avec des artifices comme les cookies pour faire du stateful sur un protocole stateless. HTTP transite sur du TCP donc il s'assure de la bonne reception des donnees puis ferme le tuyau, d'ou le "non-connecte".
Bref il faudrait peut-etre faire attention avant de raconter n'importe quoi ...
5.
Le lundi 18 juillet 2005 à 20:09 ::
Laurent - CyberSDF
Je ne raconte pas n'importe quoi comme vous dites, ce billet ne se base que sur HTTP et, jusqu'à preuve du contraire, il n'y a aucun contrôle dans HTTP.
Maintenant que HTTP transite par TCP, c'est complètement autre chose, d'ailleurs on pourrait très bien faire écouter un httpd sur UDP, c'est risqué et complètement idiot mais pas infaisable techniquement et la, le contrôle de la réception des données assuré par TCP passe à la trape.
Je suis cependant conscient qu'introduire HTTP sans parler de TCP/IP c'est laisser passer beaucoup de choses sous silence et oblige à faire des raccourcis rapides, d'ou mon introduction.
6.
Le jeudi 10 août 2006 à 04:19 ::
kroman
Très bon billet néanmoins
"ma connexion à moi ne durera pas plus de 100 secondes"
Il ne s'agit pas de secondes pour la propriété "max" du champ "Keep-Alive" mais bien d'un compteur qui ferme la connection lorsque le nombre de requêtes autorisé par le serveur sur cette connection est épuisé!
Toutes les fautes d'orthographes présentes sur ce site sont protégées par la licence
Creative common
|
|
|
|
Design décliné de [ON]Simple par [ NikO ]
Hébergé par Typhon.Network