Le protocole HTTP


1 le protocole HTTP

Le Web est le plus important système client/serveur implémenté à ce jour. L'utilisation de protocoles ouverts, définis par des groupes de travail au sein de l'IETF (Internet Engineering Task Force) assure l'interopérabilité des systèmes.

Ces protocoles spécifiques à Internet sont décrits dans des documents techniques appelés RFCs (Request For Comments) qui sont le stade final des spécifications publiées par l'IETF.

HTTP (Hypertext Transfer Protocol) est le protocole utilisé pour l'échange de messages entre les clients et serveurs Web. Les clients peuvent utiliser d'autres protocoles comme FTP, Gopher, NNTP (pour les nouvelles) etc..., mais HTTP est le protocole natif.

HTTP est employé pour chaque transaction concernant un document ou un graphique du WEB, à chaque clic sur un lien hypertexte, pour chaque formulaire transmis. Les mécanismes mis en oeuvre pendant ces échanges restent transparent pour l'utilisateur. C'est un protocole ASCII (American Standard Code for Information Interchange), niveau application du modèle OSI (Open Systems Interconnection), suffisamment léger et rapide pour permettre la transmission de documents distribués et multimédia à travers un système.

Quelques RFCs (Request For Comments) :

rfc1123 : Requirements for Internet Hosts -- Application and Support
rfc1945 : HTTP 1.0
rfc2616 : HTTP 1.1
rfc2617 : HTTP Authentication: Basic and Digest Access Authentication
rfc1867 : Form-based File Upload in HTML

Le site RFC Editor permet de rechercher et de télécharger une RFC, ainsi que l'archive de plus de 20Mo contenant toutes les RFC.

Le site RFC-Editeur.org regroupe toutes les traductions françaises des RFCs.

1.1 Les versions

Depuis 1990, date d'apparition du Web, le protocole HTTP évolue lentement mais surement. La première version déployée largement a été la 1.0, définie dans la rfc1945 de mai 1996. La version 1.1, deux fois plus volumineuse, est apparue au mois de janvier 1997,.

La version courante de ce protocole est HTTP/1.1. Elle cohabite avec HTTP/0.9 et HTTP/1.0. Cependant, cette dernière reste la version la plus répandue sur Internet.

En phase de développement : HTTP-NG.

1.2 Les URL

Un des principaux mécanismes du Web est le système de nommage des objets accessibles, qui en uniformise l'accès, qu'ils appartiennent à la machine sur laquelle on travaille ou distants sur une machine en un point quelconque du réseau.

Ce système de localisation, appelé Universal Resource Locator ou URL, dérive d'un système de nommage plus général nommé Universal Resource Identifier ou URI.

Elle à la forme suivante :

protocole : / / host : port / path fichier #position



Exemple : http://www.wanadoo.fr/auth_user/copyright.html

Cette URL s’interprête de la manière suivante : il s’agit d’un document accessible via le protocole HTTP, sur le serveur www.wanadoo.fr qui est l’écoute sur le port 80 – numéro par défaut, donc non précisé dans l’URL – se trouvant dans le répertoire auth_user et dont le nom est copyright.html.

1.3 Principe

Le protocole HTTP suit le modèle client/serveur (requête/réponse).

Le client envoie une requête au serveur qui lui renvoie une réponse. Avec les versions HTTP/0.9 et HTTP/1.0, cet échange est réalisé en établissant une nouvelle connexion TCP pour chaque requête.

HTTP/1.1 impose, par défaut, au serveur de maintenir la connexion ouverte jusqu'à ce que celle-ci soit explicitement fermée. Ainsi le client adresse plusieurs requêtes, sans attendre de réponse, au serveur qui transmet les ressources demandées, dans le même ordre.

HTTP reste malgré tout un protocole sans état (stateless). Chaque transaction est gérée comme un échange séparé, aucune information n'est gardée entre deux transactions. Ainsi, dire que l'on est connecté à un site web n'a pas de sens. En effet, les sites web qui donnent à l'utilisateur l'illusion d'être connecté utilisent les cookies, les sessions, et l'authentification HTTP.

1.3.1 L'échange HTTP

Le protocole HTTP s’appuie généralement sur une connexion transport TCP (Transmission Control Protocol), et utilise le port 80 par défaut.

Quand le client se connecte au serveur, il envoie plusieurs en-têtes HTTP à travers le réseau, indiquant au serveur qui il est et ce qu'il désire. Le serveur renvoie un nombre d'en-têtes de réponse, décrivant les données qui sont retournées ou expliquant pourquoi aucune donnée n'est retournée.

 

Echange HTTP

 

Une transaction HTTP se deroule de la façon suivante :

  1. Connexion TCP/IP

  2. Requête client HTTP

  3. Réponse serveur HTTP

  4. Déconnexion TCP/IP
    en
    HTTP/0.9 et 1.1, le serveur ferme la connection après avoir envoyé la réponse
    en HTTP/1.1, le serveur ne ferme la connexion que si le client le demande explicitement.

Remarque : C’est le client qui ouvre la connexion, mais c’est le serveur qui la ferme. Une transaction HTTP correspond au transfert d’au plus une ressource (jusqu'à la version 1.0).

Une grande partie de l'information échangée entre le client et le serveur est réalisée sous forme d'en-têtes. Un en-tête à la forme suivante :

HeaderName : Value

La spécification HTTP/1.1 définit un grand nombre d'en-têtes pouvant être utilisés. En plus de ces en-têtes, le client et le serveur peuvent élaborer leurs propres en-têtes s'ils le désirent.

1.3.2 Le message HTTP

Chaque message HTTP, qu'il s'agisse d'une requête ou d'une réponse, à la structure suivante :

En résumé, un message HTTP à le format suivant :

 

ligne_REQUETE ou ligne_REPONSE
en-tête_1: valeur_1
en-tête_2: valeur_2
....
en-tête_n: valeur_n
 
Corps_du_message

 

Remarque : Toutes les lignes du protocole HTTP doivent être terminées par CR/LF (caractères ASCII 13 et 10 respectivement).

1.3.3 La requete HTTP

C'est une suite de lignes envoyé au serveur par le navigateur. Elle comprend:

 

Exemple : Requête HTTP avec InternetExplorer 6

Dans cet exemple, le navigateur souhaite afficher la page d'accueil de Google :

 

Exemple : la même requête HTTP avec Mozilla Firebird 0.6.1

 

Les méthodes de la requête

La méthode est la première information de la requête. Les plus utilisées sont GET, POST et HEAD.

Méthode

HTTP

Signification

GET

0.9

Demande une ressource au serveur.

HEAD

1.0

Permet d'obtenir les en-têtes HTTP d'une ressource sans cette dernière.

POST

1.0

Envoie des données au programme indiqué par l'URL.

PUT

1.1

Mettre à jour ou créer un document. Le corps du message doit alors contenir la nouvelle version intégrale du document référencé. Non mise en oeuvre par les principaux serveurs HTTP pour des raisons de sécurité.

DELETE

1.1

Détruire un document. Non mise en oeuvre par les principaux serveurs HTTP pour des raisons de sécurité.

TRACE

1.1

A des fins de débogage : laisse le client voir ce qui est reçu à l'autre extrémité.

CONNECT

1.1

Réservation pour une utilisation future.

OPTIONS

1.1

Permet de connaître les services disponibles sur un serveur



GET
Utilisée pour accéder à une ressource sur le serveur. Cette ressource peut-être un document HTML, une image, un fichier vidéo, etc ....

La ressource peut également être générée dynamiquement. C'est le cas lorsque l'URL pointe vers un programme. Le serveur éxécutera ce programme et retournera les résultats au client HTTP.

Exemple : GET http://www.google.fr/search?q=php&hl=fr HTTP/1.0
envoie les paramètres q et hl avec comme valeurs respectives php et fr au programme search.

Les GET conditionnels utilisent l'en-tête If-Modified-Since dans la requête pour rapatrier la ressource seulement si elle a changé. Ceci est utilisé par les serveurs cache proxy pour estimer si les documents ont changé ou s'ils sont encore valides

HEAD
Cette méthode est semblable à GET : elle demande au serveur de ne renvoyer que les entêtes de la réponse sans transmettre la ressource elle-même. Cette méthode permet de récupérer des informations sur la ressource (date de dernière modification, taille, type, ...).

POST
Permet d'envoyer les données du corps de la requête sur le serveur vers l'URL spécifiée.

Les en-têtes de la requête

Puisqu'une requête se termine par une ligne vide (HTTP 1.x), d'autres lignes peuvent être intégrées à la requête. Ces informations supplémentaires envoyées par le client permettent au serveur de répondre au mieux à sa demande.

Description de quelques en-têtes :

Authorization: accréditif
Champ à inclure par l'utilisateur souhaitant s'authentifier vis à vis du serveur auquel il est relié. C’est le cas après réception d’une réponse de code 401

Accept: type/sous-type
HTTP supporte la negociation sur le type d'objet renvoyé par le serveur. L'en-tête Accept précise les différents types MIME attendus comme réponse à la requête en cours.

From: adresse_e-mail
Indique l'adresse électronique de l'utilisateur du navigateur. Cela n'est envoyé qu'avec son autorisation, et donc rarement pratiqué.

If-Modified-Since: date
Utilisé principalement par les serveurs cache proxy avec la command GET. Cet en-tête fournit l'heure et la date d'une copie en cache de l'objet référencé. Si le serveur possède une version plus récente, elle est renvoyée normalement. Sinon, la copie en cache reste valide et il n'y a pas besoin d'envoyer l'objet. Le serveur le signale avec un code d'erreur (304), envoit les en-têtes appropriés concernant le service de cache (comme, peut-être, un nouvel en-tête Expires:) et referme la connexion.

Referer: URL
Iindique au serveur l'URL du document à l'origine de la requête en cours. Ceci est très pratique pour une maintenance automatisée des serveurs, en particulier si la requête a provoqué une erreur. Les possesseurs de documents qui ont des liens invalides peuvent en être informés, automatiquement même.

User-Agent: nom_agent/version
Indique que logiciel agent (navigateur ou client Web) de l'utilisateur requiert le document.

Le corps de la requête HTTP

En plus de la requête elle-même et des en-têtes de requête, le client HTTP peut envoyer des données supplémentaires au serveur dans le corps de la requête. On l'utilise généralement pour la transmission de données à un processus CGI avec une requête POST, mais également pour la publication d'un document vers le serveur avec une requête PUT.

La fin des en-têtes est signalée par une ligne vide. Tout ce qui suit cette ligne est considéré par le serveur comme faisant partie du corps de la requête.

Lorsque le corps de la requête contient un message, les lignes d'en-tête suivantes doivent apparaître :

1.3.4 La réponse HTTP

C'est un ensemble de lignes envoyé au navigateur par le serveur. Elle comprend:

 

Exemple : Réponse HTTP
Frame2

Réponse du serveur, suite à la requête effectuée dans l'exemple précédent :

Le statut de la réponse HTTP

Lorsque le client à envoyé la totalité de sa requête, le serveur HTTP retournera une ligne de statut.

Exemple : HTTP/1.0 200 OK

Cette ligne contient la version HTTP utilisée par le serveur, le statut de la réponse sous forme numérique, le statut de la réponse mais sous forme de texte. Il existe 5 classes de statuts :

 

100

Continue

1.1

le client doit continuer à attendre la réponse et envoyer des rappels de sa requête au serveur. Le serveur signale ainsi qu'il a compris la requête et qu'il ne l'a pas encore rejetée.

101

Switching Protocols

1.1

le serveur va répondre avec une autre version de protocole

 

200

OK

1.0

la requête est satisfaite

201

Created

1.0

une URL a été créée

202

Accepted

1.0

requête acceptée mais non traitée

203

Non-Authoritative Information

1.1

les méta-informations renvoyées dans l'en-tête de l'entité ne sont pas tout à fait celles qui conviennent pour la ressource demandée. Elles proviennent par exemple d'une tiers. Ne peut être utilisé que si autrement la réponse est 200 OK.

204

No Content

1.0

requête satisfaite, mais le serveur n'a rien de particulier à renvoyer

205

Reset Content

1.1

le client doit rafraîchir l'affichage de la page actuelle car le serveur vient de finir le traitement et donc le contenu a changé. Cette réponse ne peut en aucun cas contenir d'entité.

206

Partial Content

1.1

le serveur a répondu partiellement à la requête GET



300

Multiple Choices

1.0

la ressource demandée existe sous plusieurs formes (le serveur dispose de index.htm et index.html)

301

Moved Permanently

1.0

la ressource a définitivement changé d'emplacement. La directive Location: contient alors la nouvelle URI.

302

Moved Temporarily

1.0

la ressource existe mais est temporairement indisponible. Une solution alternative peut alors être proposée

303

See Other

1.1

la réponse à la requête peut être trouvée à une autre URI et devrait être obtenue par une nouvelle requête GET sur cette nouvelle URI

304

Not Modified

1.0

code renvoyé lorsque le client a effectué un GET conditionnel et que le document demandé n'a pas été modifié depuis la date indiquée

305

Use Proxy

1.1

la ressource demandée doit être accédée en utilisant le proxy indiqué

306

(Unused)

1.1

ce code est réservé (il était utilisé dans un premier draft de la RFC2616)

307

Temporary Redirect

1.1

la ressource demandée se trouve temporairement à une autre URL


400

Bad Request

1.0

requête syntaxiquement incorrecte

401

Unauthorized

1.0

l'utilisateur doit s'authentifier pour accéder à la ressource. Une directive WWW-Authenticate: est alors fournie pour permettre l'authentification.

402

Payment Required

1.1

réservé pour une utilisation future

403

Forbidden

1.0

le serveur ne veut pas délivrer la ressource. Il ne s'agit pas d'une erreur d'authentification.

404

Not Found

1.0

la ressource spécifiée est introuvable (erreur d'URL ?)

405

Method Not Allowed

1.1

le client essaie d'utiliser une méthode non autorisée sur l'URI demandée. Le serveur renvoie alors une directive Allow: pour indiquer quelles méthodes sont autorisées.

406

Not Acceptable

1.1

la réponse (entité) ne correspond pas aux caractéristiques de la directive Accept: de l'en-tête de la requête

407

Proxy Authentication Required

1.1

identique au code 401, mais il indique que le client doit d'abord s'authentifier auprès du proxy

408

Request Timeout

1.1

le client n'a pas envoyé de requête durant la période de temps où le serveur attendait

409

Conflict

1.1

il y a un conflit entre la requête et l'état actuel de la ressource. Le client peut a priori résoudre le problème.

410

Gone

1.1

la ressource n'est plus disponible sur le serveur et aucune adresse alternative n'a été fournie

411

Length Required

1.1

la requête doit contenir un Content-Length:

412

Precondition Failed

1.1

une des préconditions fournies en en-tête de la requête a produit un résulat négatif du côté serveur

413

Request Entity Too Large

1.1

la ressource demandée est plus grosse que ce que le serveur veut renvoyer

414

Request-URI Too Long

1.1

l'URI de la ressource demadée est trop longue. Cette erreur se produit par exemple lorsque le client a mal converti une requête POST en requête GET.

415

Unsupported Media Type

1.1

le format de l'entité demandée n'est pas supporté par la ressource demandée pour la méthode demandée

416

Requested Range Not Satisfiable

1.1

le client demande un Range: (portion de l'entité) impossible à déterminer sur la ressource

417

Expectation Failed

1.1

la prévision de ressource exprimée dans le champ Expect: de la requête ne peut pas être satisfaite


500

Internal Server Error

1.0

Problème sur le serveur

501

Not Implemented

1.0

le serveur ne peut effectuer la requête

502

Bad Gateway

1.0

La requête fait référence à un proxy ou à une passerelle, et la machine ne comprend pas la réponse

503

Service Unavailable

1.0

le serveur ne peut pas satisfaire la requête pour une raison temporaire. Le serveur devrait pouvoir y répondre plus tard.

504

Gateway Timeout

1.1

le proxy ou la passerelle n'a pas reçu de réponse en temps et en heure

505

HTTP Version Not Supported

1.1

le serveur ne supporte pas la version HTTP demandée. Le serveur devrait répondre pourquoi cette version n'est pas supportée, et quelles versions le sont.


Les en-têtes de la réponse HTTP

Après la ligne de statut vient un ou plusieurs en-têtes de réponse.

Accept

spécifie les types de média acceptés pour la ressource demandée (text/html, image/jpeg...). Liste de type MIME.

Accept-Charset

page de code acceptable pour la réponse (alphabet cyrillique...)

Accept-Encoding

identique à Accept: mais limite l'encodage (gzip...)

Accept-Language

langues (utilisées dans la page web demandée) acceptées pour la réponse

Accept-Ranges

le serveur dit s'il accepte ou non les directives Range:

Age

utilisé pour la gestion des caches. Dit au serveur l'âge estimé de la ressource cachée pour que le serveur compare et renvoie éventuellement une nouvelle version.

Allow

liste les méthodes (GET, PUT...) supportées pour la ressource demandée

Authorization

utilisé par un client pour s'authentifier auprès du serveur

Cache-Control:

définit une politique de cache pour la ressource (no-cache, public...).

Connection

indique des paramètres particuliers pour la connexion (close, par exemple, pour demander à fermer la connexion après envoi de la ressource)

Content-Disposition

permet au serveur de suggérer un nom de fichier par défaut pour la ressource qu'il envoie au client. Cet en-tête n'est pas officiellement un en-tête HTTP/1.1, son utilisation est simplement suggérée.

Content-Encoding

complément à media-type:. Indique quel encodage (gzip...) est utilisé pour la ressource.

Content-Language

langue utilisée dans la ressource

Content-Length

longueur (en octet) du corps de l'entité

Content-Location

(en-tête de l'entité) sert à préciser la vraie URI de la ressource renvoyée si la ressource renvoyée a été trouvée à une autre URI que celle de la requête

Content-MD5

renvoie un code de contrôle MD5 au client pour lui permettre de vérifier l'intégrité de la ressource renvoyée

Content-Range

précise la zone de l'entité complète couverte par l'entité partielle renvoyée

Content-Type

type de média du corps de l'entité (text/html; charset=ISO-8859-4 par exemple)

Date

date à laquelle le message a été écrit

ETag

dans la réponse, entity tag (sorte de code de contrôle) de la variante de l'entité demandée. Permet de faire une comparaison entre ce qui a été demandé et ce qui a été renvoyé.

Expect

le client attend un certain comportement du serveur. Le statut 417 (Expectation Failed) est utilisé dans ce contexte.

Expires

date à partir de laquelle la réponse doit être considérée comme invalide

From

e-mail de l'utilisateur du client qui a formulé la requête

Host

précise le serveur (virtuel) sur lequel la requête est formulée

If-Match

sert à faire des requêtes conditionnelles sur les ETags

If-Modified-Since

sert également à faire des requêtes conditionnelles, mais sur la date de dernière modification de la ressource

If-None-Match

pour les requêtes conditionnelles, inverse de If-Match

If-Range

dans les requêtes conditionnelles, le client demande au serveur de lui renvoyer la portion spécifiée de la ressource, si cette dernière n'a pas été modifiée (condition vérifiée avec un If-Unmodified-Since: par exemple)

If-Unmodified-Since

opposé de If-Modified-Since:

Last-Modified

renvoie la date de dernière modification de l'entité

Location

sert à rediriger une requête vers une autre URI

Max-Forwards

avec les méthodes TRACE et OPTIONS, sert à préciser le nombre d'intermédiaires (proxy, gateway) qui peuvent renvoyer la requête

Pragma

utilisé pour spécifier certains comportements pour les intermédiaires (no-cache, par exemple, pour demander à ce que la ressource ne soit pas cachée)

Proxy-Authenticate

utilisé lorsqu'un proxy demande à au client (l'utilisateur) de s'identifier avant de continuer la requête

Proxy-Authorization

réponse du client à un Proxy-Authenticate

Range

précise la portion (en octet) de la ressource demandée ou renvoyée

Referer

URL de la ressource à l'origine de la requête (lorsqu'on clique sur un lien par exemple, contient l'URI de la page où il y avait le lien)

Retry-After

lors d'un statuts 503 (Service Unavailable) par exemple, précise dans combien de temps le client pourra reformuler la requête (durée d'indisponibilité)

Server

indique le serveur HTTP (Apache, par exemple) qui répond à la requête

TE

indique quelle extension de Transfer-Encoding: le client accepte dans la réponse du serveur

Trailer

indique quelles directives sont présentes dans le trailer du message encodé avec avec "chunked transfer-coding" (voir Transfer-Encoding:)

Transfer-Encoding

indique le type de transformation qui a été opérée sur le corps du message pour le transférer correctement (chunked par exemple)

Upgrade

sert au client à indiquer quel protocoles de communication supplémentaires (HTTP/2.0 par exemple) il supporte et aimerait utiliser, si le serveur trouve opportun de changer de protocole

User-Agent

indique un indentifiant pour le type de client utilisé pour faire la requête (Mozilla/4.03 [fr], par exemple)

Vary

sert dans le mécanisme de cache : indique l'ensemble des directives à utiliser dans une requête client qui autorise le cache à renvoyer la réponse telle quelle, sans redemander validation auprès du serveur

Via

indique par quels intermédiaires (machines et protocoles) la requête est passée avant d'atteindre le serveur

Warning

informations additionnelles sur le statut ou la tranformation du message, et qui ne pourrait pas être signalées par d'autres directives

WWW-Authenticate

est renvoyé par le serveur lors d'un statut 401 (Unauthorized) pour demander au client de s'authentifier


Le corps de la réponse HTTP

Il s'agit tout simplement de la ressource demandée par le client accompagné d'un en-tête Content-Length.. Il est possible que le corps de la réponse soit vide, si le client a effectué une requête en utilisant la méthode HEAD ou si le serveur renvoie un code statut égal à 404 (Not Found).

1.4 Autorisations

Un utilisateur peut s'authentifier, certes de manière relativement simple. Ceci permet de protéger par exemple une partie d'un site WEB et de ne le rendre accessible que par mot de passe.

Lorsqu'un client essaie d'accéder à une ressource protégée, le serveur renvoie un statut "HTTP/1.0 401 Authorization Required" avec un en-tête WWW-Authenticate qui dit au client comment procéder pour l'authentification. A ce moment, le client demande l'authentification et la renvoie au serveur qui délivrera ou non la ressource. HTTP/1.0 ne propose au départ qu'une seule façon de s'authentifier.

1.5 Connexions persistantes

En HTTP/1.0, le serveur ferme la connexion après l'envoie de chaque ressource. Cela implique que pour chaque ressource demandée, une connexion doit être établie. Cette opération entraine un accroissement de l'utilisation CPU, de la bande passante et de la mémoire sur le serveur.

Pour améliorer les temps de réponses et diminuer la charge du réseau, les connexions en HTTP/1.1 sont persistantes. Toutefois, le client ,aussi bien que le serveur, peut notifier à l'autre son désir de fermer la connexion à la fin de la transaction courante. Les requêtes ainsi que les réponses peuvent être enchaînées les unes après les autres.

Cette façon de procéder permet de remplacer l'utilisation de l'en-tête Keep-Alive qui ne fonctionnait pas toujours correctement en présence d'un proxy.

L'en-tête Transfer-Encoding: chunked a été introduit afin de permettre de continuer à utiliser des connexions persistantes même lorsque certaines ressources transmises sont générées dynamiquement (scripts CGI) et que leur taille n'est donc pas connue (En-tête Content-Length impossible à déterminer). Lorsque cet en-tête est utilisé, la ressource est envoyée par blocs précédés chacun de l'indication de la longueur du bloc. Un bloc vide (longueur 0) marquera la fin de la ressource.

1.6 Le cache

Un cache est une zone sur la machine du client ou sur une autre machine (proxy) qui conservera les ressources échangées entre le client et le serveur. Lorsqu'une de ces ressources sera à nouveau demandée par le client, c'est la copie conservée dans le cache qui sera utilisée. Cela permet, entre autres, de gagner du temps sur les ressources très sollicitées (les pages d'un intranet par exemple) et par voie de conséquence de réduire le trafic sur le réseau.

Toute la difficulté consiste à déterminer si le document a été mis à jour.

Le client va en fait soumettre la requête à un proxy ou tout autre dispositif comportant un cache. Ce dispositif va tenter de déterminer si le document caché qu’il possède est valable ou non.

Pour cela, il va s'aider des directives reçues lorsque le document a été demandé pour la première fois, et éventuellement faire une requête HEAD.

En fonction de la réponse, le proxy va :

C'est la répétition de ce dernier cas qui permet d'améliorer les temps de réponses.

Les en-têtes tels que Date, Expires et Last-Modified permettent de savoir quand la ressource demandée a été modifié depuis la dernière fois, ou de calculer le temps que doit rester une ressource dans le cache, voire tout simplement de dire à partir de quand on doit demander au serveur de renvoyer la nouvelle ressource (en-tête Expires).

La méthode HEAD est utilisée pour déterminer si une ressource a été modifiée depuis la dernière fois. Contrairement à la méthode GET, cette méthode ne demande pas le transfert de la ressource, ce qui permet par exemple d'obtenir la date de dernière modification et donc d'en déduire si la ressource demandée a changé depuis la dernière fois, sans pour autant surchargé le réseau.

L'en-tête If-Modified-Since permet de demander au serveur de renvoyer la ressource si et seulement si cette dernière a changé depuis la date indiquée dans l'en-tête. Pour le client, il suffit juste d'envoyer la date à laquelle il a reçu la ressource pour la dernière fois. Si la ressource n'a pas été modifiée, le serveur renvoie un statut 304 Not Modified et le client sait alors qu'il n'a plus qu'a transférer la ressource conservée en cache.

L'en-tête Pragma: no-cache permet d'interdire l'enregistrement d'une ressource en cache. On peut également utiliser l'en-tête Expires: avec comme valeur une date inférieure à celle du jour.

1.7 HTTP-NG : le futur HTTP

HTTP montre des limites en matière de modularité et de performances. Simomn Spero a proposé en 1995 un HTTP-NG (pour New Generation) repris par le W3C en 1997 qui vise à améliorer les performances de son prédécesseur.

Ainsi, le protocole HTTP-NG :

En plus de ces performances améliorées, HTTP-NG supporte toutes les caractéristiques de HTTP, mais implémenté de manière complètement différente.

En 1995, HTTP-NG a été testé sur une liaison transatlantique et a montré de bonnes performances avec une utilisation entière de la bande passante disponible.

En revanche, HTTP/1.0 a seulement été capable d'utiliser un dixième de la bande passante. Comme prévu, les performances de HTTP-NG ne se sont pas dégradées autant que celles de HTTP dans des conditions de congestion.; il s'est comporté nettement mieux qu'avec des connexions multiples comme le permettent des navigateurs modernes multi-tâches.

Si la version NG est intéropérable avec la version 1.1, son déploiement n'en nécessite pas moins une mise à niveau des logiciels clients et serveurs longue et coûteuse. De plus sa standardisation est encore au stade de l'élaboration.

Politique de connexion
La différence majeure entre HTTP 1.0 et HTTP-NG est que ce dernier tente de réutiliser des connexions pour des transactions multiples. Une fois connecté, HTTP-NG reste connecté. Cela évite la charge due aux multiples demandes de connexion. Cela donne du temps pour que le mécanisme d'évitement de la congestion puisse monter son taux de transmission en puissance. Comme il y a moins de connexions, le serveur utilise bien moins de ressources pour retenir l'historique des connexions récemment fermées.

Flux de données multiples
L'unique connexion HTTP-NG est divisée en de multiples sessions virtuelles, chacune d'entre elle pouvant ramener un objet requis en parallèle. Ces dernières sont asynchrones, permettant à un client d'émettre de multiples requêtes sans attendre d'accusé de réception, sans parler de l'attente même de l'objet requis. Il existe une session dédiée, similaire à la connexion de contrôle du protocole FTP, utilisée pour envoyer toutes les requêtes et recevoir les meta-informations (auteur, détails de copyright, coûts, ou requêtes de redirection pour utiliser une connexion externe spéciale, comme par exemple un lien ATM pour de la vidéo en direct).

Protocole binaire
HTTP étant un protocole orienté texte, cela le rend aisé à debogguer. Cependant, tous ces en-têtes textuels signifient une charge considérable lorsqu'on transporte de petits objets , le transport pouvant se débrouiller avec des données binaires, ce qu'il fait d'ailleurs déjà pour le corps des objets. HTTP-NG utilise un protocole binaire et rendu encore plus compact. Cela veut dire qu'une requête typique est très petite, mais ressemble à n'importe quoi tant qu'elle n'a pas été décodée.

Authentification et paiement
Chaque message individuel lors d'une connexion avec HTTP-NG peut être authentifié. La méthode de sécurité ne fait pas partie du protocole donc n'importe quelle méthode supportée à la fois par le client et le serveur peut être utilisée; des messages individuels peuvent utiliser des mécanismes d'authentification différents si nécessaire. Les données chiffrées peuvent être transportées en toute sécurité à travers des proxies intermédiaires moins sûrs. Comme réponse dans un environnement d'authentification, le serveur peut signaler à un client que le service requis encourre un coût. Et propose une liste de méthodes de paiement acceptables. Le client peut bien sûr refuser de continuer.

1.8 HTTPS : HTTP Secure

C'est un protocole issu de Netscape et lié à une connexion par socket sécurisée, autrement dit du HTTP avec une pincée de SSL (Secure Socket Layer). Sa principale utilisation est le commerce électronique.

Le protocole HTTPS utilise le port 443 par défaut et son rôle est de crypter la communication entre le client et le serveur. Pour cela, il est nécessaire d'établir une session SSL avant la connexion HTTP, l'utilisation du protocole HTTP est ensuite complètement identique .

Habituellement, les accès à des pages WEB se font à l'aide du protocole HTTP, en empruntant le réseau Internet. Aucune garantie de confidentialité n'est assurée lors des accès à des données soumises à authentification ( échange de login - mot de passe) dans le cadre d' applications de commerce électronique, par exemple. Il faut savoir que, dans ce cas, il n'est pas très difficile à un pirate d'intercepter ces informations confidentielles, y compris le mot de passe du client , et ainsi d'usurper son identité, voire récupérer son code de carte bleue. Afin de palier à ces inconvénients, le protocole HTTPS peut être mis en œuvre.

En outre, on n'a pas une certitude absolue d'être en cours de consultation du site auquel on croit être connecté.

D'une manière très schématique, HTTPS permet d'encapsuler et de crypter le trafic HTTP; ainsi, il sera quasiment impossible à un pirate qui intercepterait des accès à des pages chargées via le protocole HTTPS, de décrypter cet échange, et donc de récupérer des informations confidentielles. De surcroît , HTTPS permet de s'assurer que le serveur auquel on accède est bien celui que l'on croit.

HTTPS offre d'autres possibilités qui ne sont pas abordées ici (par exemple, authentifier la personne qui accède au serveur). Sans entrer dans du détail technique, les échanges HTTPS sont cryptés et décryptés à l'aide d'un couple de 'clés informatiques' qui sont propres à un serveur :

Le navigateur qui accède à un serveur doit récupérer la clé publique de ce serveur; celle-ci lui est transmise depuis le serveur, encapsulée dans un certificat X509 (c'est un fichier informatique). Ce certificat contient donc la clé publique du serveur, validée ("signée") par un organisme reconnu, appelé Certificate Authority (CA).

1.9 PRODUITS

Les clients HTTP :

Les serveurs HTTP :

Divers :

1.10 CONCLUSION

Avec la possibilité de conserver ouverte une connexion jusqu’au transfert complet d’une page, la version 1.1, apporte un gain de performance non négligeable, surtout si l’on songe qu’il s’agit d’une connexion TCP qui fait l’objet d’une négociation complète entre l’appelant et l’appelé lors de son établissement.

HTTP/1.1 est finalement la version finale tant attendue de HTTP. Enormément d'améliorations ont été apportées, même par rapport à HTTP/1.0 qui était déjà un bond en avant dans l'évolution du protocole. Toute la mécanique de base du protocole est désormais mise en place, et il est à croire que peu d'autres améliorations techniques seront apportées dans les futures versions de HTTP. Ce à quoi il faut s'attendre sur les prochaines versions, c'est surtout une réponse aux nouveaux besoins du WEB : l'e-commerce, l'e-business...

HTTP va certainement s'orienter de plus en plus vers un "service de haut niveau".