4.A - Les Applications d'Internet

Dans cette section, nous allons discuter des applications d'Internet en général, et de leur fonctionnement selon le modèle client-serveur. Nous illustrerons notre propos en prenant comme exemple les applications suivantes : la connexion à distance (telnet, ssh), le courrier électronique (ou mail), la résolution de noms de machines (DNS) et encore d'autres services tels que le transfert de fichiers (FTP), le partage de fichiers (NFS) et l'annuaire LDAP. L'objectif n'est pas d'explorer en détail le fonctionnement de ces applications, mais plutôt de comprendre à quoi elles servent et comment on passe du besoin d'une application à un protocole applicatif qui met en œuvre le service demandé.

Le Modèle Client-Serveur

Qu’est-ce que le modèle client-serveur, les sockets et les numéros de port ? Quel est son lien avec l’architecture TCP/IP ?

Les applications dont on va parler ont chacune une fonction (ou service) et un protocole applicatif qui permet de mettre en œuvre cette fonction. Par exemple, pour l'application Web, on utilise le protocole HTTP. Quelle est sa fonction ? Il sert à récupérer des informations qu'on appelle des pages web qui sont stockées sur un serveur Web.

  • La connexion à distance permet l'exécution de commandes sur une machine à distance à l'aide de protocoles tels que Telnet, SSH et X.
  • Le courrier électronique permet l'envoi de messages textuels et de pièces jointes à l'aide du protocole SMTP. Pour la lecture des emails, les protocoles POP et IMAP sont utilisés, ainsi que le webmail en utilisant un navigateur web et le protocole HTTP.
  • La résolution des noms de machine en adresse IP utilise le protocole DNS, qui offre un annuaire distribué sur les serveurs sur Internet.
  • Le transfert de fichiers est effectué à l'aide du protocole FTP.
  • L'accès aux fichiers distants est possible en utilisant les protocoles NFS et SMB (sous Windows) pour accéder aux fichiers sans les télécharger.
  • L'annuaire LDAP permet de stocker toutes les informations d'une entreprise, allant des comptes informatiques aux coordonnées des employés.

Toutes ces applications fonctionnent selon le modèle client-serveur.

Exemple du Web

Le Web utilise le modèle client-serveur pour permettre aux utilisateurs de naviguer sur Internet en utilisant un navigateur web en tant que client. Le navigateur envoie des requêtes HTTP au serveur web, qui lui envoie une réponse en retour sous forme de page web demandée. Le protocole HTTP est utilisé pour formuler ces requêtes et réponses, et l'architecture TCP/IP est utilisée pour échanger les informations entre le client et le serveur. Une page web peut contenir du texte, des images, des programmes incorporés, des liens vers d'autres pages web ou des vidéos, et chaque élément de la page nécessite une requête HTTP séparée au serveur web pour être récupéré.

De manière générale, une application client-serveur est un système réparti sur deux ou plusieurs sites qui communiquent entre eux via un protocole applicatif. Le client est l'application qui envoie une demande de service au serveur, tandis que le serveur est l'application qui offre le service et qui est en permanence à l'écoute des requêtes clientes. Le serveur peut traiter plusieurs requêtes simultanément, selon la manière dont il gère l'arrivée des requêtes. Le protocole applicatif définit les échanges entre le client et le serveur et assure la compréhension mutuelle entre eux, même s'ils sont développés par des programmeurs différents. Notons que l'API Socket est une interface de programmation couramment utilisée pour programmer les échanges entre le client et le serveur via la couche de transport (TCP ou UDP).

Sockets

L'API Socket est une interface de programmation qui permet aux processus client & serveur d'accéder au réseau via le système d'exploitation. C'est donc cette API qui permet l'accès au réseau et donc aux protocoles de transport TCP ou UDP, qui vont eux-mêmes faire appel au protocole IP, conformément au fonctionnement de à l'architecture TCP/IP.

En pratique, une socket est un fichier virtuel utilisé par une application pour communiquer. Elle permet à l'application de lire et d'écrire des données dans un buffer d'émission et un buffer de réception. Ces buffers correspondent aux zones d'émission et de réception du protocole TCP ou UDP. La socket est associée à un numéro de fichier virtuel et est gérée par le système d'exploitation pour faciliter la transmission des données entre le client et le serveur.

Un numéro de port est utilisé pour identifier les applications qui utilisent les protocoles de transport TCP et UDP. Il permet de déterminer quel programme client ou serveur communique avec une socket spécifique. Ces numéros de ports sont transmis dans les en-têtes des messages TCP ou UDP afin de diriger les données vers la bonne socket, c'est-à-dire le bon buffer d'émission ou de réception associé au programme client ou serveur.

Le numéro de port est un entier (codé sur 16 bits), inférieur donc à 65535. Les numéros inférieurs à 1024 sont généralement réservés pour les services standards, tandis que ceux supérieurs à 1024 sont utilisés par de simples clients.

Le numéro de port du serveur est généralement prédéfini, car c'est le client qui initie la requête et contacte le serveur en premier. Ainsi, pour contacter le serveur, le client doit connaître son numéro de port. Par exemple, 23 pour le serveur Telnet, 80 pour le serveur Web, ou encore 22 pour le serveur SSH, ....

Un échange client / serveur est identifié par un quadruplet (@IP_src,port_src,@IP_dest,port_dest) comprenant d'une part le numéro de port et l'adresse IP de la source et d'autre part le numéro de port et l'adresse IP de la destination, le client ou le serveur pouvant jouer alternativement le rôle de la source ou de la destination.

Dans la figure ci-dessus, on peut voir des exemples d'application client / serveur. Le premier exemple illustre un échange Telnet entre un client A (port x choisi aléatoirement) et un serveur B (port 23). Cet échange se compose de deux messages, typiquement une requête du client vers le serveur (port de destination 23) et la réponse du serveur vers le client (port source 23). Le deuxième exemple illustre un échange Web entre plusieurs clients et un serveur B (port 80). On distinguera trois messages, une requête du client sur la machine A (port source x) et deux requêtes clientes différentes depuis la machine C, l'une avec le port source x et l'autre avec le port source y. Il est important de noter que le serveur B peut discriminer les échanges avec chaque client sans ambiguïté grâce à une paire (@IP_src,port_src) unique.

Nous reviendrons plus en détail sur la programmation des applications réseau avec les Sockets dans le cours 4c.

La connexion à distance (Telnet, SSH et X)

Connexion locale et distante, l’application Telnet, SSH et X.

L'application de connexion à distance permet à un utilisateur d'accéder à une machine distante et d'exécuter des commandes autorisées à partir de son propre terminal, sous réserve qu'il dispose des informations d'accès (login, mot de passe, etc.) nécessaires. Les commandes saisies localement sont exécutées sur la machine distante, même si les environnements des deux machines peuvent être différents (par exemple, Windows et Unix).

Il existe plusieurs protocoles utilisés pour la connexion à distance, tels que Telnet, Rlogin et SSH. Telnet est un standard qui existe sur de nombreuses plateformes, Rlogin n'est utilisable qu'entre machines Unix, et SSH est sécurisé car il utilise une authentification et un chiffrement pour protéger les données. SSH permet également de gérer des fenêtres distantes.

La connexion à distance nécessite une interactivité, c'est-à-dire que tout ce qui est tapé au clavier sur le client est envoyé au serveur via la connexion et exécuté par celui-ci. Tout ce qui est envoyé par le serveur au client s'affiche dans le terminal sur l'écran de la machine cliente.

Telnet

Telnet (TELecommunication NETwork) est à la fois un protocole et une application qui permet la communication à distance entre ordinateurs via un réseau. Il a été défini dans les RFC 854 et 855 en 1983, et est l'un des premiers standards de l'Internet. Le serveur Telnet écoute sur le port 23 pour les demandes de connexion TCP qui arrivent des clients. L'authentification se fait par login et mot de passe sur le shell distant, mais il est important de noter que les mots de passe sont transmis en clair. Lorsqu'un caractère est tapé au clavier, il est envoyé au serveur qui renvoie un "écho" du caractère, ce qui provoque son affichage dans le terminal local. Telnet prend en compte l'hétérogénéité entre les systèmes locaux et distants, ce qui permet par exemple de se connecter à une machine Unix à partir d'une machine Windows. Voici une vue d'ensemble d'une connexion à distance avec un client & serveur Telnet qui exécute la commande ls.

Les différentes exécutions possibles de Telnet côté client sont les suivantes :

  • telnet nom_du_serveur : En donnant le nom de la machine distante (ou son adresse IP), cela permet de se connecter à une machine distante en spécifiant son nom d'hôte. Le port utilisé est 23 par défaut.
  • telnet adr_IP_du_serveur numéro_port : En précisant le numéro de port, cela permet de se connecter à un autre service sur la machine distante en spécifiant l'adresse IP et le numéro de port.

Il est important de noter que Telnet envoie les données en clair, il est donc fortement déconseillé d'utiliser Telnet pour des connexions sensibles, SSH est un protocole plus sécurisé pour cela.

SSH

SSH (Secure Shell) est un protocole de connexion à distance sécurisé qui crypte les communications et utilise une authentification à base de clés. Il est l'un des seuls protocoles qui peut traverser les pare-feux actuels. Il permet également de transporter des fenêtres graphiques via un tunnel SSH avec la commande ssh -X. Le serveur SSH écoute sur le port 22 pour les demandes de connexion TCP des clients.

Les commandes ssh et scp permettent de se connecter à distance, d'exécuter des commandes à distance, et de copier des fichiers à distance. Par exemple :

# connexions à distance​
$ ssh user@hostname​
# exécution de commande à distance​
$ ssh user@hostname cmd ​
# copie de fichiers à distance​
scp file1 file2 user@hostname:​/tmp
# copie d'un répertoire à distance
scp -r dir user@hostname:/tmp​

La sécurité dépend de la confidentialité de la clé, de la longueur de la clé (plus il y a de bits, plus il est difficile de tenter toutes les clés) et de la difficulté à inverser l'algorithme de chiffrement utilisé.

Nota Bene : Il n'y a pas encore de RFC pour SSH.

Le système X Window

Le système X Window (également appelé X ou X11) est une application qui permet de gérer l'affichage des fenêtres sur une machine Unix. De manière générale, X permet de gérer tous les périphériques à l'interface Homme/Machine.

Ce système est constitué de plusieurs entités​ :

  • un serveur X : gère le matériel (clavier, souris, écran, ...) et leur utilisation par les applications graphiques​ ;
  • des clients X : applications graphiques qui nécessitent un serveur X pour afficher les fenêtres (xemacs, xterm, xcalc, ...)​ ;
  • le protocole X : fait communiquer les clients et le serveur​.

Grâce à l'utilisation d'un protocole réseau, le système X Window permet tout à la fois d'effectuer l'affichage en local (sur la même machine que l'application graphique), mais aussi de déporter cet affichage sur une serveur X distant. Dans l'exemple ci-dessous, la station 1 exécute le serveur X et trois autres stations exécutent chacune une application graphique (comme la calculatrice xcalc par exemple) qui est un client X. Ainsi les fenêtres de ces clients s'afficheront sur l'écran du serveur X. Il y a trois connexions à distance (TCP, port 6000) vers chacune des stations, et chaque station a un client X qui demande l'ouverture d'une fenêtre sur cette machine.

X11 Forwarding : Une particularité de SSH, appellée X11 Forwarding, est de pouvoir exécuter une application graphique à distance tout en déportant son affichage sur la machine du client SSH. Cela implique d'intercepter les requêtes X effectuées sur le serveur SSH et de les faire suivre dans un tunnel jusqu'au client SSH, qui va les rejouer auprès du serveur X local, jouant ainsi le rôle d'un pseudo-client X.

Le Courrier Électronique (SMTP, POP, IMAP, Webmail)

Composants et transmission du courriel, Configuration d'un client mail, Protocoles SMTP, POP et IMAP, Webmail.

Le courrier électronique est un outil essentiel sur Internet, utilisé par de nombreuses personnes pour envoyer et recevoir des messages, appelés courriels (ou mails). Cela se fait en utilisant un client de courrier électronique, comme Outlook ou Thunderbird, qui permet à un utilisateur de rédiger et d'envoyer des messages à des adresses de destination, ainsi que de lire les messages reçus. Les protocoles utilisés pour l'envoi et la réception de courrier électronique peuvent varier, mais ils sont généralement gérés par des serveurs qui traitent à la fois les messages envoyés et reçus.

Sur le schéma ci-dessous, on peut voir que chaque serveur de courrier électronique dispose d'une file de messages sortants, qui stocke les messages en cours de transit, ainsi que de boîtes aux lettres (ou mailbox) individuelles pour chaque adresse de destination, qui stockent tous les messages reçus par un utilisateur.

Le courrier électronique est une application un peu plus complexe que les précédentes, car elle met en jeu plusieurs protocoles au dessus de la couche transport TCP :

  • Pour envoyer un courriel, on utilise le protcole SMTP (Simple Mail Transfer Protocol).
  • Pour accéder à ces courriels, stockés sur le serveur de courrier électronique, on utilise un protocole appelé POP ou IMAP, qui nécessite une authentification avec un login et un mot de passe.

Lorsqu'un utilisateur envoie un courriel en cliquant sur Envoyer, ce courriel est d'abord envoyée vers son serveur sortant en utilisant le protcole SMTP, puis déposé dans sa file de messages sortants. Pour chaque adresse mail de destination, le serveur sortant est alors responsable de la transmission de ce courriel vers son destinataire, et plus précisément vers le serveur entrant de ce destinataire (toujours via le protocole SMTP). Ce message est alors déposé dans la boîte aux lettres du serveur entrant de son destinataire.

Le destinataire peut alors consulter son courrier électronique à l'aide d'un client mail, qui peut utiliser soit le protocole POP, soit le protocole IMAP. Le protocole IMAP, qui est de plus en plus utilisé, permet à l'utilisateur de gérer son courrier électronique stocké sur le serveur mail, en le supprimant, en le triant et en le rangeant dans des dossiers, tout en le laissant sur le serveur. Cela permet également d'accéder au courrier électronique sur différents appareils, tels qu'un ordinateur, un smartphone ou une tablette. Le contenu du courrier électronique se trouve dans l'enveloppe virtuelle, qui contient également une entête SMTP qui indique l'expéditeur, le(s) destinataire(s), le sujet, etc.

Configuration

Il est possible de configurer un client mail en indiquant l'adresse électronique de l'expéditeur et en configurant le serveur SMTP qui sera chargé de l'envoi des emails. L'authentification est nécessaire pour s'assurer que l'émetteur du message est bien celui qui prétend l'être et pour lutter contre le spam. Pour lire les emails, il faut également s'authentifier avec un *login et un mot de passe, et il est possible de utiliser les protocoles POP ou IMAP. Un email est un fichier qui contient des entêtes avec des informations sur l'expéditeur, le destinataire et le sujet, et un contenu qui peut être de différents types grâce au format MIME. Le protocole SMTP permet d'envoyer les emails en utilisant des commandes pour spécifier l'expéditeur et le destinataire et pour inclure le contenu du message. Les emails sont stockés dans des files d'attente sur le serveur mail et il est possible de suivre leur parcours en regardant les entêtes SMTP qui indiquent les différents serveurs traversés et les actions qui ont été effectuées sur le message, comme le passage par un antivirus ou un antispam. Pour lire les emails stockés dans une boîte aux lettres, il faut accéder au dossier où ils sont stockés et utiliser un client mail pour afficher leur contenu.

Le WebMail

Le WebMail est un client mail qui s'utilise via un navigateur web. Il se connecte à un serveur web qui lui permet de communiquer avec le serveur mail et d'envoyer ou de recevoir des emails. Le WebMail est accessible via une page web sur laquelle on s'authentifie et qui propose un formulaire pour envoyer des messages ou lire le contenu de la boîte aux lettres.

Adresse Mail

Une adresse email (ex. john.doe@mydomain.com) est composée de deux parties séparées par un arobase @ : à gauche, le nom de la boîte aux lettres qui identifie l'utilisateur (john.doe) et à droite, le nom de domaine (mydomain.com), qui héberge le serveur mail de l'utilisateur. C'est bien le serveur DNS qui a autorité sur le domaine qui permet de faire le lien entre l'adresse email et l'adresse IP du serveur mail. Un serveur mail comprend généralement un système de gestion des emails (SMTP pour l'envoi, IMAP ou POP pour la lecture), un WebMail accessible via un navigateur web, et des mesures de sécurité comme l'utilisation de HTTPS pour le WebMail, de IMAP sécurisé et de Start TLS pour l'envoi de emails de manière sécurisée, ainsi qu'un antispam et un antivirus.

La Résolution des Noms (DNS)

Les services fournis par le DNS, un système distribué, nom de domaine, serveurs racine, les messages DNS, host.

Le DNS (Domain Name System) est un système qui permet de relier les noms de domaines aux adresses IP des machines sur Internet. Il s'agit d'une base de données distribuée qui contient les informations de correspondance entre les noms de domaines et les adresses IP. Les machines clientes et les serveurs DNS communiquent ensemble pour effectuer la traduction d'un nom de domaine en adresse IP. C'est un protocole applicatif qui est utilisé par les applications clientes pour trouver les adresses IP des serveurs, même s'il n'est en général pas utilisé directement par ces applications, mais plutôt en amont. Par exemple, lorsque vous ouvrez un navigateur web et tapez un nom de domaine, une requête DNS est effectuée pour récupérer l'adresse IP du serveur web correspondant. Le DNS fonctionne selon le modèle client/serveur, et utilise généralement le port 53 avec le protocole UDP pour des raisons de rapidité, mais il peut également utiliser le protocole TCP (RFC 1034, 1035, 2181, etc.).

Les commandes host et dig permettent de faire des requêtes DNS depuis un terminal pour obtenir des informations utiles pour les administrateurs système et réseau pour diagnostiquer les problèmes. Par exemple :

# obtenir une adresse IP à partir d'un nom de machine
$ host www.univ-lyon1.fr​
www.univ-lyon1.fr is an alias for ksup.univ-lyon1.fr.​
ksup.univ-lyon1.fr has address 134.214.126.72​

Le DNS fournit également d'autres services comme la possibilité d'attribuer plusieurs noms à une même machine (alias), de répartir la charge en utilisant plusieurs adresses IP pour un même serveur, ou encore de trouver le nom d'un serveur de messagerie (mail server aliasing).

Il est important de noter que le système DNS est distribué, ce qui signifie qu'il n'y a pas un seul serveur qui gère toutes les demandes. Au lieu de cela, il y a des milliers de serveurs DNS qui travaillent ensemble pour résoudre les noms de domaine. Cela rend le système plus tolérant aux pannes et plus rapide, car les demandes sont réparties entre plusieurs serveurs.

Plus précisément, il existe trois types de serveurs DNS : les serveurs locaux, les serveurs racine et les serveurs de source autorisée. Ces serveurs collaborent pour répondre aux requêtes DNS des applications clientes, et chaque type de serveur joue un rôle différent dans le système de nommage hiérarchique utilisé pour retrouver les adresses IP des serveurs.

  • Les serveurs de noms locaux sont les premiers à recevoir les demandes de résolution de nom de domaine. Ils gèrent les demandes provenant des utilisateurs de leur propre réseau, comme une université ou une entreprise, et les relaient ensuite vers les serveurs de sources autorisées.
  • Les serveurs de sources autorisées sont les serveurs DNS qui ont la responsabilité de stocker les informations relatives à une organisation spécifique.
  • Enfin, les serveurs de noms racine sont des serveurs intermédiaires qui relaient les demandes des serveurs locaux aux serveurs de sources autorisées en utilisant un système de nommage hiérarchique. Les serveurs de noms racine sont responsables de stocker les informations relatives à chaque domaine de premier niveau, comme .fr pour la France.

Il existe 1 serveur racine primaire et 12 secondaires pour l'ensemble de l'Internet, comme indiqué sur la carte ci-dessous.

Les informations stockées dans les serveurs DNS sont mises à jour régulièrement en raison des serveurs qui changent de nom ou des nouveaux serveurs qui apparaissent. Voici à titre d'exemple les informations stockés par le serveur de sources autorisées du domaine ens-lyon.fr.

En résumé, le système DNS est une base de données distribuée qui permet de résoudre les noms de domaine en adresses IP. Il utilise un système de nommage hiérarchique et différents types de serveurs pour gérer les demandes de résolution de nom de domaine de manière efficace et fiable.

Les Autres Applications

Nous allons terminer en présentant d'autres applications, comme FTP, NFS ou LDAP.

Le Transfert de Fichiers (FTP)

Il existe également des applications de transfert de fichiers entre un client et un serveur, ou d'un serveur vers un client, soit pour télécharger (download) des fichiers, soit pour les envoyer (upload). Le protocole principal utilisé pour ce transfert de fichiers est FTP (File Transfer Protocol). FTP utilise deux connexions : une connexion pour gérer les demandes de transfert entre le client et le serveur, sur le port 21 (canal de contrôle), et une autre connexion pour le transfert effectif de chaque fichier (canal de données). Cela permet de réaliser plusieurs transferts de fichiers en parallèle depuis le même serveur vers différents clients. Parmi les requêtes du protocole FTP, on mentionnera en particulier la requête RETR pour récupérer un fichier du serveur (get) et la requête STOR pour aller y stocker un fichier (put).

On peut utiliser le protocole FTP avec un client graphique FTP (comme FileZilla), mais également depuis un terminal. On peut ainsi transférer des fichiers (dans un sens ou dans l'autre), créer des répertoires, renommer des fichiers ou encore lister les fichiers et les répertoires du serveur distant.

L'accès aux fichiers distants (NFS)

L'accès au fichier distant est une alternative au transfert de fichier à la FTP. Dans cette application, un serveur stocke les fichiers et les rend accessibles aux utilisateurs. Cette méthode est très courante, car elle permet de sécuriser les fichiers sur un serveur tout en permettant l'accès à distance depuis n'importe quel appareil. Par exemple, on peut accéder à ses fichiers depuis n'importe quel ordinateur sur le réseau local, peu importe la salle de TP où on se trouve.

Nous utilisons les protocoles NFS ou Samba pour cela. Pour accéder à ces fichiers à distance, nous réalisons le montage d'une partition (mount), ce qui permet un accès transparent à ces fichiers depuis un explorateur de fichiers Windows ou depuis un terminal Unix. Nous pouvons alors ouvrir ces fichiers, les modifier, les enregistrer ou les renommer comme s'ils étaient sur notre propre ordinateur. Les requêtes d'accès aux fichiers sont envoyées au serveur (NFS) qui les traduit sur la machine où les fichiers sont réellement stockés.

Annuaire LDAP

LDAP est un annuaire qui permet de stocker toutes les informations importantes d'une entreprise, comme les utilisateurs, les employés, les comptes informatiques Unix ou Windows, la gestion des listes mail, la gestion de l'accès à des sites web qui nécessitent une authentification ou encore la gestion des accès à des bases de données. Toutes ces informations sont stockées dans un annuaire unique, qui possède une structure hiérarchique et qui contient des objets normalisés. Par exemple, un compte Unix uid=ogluck,ou=People,dc=lip,dc=ens-lyon,dc=fr est un objet qui contient plusieurs attributs tels que le répertoire personnel (homeDirectory), le nom de la personne (cn), le nom d'utilisateur (uid) et le shell utilisé (loginShell).

L'annuaire LDAP est interrogé par toutes les applications de l'entreprise lorsqu'une authentification est nécessaire, que ce soit à partir d'un terminal Unix, lors de la connexion à un ordinateur ou via un navigateur web. Il est donc lié à toutes les applications de l'entreprise, que ce soit les applications qui gèrent le courrier électronique, les pages web ou tout simplement l'authentification sur la machine.