Le HTTP pour les nuls. - L©S ßlog - CyberSDF

L©S ßlog - CyberSDF



Le HTTP pour les nuls.

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 :

  • Je me demande la page d'authentification (GET)
  • Le serveur me l'envoie (200 OK)
  • J'entre mon nom d'utilisateur et mon mot de passe dans le formulaire et je clique sur envoyer

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 :

  • 200 OK : Votre demande a bien été prise en compte et traitée
  • 302 Moved Temporarily : La ressource que vous avez demandée a changé d'adresse (rassurez vous il envoie la nouvelle adresse avec)
  • 302 Found : La ressource demandée est à une nouvelle adresse mais il se peu qu'elle ai changé de place.
  • 401 Unauthorized : La ressource que vous demandez est protégée, il vous faut un nom d'utilisateur et un mot de passe pour y accéder
  • 404 Not found : La ressource demandée n'existe tout simplement pas sur le serveur
  • 500 Server error : Il y eu un gros problème que je ne peux résoudre.

En savoir plus :

Blogmark it ! :: trackback fermés :: fil rss des commentaires

Aucun trackback.

Commentaire(s)

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." :?: 8-O

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é!

Les commentaires sont fermés.

Toutes les fautes d'orthographes présentes sur ce site sont protégées par la licence Logo Creative common Creative common

 |  Valid XHTML  |  Valid CSS  |  Dotclear  |  Design décliné de [ON]Simple par [ NikO ]
Hébergé par Typhon.Network