### Client/Serveur avec HTTP

Remarque : les explications qui suivent sont une présentation simplifiée du principe client/serveur avec le protocole HTTP utilisé pour le Web. Ces explications visent à une bonne compréhension des principes et ne constituent pas un cours réseau détaillé.

Le client est un navigateur Web : un programme qui "écoute" un port sur un ordinateur. Cette "écoute" lui permet de dialoguer avec un autre ordinateur (le serveur) : envoyer des demandes ou des informations, recevoir des fichiers.
Le client interpréte les fichiers qu'il reçoit si ils contiennent du code HTML, CSS ou JavaScript. Il sait aussi décoder certains types de fichiers binaires (aux formats gif, jpeg, png, mp4, mp3, etc) pour en faire l'affichage ou la lecture audio.

Par extension, le terme client est utilisé aussi bien pour le programme que pour l'ordinateur sur lequel le programme est exécuté.

Le serveur est un serveur Web : un programme qui "écoute" un port sur un ordinateur. Cette "écoute" lui permet de dialoguer avec un autre ordinateur (le client) : recevoir des demandes ou des informations, renvoyer une réponse appropriée.
Le serveur a accès à l'espace de stockage de l'ordinateur sur lequel il s'exécute et en particulier en particulier aux fichiers qu'il va envoyer au client pour que celui-ci les interprète (HTML, CSS, JavaScript) ou les affiche (gif, jpeg, png, mp4, mp3, etc).
Le serveur peut réaliser des traitements de tous types (lecture / écriture de fichiers, connexion à des bases de données, calculs, génération de contenus ...) en faisant appel à des applications ou programmes compilés (Java, C++, C, etc) ou interprétés (python, shell script, PHP, etc).

Par extension, le terme serveur est utilisé aussi bien pour le programme que pour l'ordinateur sur lequel le programme est exécuté.

Le dialogue entre le client et le serveur s'effectue grâce au protocole HTTP (HyperText Transfert Protocol), mis au point en même temps que HTML.

Le principe de ce dialogue est le suivant :

dialogue client-serveur

1 | L'utilisateur saisit une adresse dans la barre d'adresse du navigateur ou clique sur un lien dans une page html.
2 | Le navigateur client demande le fichier HTML correspondant au serveur en lui envoyant un message HTTP de type `request` (requête).
3 | Le serveur Web recherche dans le disque du serveur (l'ordinateur) le fichier HTML demandé.
4 | Le serveur Web envoie au client le fichier HTML dans le corps d'un message HTTP de type `response` (réponse)
5 | Le navigateur client reçoit le fichier en fait le parsing (analyse syntaxique) et l'affichage dans sa fenêtre. Au cours de la phase de parsing, chaque fois que le navigateur trouve une référence sur un élément embarqué (par exemple une image) il fait une demande du fichier correspondant au serveur, et un cycle complet de 1 à 5 recommence.

Il est important de noter et bien prendre en compte les éléments suivants :

C'est toujours le client qui appelle le serveur.

De nouvelles API sont en cours de mise au point et devraient permettre à terme de changer cette règle : le serveur sera capable de pousser (push) des informations au client sans que celui ne les demande. Pour le moment ça n'est pas encore le cas.

Il y a autant de demandes que de ressources à traiter. Par exemple une page HTML avec 5 images donnera lieu à 6 demandes (et 6 réponses) : 1 demande pour le fichier HTML et 5 demandes pour les images.

Les demandes sont asynchrones : le navigateur client n'attend pas d'avoir reçu une réponse à une demande pour en faire une autre. Le nombre de requêtes en cours est toutefois limité de 6 à 8 suivant les navigateurs.

Il n'y a pas de persistance dans les connexions : une fois que le navigateur à récupéré toutes les ressources d'une page, la connexion avec le serveur est coupée.

Une requête HTTP est composée généralement par :

- une méthode HTTP (`GET`, `POST`, `PUT`, etc),
- des directives d'en-tête (`Referer`, `User-agent`, `Accept`, etc),
- éventuellement un contenu (paramètres d'URL, fichier HTML, fichier image, etc).

Dans le port 80