Le protocole HTTP
Dernière mise à jour le 8 octobre 2022
Internet le Web
Sauriez-vous expliquer la différence entre Internet et le Web? Non?
Hum... C'est un peu gênant pour des informaticiens. Mais ça s'explique : c'est avec l'apparition du Web qu'Internet est entré dans la vie de la plupart d'entre nous et c'est pourquoi les deux sont parfois confondus.
Mais il est important de faire la distinction entre les deux.
Internet
Internet est le grand réseau informatique mondial accessible au public. Il est composé de millions de réseaux publics, privés, universitaires, commerciaux et gouvernementaux.
Ses premiers balbutiements datent des années 1960, essentiellement aux États-Unis.
Internet permet toutes sortes d'applications dont évidemment le Web, mais aussi le courrier électronique, la messagerie instantanée, le partage de fichiers en pair-à-pair, le streaming, le podcasting, la téléconférence et tout ce se rapporte à l'Internet des objets.
L'information y circule à l'aide de protocoles de communication standardisés comme IP, TCP, UDP, HTTP, FTP, SMTP, POP, IMAP, Telnet, SSH, MQTT, etc.
Le Web
C'est seulement avec l'apparition du Web vers 1993 que le grand public commence à entendre parler d'Internet
Le Web est un système hypertexte public basé sur Internet
Un document hypertexte est un document dont les pages sont reliées entre elles par des hyperliens. La principale caractéristique d'un tel document est qu'il peut être parcouru de façon non linéaire
Le mot "Web" fait référence à une toile d'araignée en anglais. On dit aussi World Wide Web ou WWW puisque cette toile de documents hypertextes s'étend sur l'ensemble de la planète
Le navigateur (client) Web
Pour se connecter à Internet, il n'est pas toujours nécessaire de disposer d'un navigateur Web.
Par exemple, si le but est d'envoyer un courriel, un programme de courrier électronique (protocole SMTP) est suffisante. S'il s'agit de transmettre en temps réel la positiom d'un camion de livraison à la centrale, une application embarquée (protocole MQTT) fera l'affaire.
Mais quand vient le temps de naviguer sur le Web, on utilise ce qu'on appelle tous maintenant un navigateur Web (on dit aussi fureteur, client Web ou client HTTP).
Les navigateurs les plus connus sont :
- Chrome (Google) / Chromium
- Safari (Apple)
- Edge (Microsoft)
- Firerox (Mozilla)
- Opera
Le serveur Web
À l'autre bout se trouve le serveur Web.
C'est le logiciel dont le rôle est de servir des pages Web (ou autres ressources) aux navigateurs (clients Web) qui en font la demande.
Les serveurs Web les plus connus sont :
On appelle aussi parfois "serveur Web" l'ordinateur sur lequel s'exécute le programme.
Structure d'une URL
Une URL (pour Uniform Resource Locator ou localisateur uniforme de ressource) est une adresse Web.
L'URL débute généralement par le nom du protocole comme http://
, https://
(connexion sécurisée), ftp://
ou file://
.
Exemple d'une page sur le site Web du cours :
https://prog101.com/lamp/fichiers.php
Exemple de documents chargés directement depuis le disque dur :
file:///C:/Users/patoche/kb9/exercice1.html
Vient ensuite l'emplacement de la ressource, soit le nom de domaine ou l'adresse IP :
https://prog101.com/lamp/fichiers.php http://198.245.55.77/~bob/tp1/resultats.csv
La dernière partie est constituée du nom complet de la ressource, c'est-à-dire du nom de fichier incluant le chemin (répertoires)
https://prog101.com/lamp/fichiers.php
Attention! La dernière partie (chemin complet) peut être sensible à la casse (lettres majuscules ou minuscules) dépendamment du sytème d'exploitation du serveur.
Adresses IP et noms de domaines
Tous les ordinateurs, tablettes, téléphones "intelligents" et autres dispositifs connectés à Internet doivent avoir une adresse unique.
Cette adresse IP (pour Internet Protocol) est formée (pour la version 4) de quatre nombres de 1 à 254 séparés par des points.
Par exemple, pour l'ordinateur dont le nom de domaine est vps208932.vps.ovh.ca (notre serveur d'hébergement!) :
198.245.55.77
Pour la version 6 du protocole IP, elle est formée de 8 groupes de deux octets en notation hexadécimale (base 16) :
2607:5300:201:3100:0:0:0:889
Puisque de telles adresses sont difficiles à mémoriser et peu significatives, on les traduit souvent en une chaîne de caractères, c'est le nom de domaine ou simplement "domaine" (ex : prog101.com).
Il existe des outils en ligne pour savoir à quelle adresse IP correspond un nom de domaine et vice versa.
Introduction à HTTP
HTTP est le protocole du Web. D'ailleurs, les expressions serveur HTTP et serveur Web sont synonymes
Il s'agit d'un genre de dialecte utilisé par clients (navigateurs) et serveurs Web pour communiquer entre eux.
Une connaissance de base du protcole HTTP est nécessaire chez les développeurs Web.
HTTP et modèles en couches
Vous avez sûrement déjà abordé le modèle OSI ou le modèle modèle TCP/IP (modèle Internet) dans votre cours de réseaux informatiques.
HTTP'est un protocole texte de la couche "application".
Il est basé sur le protocole TCP/IP.
Dans les laboratoires du collège, une requête HTTP est encapsulée dans un paquet TCP, qui est encapsulé dans un paquet IP, qui est encapsulé dans une trame Ethernet.
La réponse HTTP fait le même chemin en sens inverse.
Séquence de connexion
Nous allons examiner ici ce qui arrive quand un internaute utilise la navigateur Firefox pour se connecter à votre site Web préféré, soit prog101.com.
Les étapes sont :
- connexion à un serveur DNS
- demande de l'adresse IP correspondant à "prog101.com"
- réponse du serveur DNS
- connexion au serveur Web à l'adresse IP retournée par le serveur DNS
- demande de la page d'accueil de "prog101.com" (requête HTTP)
- réponse du serveur Web (réponse HTTP)
- affichage du document par Firefox
Le DNS
Firefox ne peut se connecter immédiatement par socket TCP au serveur de prog101.com, il doit d'abord trouver l'adresse IP correspondante.
Pour trouver l'adresse IP correspondant au domaine prog101.com, le navigateur s'informe auprès d'un serveur DNS (Domain Name System).
L'opération est rapide et transparente pour l'internaute, car l'adresse IP d'un ou de plusieurs serveurs DNS est déjà écrite dans la configuration réseau de son ordinateur.
Une fois l'adresse IP de prog101.com obtenue, Firefox envoie une requête HTTP pour obtenir la page d'accueil du site ("/").
La commande nslookup de Windows permet d'interroger manuellement le serveur DNS :
C:\>nslookup prog101.com
Serveur : epp1.epp.clg.qc.ca
Address: 172.17.200.11
Réponse ne faisant pas autorité :
Nom : prog101.com
Address: 184.107.112.64
C:\>
La commande équivalente sous Linux est dig.
La requête GET
Une fois l'adresse 184.107.112.64 obtenue d'un serveur DSN, Firefox va ouvrir un socket TCP et tenter de se connecter à cette adresse.
Si la connexion est établie, Firefox envoie une première requête HTTP pour obtenir la page d'accueil (racine) du site :
GET / HTTP/1.1
Toutes les requêtes HTTP se ressemblent.
Elles débutent toutes par un mot clé (nom de la requête), suivi du chemin du document demandé (fichier ou répertoire), suivi de la chaîne "HTTP/" et du numéro de version du protocole.
GET /tp1.html HTTP/1.0 | | | | | +-- version du protocole | | | +-- chemin du document | +-- nom de la requête (GET, POST, PUT, DELETE, etc.)
Ici la requête GET signifie que l'on veut obtenir un document, la chaîne "/tp1.html" est le chemin du document demandé et la chaîne "HTTP/1.0" indique que Firefox aimerait échanger avec le serveur en utilisant cette version du protocole.
Cas d'un répertoire
Si le document demandé est un répertoire, un serveur Web cherche dans ce répertoire un document prédéterminé (généralement nommé index.html ou index.php) et, s'il le trouve, le retourne au navigateur.
Si le fichier index n'est pas trouvé, le serveur peut soit retourner un code 403 (voir plus loin), soit retourner un fichier HTML donnant la liste des éléments contenus dans le répertoire sous forme d'hyperliens.
Exemple :
En-têtes de requête
La requête est généralement accompagnée d'une série d'en-têtes (informations supplémentaires).
Un en-tête est une ligne de texte où figure un couple nom-valeur dont les composants sont séparés par le caractère ":".
La figure suivante montre la requête et les en-têtes envoyés par Firefox pour obtenir la page d'accueil du site prog101.com sous Ubuntu Linux :
GET / HTTP/1.1 Host: prog101.com User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.15) Gecko/201 [10303 Ubuntu/10.04 (lucid) Firefox/3.6.15 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 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: 115 Proxy-Connection: keep-alive (ligne vide)
L'en-tête Host
L'en-tête le plus important (et le seul obligatoire) est le premier, soit "Host: prog101.com"
GET / HTTP/1.1
Host: prog101.com
User-Agent: Mozilla/5.0 (X11; U; Linux i686; fr; rv:1.9.2.15) Gecko/201
[10303 Ubuntu/10.04 (lucid) Firefox/3.6.15
...
Proxy-Connection: keep-alive
(ligne vide)
Étant donné qu'une adresse IP peut être partagée par plusieurs sites Web (hôtes virtuels), il devient essentiel dans ces cas de spécifier le nom de domaine (en-tête "Host" obligatoire en HTTP/1.1).
L'information envoyée au serveur (requête et en-têtes) se termine par une ligne vide.
C'est cette ligne vide qui indique au serveur que le client a tout envoyé.
Réponse du serveur
L'information envoyée au client (navigateur) par le serveur à la suite d'une requête HTTP a la même structure qu'une requête, soit une ligne obligatoire (la réponse), suivie normalement d'en-têtes, d'une ligne vide et, possiblement, d'un contenu (le document) :
Réponse HTTP En-tête 1 En-tête 2 ... En-tête N (ligne vide) Document
La réponse envoyée par le serveur dans notre exemple est :
HTTP/1.0 200 OK
La syntaxe d'une réponse est toujours la même, soit la chaîne "HTTP/", suivie de la version du protocole utilisée par le serveur, un nombre entier de trois chiffres (le code d'état ou status code) et normalement d'un court texte descriptif :
HTTP/1.0 200 OK | | | | | +-- court texte descriptif (pour les humains!) | | | +-- code d'état (pour traitement automatique) | +-- version du protcole (1.0 ou 1.1)
La réponse de notre exemple signifie que le serveur utilise la version 1.0 du protocole et que la requête a pu être satisfaite (code 200), d'où le "OK".
Le code d'état (status code)
Comme dans le cas des autres protocoles texte basés sur TCP (FTP, POP3, SMTP, etc.), les codes d'état HTTP sont nombreux et obéissent à une syntaxe bien définie où chacun des trois chiffres a une signification particulière.
Le premier chiffre indique le type de message :
Chiffre | Type de message |
---|---|
1xx | Information |
2xx | Succès |
3xx | Redirection |
4xx | Erreur du client |
5xx | Erreur du serveur |
Sans entrer dans les détails, on peut deviner que lorsque le code débute par un 4 ou par un 5, c'est que ça va mal.
Principaux codes d'état
Parmi les codes d'état les plus rencontrés on trouve :
200 - Tout va bien, le serveur a été en mesure de satisfaire la requête (document trouvé)
301 - Le document demandé a été déplacé de façon permanente
302 - Le document demandé a été déplacé de façon temporaire
400 - La requête n'a pas été comprise par le serveur (la cause peut être une mauvaise syntaxe, un nombre incorrect de paramètres, une version du protocole invalide, etc.)
403 - Accès non autorisé (soit que le document est protégé par mot de passe, soit qu'il s'agit d'un répertoire qui ne contient pas de fichier "index.html")
404 - Celui-là, tout le monde l'a déjà vu, il indique que le document demandé est introuvable
500 - Erreur interne du serveur (ça ne va pas bien du tout)
501 - La syntaxe de la requête est valide, mais le nom de la requête est inconnu par le serveur (mauvaise version de protocole?)
En-têtes de réponse
Tout comme les en-têtes de requête, les en-têtes de réponse sont des couples nom-valeur.
Parmi les plus connus on remarque :
En-tête | Description |
---|---|
Server | Chaîne de caractère qui identifie le serveur |
Date | Date et heure de génération de la réponse |
Content-type | Type MIME du document |
Last-modified | Date et heure de dernière modification du document |
Content-length | Taille du document en octets |
La figure suivante montre la réponse, les en-têtes et le document envoyés par un serveur Apache suite à la requête GET examinée précédemment :
HTTP/1.0 200 OK
Date: Wed, 30 Mar 2011 15:08:45 GMT
Server: Apache
X-Powered-By: PHP/5.2.13
Content-Type: text/html
X-Cache: MISS from pf2.clg.qc.ca
X-Cache-Lookup: MISS from pf2.clg.qc.ca:8080
Via: 1.0 pf2.clg.qc.ca:8080 (squid/2.6.STABLE6)
Content-Length: 1724
Proxy-Connection: close
(ligne vide)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://
[www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Prog 101</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="description" content="Site à l'intention des élèves en info
[rmatique du collège Lionel-Groulx" />
<meta name="keywords" content="exemples de code, web, php, java, junit,
[ tests de logiciels, port serie" />
<link href="/format/new_styles.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div class="conteneur">
<div class="en-tete">
<h1 class="en-tete">Prog 101</h1>
...
La requête HEAD
La requête HEAD a la même syntaxe que la requête GET, mais a ceci de différent qu'elle ne demande pas au serveur d'envoyer le document, mais seulement les en-têtes. Donc, aucun code HTML n'est envoyé au client.
Elle est utilisée par les navigateurs, par exemple, pour savoir si le document présent sur le serveur est plus récent que celui présent dans son cache.
La requête HEAD retourne donc une réponse HTTP, suivie normalement d'en-têtes, puis d'une ligne vide.
C'est tout!
Les autres requêtes
Il existe évidemment d'autres requêtes que GET et HEAD.
À l'exception de la requête POST (que nous verrons plus tard), elles sont beaucoup moins utilisées.
Le tableau suivant rassemble les requêtes HTTP existantes :
GET | Demande une ressource. Il doit être possible d'envoyer cette requête plusieurs fois sans affecter la ressource. |
HEAD | Demande des informations sur une ressource, sans demander la ressource elle-même. |
POST | Transmet des données en vue de leur traitement par une ressource. Cette méthode peut créer une ressource ou affecter une ressource existante. Utilisée par les formulaires HTML. |
OPTIONS | Demande les options de communication d'une ressource ou du serveur en général. |
CONNECT | Permet d'utiliser un proxy comme un tunnel de communication. |
TRACE | Demande au serveur de retourner ce qu'il a reçu (écho) pour tester la connexion. |
PUT | Ajoute ou remplace une ressource. |
PATCH | Permet de modifier partiellement une ressource. |
DELETE | Supprime une ressource. |
Envoyer une requête manuellement (PuTTY)
Vous connaissez probablement déjà PuTTY. C'est un émulateur de terminal qui peut jouer le rôle d'un client Telnet ou SSH.
En plus de pemettre la connexion distantes à un serveur pour en effectuer la maintenance, il peut être utilisé pour faire l'apprentissage de plusieurs protocoles de niveau application (HTTP, FTP, SMTP, POP3, etc.).
Par exemple, il permet d'envoyer directement des requêtes HTTP à un serveur Web.
Dans l'exemple suivant, nous allons utiliser PuTTY pour demander la page d'accueil du site prog101.com :
L'auteur de ce document est passé récemment à HTTPS (version sécurisée de HTTP) pour son site Web, ce qui fait que l'exemple suivant ne fonctionner plus. Veuillez utiliser un autre site, par exemple codeandroid.net ou salihayacoub.com.
La figure suivante indique les paramètres de connexion de l'exemple présenté :
Une fois la connexion réalisée, il faut entrer...
- la requête HTTP`
- l'en-tête obligatoire pour les hôtes virtuels
- une ligne vide pour signifier au serveur la fin de la requête.
Soit :
GET / HTTP/1.1 Enter Host: codeandroid.netEnter Enter
Une fraction de seconde après, le serveur nous retourne sa réponse :
L'émulateur de terminal est un outil essentiel pour développer des programmes de communication.
N'hésitez pas à l'utiliser!
Un protocole non connecté
Avez-vous remarqué qu'après avoir obtenu une page à l'aide de PuTTY, le serveur vous a déconnecté immédiatement? Habituez-vous, car c'est comme ça que fonctionne le Web!
On dit de HTTP qu'il est un protocole "non-connecté" (stateless protocol). Chaque requête est indépendante de la précédente et de la suivante.
Nous verrons bientôt tout ce que cela peut causer comme problèmes aux applications Web!
Questions et exercices de révision
Nous ne fournirons pas les réponses à ces questions pour deux bonnes raisons. La première est que celles-ci se trouvent dans les notes de cours. La seconde est que, dans certains cas, ce serait presque donner la réponse à des questions d'examen.
Question 1
Expliquez la différence fondamentale entre un document conventionnel et un document hypertexte.
Question 2
Identifiez la ligne contenant deux URL qui mènent au même document :
1- https://prog101.com/lamp/fichiers.php https://PROG101.com/lamp/fichiers.php 2- https://prog101.com/lamp/fichiers.php https://prog101.com/lamp/Fichiers.php
Question 3
Quel est le rôle d'un serveur DNS?
Question 4
Dans la requête suivante, que signifie le premier caractère "/"?
GET / HTTP/1.1
Question 5
Donnez le nom de l'entête de requête qui identifie le client (nom du navigateur, du robot d'indexation, etc.).
Question 6
L'ensemble de la réponse à une requête HTTP contient les éléments suivants : code HTML, entêtes de réponse, ligne vide, réponse HTTP. Indiquez dans quel ordre ces informations sont envoyées au client.
Question 7
Que signifie le code d'état HTTP 200 retourné pas le serveur?
Question 8
Que signifie un code d'état HTTP débutant pas le chiffre "4"?
Question 9
Suite à une requête HTTP pour une image au format PNG. Quel est le nom de l'entête de réponse dont le contenu sera image/png
?
Question 10
Donnez la différence entre la requête GET et la requête HEAD.