Développement d'applications Web avec LAMP

Document d'accompagnement pour le cours 420-KB9-LG

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

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 :

Le serveur Web

À l'autre bout se trouve le serveur Web.

[Schéma client-serveur]

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.

[dexcription]

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.

[dexcription]

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.

[dexcription]

Les étapes sont :

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 :

[dexcription]

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 :

ChiffreType de message
1xxInformation
2xxSuccès
3xxRedirection
4xxErreur du client
5xxErreur 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 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 :

AVERTISSEMENT

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

[dexcription]

Une fois la connexion réalisée, il faut entrer...

Soit :

GET / HTTP/1.1 Enter
Host: codeandroid.netEnter
Enter

Une fraction de seconde après, le serveur nous retourne sa réponse :

[dexcription]

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!

[dexcription]

Questions et exercices de révision

AVERTISSEMENT

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.