HTTP, l'HyperText Transfert Protocol est LE protocole de communication d'Internet, développé spécifiquement pour les serveurs web afin de supporter les sites et d'autres applications.


Un peu de contexte avant de rentrer dans le détail

Ce langage fondamental pour Internet, est définit, pour la 1ère fois en Mai 1996 avec la RFC1945. RFC2616 pour HTTP 1.1 en Juin 1999. Version détaillée à partir de 2014 par les RFC 7230 à 7237.

L'HTTP est un protocole de la couche applicative, dans un réseau TCP/IP. Le but est de faciliter les échanges de tout type de documents structurés, HTML & XML notamment (mark-up language).

La définition d'HTTP fait du port 80 le port valide par défaut à attacher à l'IP de la requête (après résolution DNS). HTTP n'utilise pas le mode de transport UDP mais uniquement TCP.


Transaction HTTP

L'essentiel du service rendu par un serveur web est de traduire une URL qu'on lui envoie, et de déterminer à partir de cette URL qu'elle est le contenu de fichier ou les sorties de programme à renvoyer comme réponse.


Une transaction HTTP c'est;

1. Le client contacte le serveur web sous la forme d'une requête HTTP pour obtenir une ressource,

2. Le serveur répond, soit en reprenant la requête, soit en fournissant la réponse, accompagné éventuellement d'en-têtes et d'un corps de message.


Exemple :

On peut faire cela à la ligne de commande, mais généralement on préfère faire ces requêtes à partir d'une URL dans la barre d'adresse de son navigateur internet!

raslink.fr first 


L'URL d'HTTP

C'est l'adresse que l'on voit dans la barre d'adresse d'un navigateur.

Dans sa forme la plus générale, une URL c'est;

url:<scheme>:<scheme-specific-part>

Spécifications d'une URL en 1994 via la RFC1738.

Une ressource Web/Internet s'adresse donc avec son Uniform Resource Locator. 

Dans notre cas, scheme est un protocole; HTTP.

url:<protocole>:<protocole-specific-part>
url:http:<protocole-specific-part>

(d'autres protocoles web sont; mailto, telnet, file, ftp, etc...)

Pour HTTP, le <scheme-specific-part> est;

url:http:<//hôte></chemindaccès>

 

L'URL contient l'adresse de la ressource sous la forme de;

  • un hôte, une machine comme un serveur web du domaine tartempion.org,
  • un path, le chemin d'accès sur ce serveur de la ressource demandée, comme la page d'accueil du site.

De plus, l'URL peut contenir des chemins additionnels.

Elle peut également contenir des paramètres destinés à la ressource, on obtient du coup une URL générique tel que;

url:http:<//host></path1></path2></pathX>?<param1=value&param2=value&...>

On note le double slash du host signifiant que l'URL est absolue, non relatif à une quelconque URL autre. L'élément suivant doit être le host et rien d'autre.

 

Exemple de transaction HTTP

 

Valider l'URL <http://raslink.fr> dans la barre d'adresse d'un navigateur c'est pour HTTP l'échange suivant :

 

Requête client

 

GET / HTTP/1.1
Host: raslink.fr
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0

 

Réponse serveur

 

HTTP/1.1 200 OK
Date: Sun, 30 Apr 2017 22:10:10 GMT
Server: Apache/2.43
Content-type: text/html
Connection: closed

<HTML>
<BODY>
<P>Hello World</P>
</BODY>
</HTML>

 

Détails Requête

Dans notre exemple, on a :

url:http://raslink.fr

Le navigateur déduit qu'il doit envoyer une requête avec;

protocole=http
host=raslink.fr
path=/ 

En effet le path d'une URL (path1) NE PEUT PAS ETRE VIDE, il est au moins égal à </>, ce qu'ajoute donc le navigateur automatiquement si on ne le précise pas au moment de former la requête HTTP.


S'en suit généralement 3 parties;

  • Client request : la requête en tant que tel,
  • Client headers : des en-têtes,
  • client body : des données supplémentaires, le body payload.

Client request

Dans notre exemple :

GET / HTTP/1.1 

Cette requête client contient 3 parties;

  • une méthode, ici GET,
  • une URI (Unique Resource Identifier), ici / ,
  • la version du protocole HTTP utilisée, ici http/1.1.

Les méthodes (http/1.1) possibles et déterminées par le navigateur sont :

  • GET
  • HEAD
  • POST
  • PUT
  • DELETE
  • TRACE
  • CONNECT

D'une manière générale, c'est le rôle du navigateur de déterminer du PATH fourni dans l'url une URI appropriée à la METHOD définie pour la requête.

PATH = /<path1>/<path2>/.../<?param1=value&param2=value&...>

Avec <url:http://www.raslink.fr/index.html> donne GET avec URI=/index.html.


Client headers

Le client peut ajouter à cette requête HTTP des lignes d'en-têtes, précisant des points de configuration pertinent pour le serveur, comme le host (la machine à qui on adresse la requête). Des lignes optionnelles peuvent également être ajouté, comme des formats de fichiers attendus/acceptés (mime-type), la version exacte de l'application cliente (User-agent) ou l'url source de la requête (Referer).

Exemple avec Firefox, le header contiendrait les lignes;

Host: raslink.fr
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:53.0) Gecko/20100101 Firefox/53.0

Le client envoie une ligne blanche au serveur pour signaler la fin des lignes d'en-têtes.


Client body

Dans notre exemple, rien!

Partie facultative, par exemple des données utilisées par des programmes CGI via la méthode POST.

name=toto&year=2017&month=1&day=1

 

Détails Réponse

Réponse en 3 parties;

  • Server status code, un code d'état,
  • Server headers, des en-têtes,
  • Server body, un corps de message, body-payload.

Server status code

HTTP/1.1 200 OK

C'est 3 champs;

La version HTTP utilisée par le serveur.

Le code d'état; sur 3 chiffres représentant le résultat fournit par le serveur à la requête.

La description du code d'état.

Le code 200 indique donc un succès et des données à suivre dans le corps du message http. 404 est également un code courant (Not found)!


Server headers

Ces lignes contiennent des informations sur le serveur et le document servi en réponse.

Date: Sun, 30 Apr 2017 22:10:10 GMT
Server: Apache/2.43
Content-type: text/html
Content-lenght: 2482

Une ligne blanche termine l'en-tête.


Server body

Un contenu n'est généralement fourni qu'après un succès, une page html comme ici, un fichier, ou plus généralement une réponse à un programme CGI.

<HTML>
<BODY>
<P>Hello World</P>
</BODY></HTML>

 

On voit ici le rôle essentiel de l'URL et du path pour transmettre au serveur tout un ensemble de paramètres à l'intérieur d'une requête HTTP.


Voir Hypertexte, le système Hypertexte est un "concept" ayant précédé Internet, voir inspiré: Hypertexte - Hypertext.

Voir les évolutions techniques, HTTP/2: HTTP/2 RFC7540 Mai 2015.