Support de cours Réseaux EISTI

Cours 5 : Couche transport et résolution de noms

But

Jusqu'à présent, nous avons vu comment on pouvait envoyer des informations de machines à machines en trouvant les routes .
Lorsqu'une information arrive sur une machine, l'information est destinée à un applicatif qui fonctionne sur cette machine.
Le problème est donc d'identifier cet applicatif.

Identification des applicatifs

Un même applicatif peut être vu de façons différentes en fonction du système d'exploitation sur lequel il fonctionne. On pourra parler de programme, de processus, de job, d'application,... Chacun des noms et des identifiants associés à l'apllicatif étant différent en fonction de l'OS.
Nommer un applicatif sur une machine distante est donc difficile. De plus, l'identifiant de l'applicatif en fonction des systèmes peut varier avec le temps.
Un applicatif sur une machine peut également rendre des services différents, le problème est dans ce cas de nommer la partie de l'applicatif que l'on veut joindre. Pour ces raisons, nommer directement des applicatifs que l'on veut joindre sur une machine n'est pas une bonne idée. On utilise plutôt des numéros avec une technique de rendez-vous.

Les ports TCP/IP

Un port TCP/IP est un numéro de service. Quel que soit l'OS sur une machine, gérer des numéros, n'est pas difficile à faire. Un port doit être vu comme un lieu de rendez-vous. Le programme serveur, va demander au système d'exploitation de lui donner toutes les informations qui arrivent sur un ou plusieurs ports donnés. Le programme client qui veut dialoguer avec le serveur, doit donc émettre ses données vers un port spécifié sur une machine donnée.
Un client n'a donc aucune idée de l'appellation de l'applicatif (programme, job, processus,...).
Le problème pour un client est donc de connaître le numéro de port qui lui permettra de joindre le bon serveur. Sur la machine destinataire, un utilisateur mal intentionné (s'il dispose de privilège suffisant au niveau de l'OS) peut donc détourner des informations qui sont normalement destinées à un serveur particulier.

Affectation des ports

La question pour un client qui veut joindre un serveur spécifique sur une machine est donc de connaître le numéro de port qu'utilise ce serveur sur cette machine. La norme TCP/IP a divisé les ports en 2 catégories :
les ports libres et les ports affectés/réservés (Well Know Ports).
Les numéros de ports qui sont entre 0 et 2048 sont affectés et/ou réservés. Ainsi, le client qui veut joindre un serveur pour faire du transfert de fichier doit envoyer sa demande sur le port UDP 69 pour joindre un serveur utilisant le protocole TFTP. Les ports dont le numéro est compris entre 2048 et 65536 sont dits libres. Libre ne signifie pas qu'ils ne sont pas utilisés, mais qu'on ne peut pas connaître les serveurs (s'ils existent) qui vont répondre sur ces ports.

Etablissement d'une communication client serveur

Nous venons de voir comment on peut identifier un serveur sur une machine. Il faut maintenant voir comment un client va échanger ses données avec le serveur.
Lorsque qu'un client veut communiquer avec un serveur, il demande à son OS de lui donner un numéro de port. Ainsi, les données partent d'un port d'une machine source vers un port sur une machine destination.
Le numéro de port attribuer au client par le système n'est pas défini. Le système est libre d'attribuer le port qu'il veut.

Protocoles normalisés de la couche transport

UDP

UDP (User Datagramm Protocol) (et non pas Unix Dispense de Penser:-) UDP est un protocole de transport qui est très proche d'IP. UDP permet d'échanger des informations (USER DATAGRAMM) entre des applications. UDP prend le datagramme de l'utilisateur et le transmet à la couche IP. Cette dernière l'achemine sur la machine destinataire pour le remettre au protocole UDP. Ce dernier redonne le datagramme au processus distant. Comme UDP se contente de donner le datagramme à IP et ne fait aucun contrôle, il n'est pas sur que le datagramme arrive à destination, et que s'il y arrive, il n'est pas sur qu'il soit intact. Il peut avoir été fragmenté par les passerelles, les fragments ne seront pas réassemblés par UDP sur la machine du destinataire. Il est possibles que des fragments n'arrivent jamais, ou qu'ils arrivent dans le désordre. C'est aux applicatifs utilisant UDP de faire tous ces contrôles.
UDP est très peu sécurisé, il a été écrit et normaliser car il est très simple à mettre en œuvre. Sa simplicité permet de l'utiliser pour télécharger des OS sur des machines. UDP ouvre et referme une connexion pour chaque datagramme.

TCP

TCP (Transport Control Protocol) est un autre protocole de la couche transport de la famille TCP/IP. On dit que TCP est un protocole de bout en bout (END to END). Lorsque deux applicatifs utilisent TCP pour échanger des données, l'émetteur est sur que le récepteur reçoit exactement les données qui sont émises. TCP gère les contrôles. Ce sont les logiciels TCP qui redemande la transmission de paquets lorsque ces derniers ne sont pas arrivés sur le destinataire. Il assure également la remise dans l'ordre des paquets échangés.
Si TCP s'appuie sur IP, il tente d'en corriger les défauts.
Le fonctionnement interne de TCP n'est pas trivial. Il procède par acquittement des messages envoyés. Pour optimiser le transfert TCP utilise une fenêtre glissante sur le bloc de données qu'il doit envoyer. La taille de la fenêtre fait l'objet de négociations entre l'émetteur et le récepteur. TCP est dit protocole en mode connecté, car lorsque qu'un canal est ouvert entre un client et un serveur, ce dernier reste valide jusqu'à sa fermeture (qui doit être demandé par au moins l'un des deux applicatifs). Le numéro de port affecté au client par son OS est donc réservé durant toute la connexion TCP, que l'applicatif envoie ou non des informations.
Tout comme UDP, pour identifier un service sur la machine distante TCP utilise des ports.

La résolution de noms

Maintenant, nous savons comment un applicatif client et un applicatif serveur échange des informations.
Ils utilisent via les protocoles TCP ou UDP des numéros de port pour différencier les différents services et des adresses IP pour identifier la machine.
Si ces informations numériques sont très pratiques à traiter par des machines elles le sont moins par des hommes.
TCP/IP ne donne pas de méthode pour associer un nom à un numéro de port. Cependant beaucoup de systèmes permettent de le faire (fonction getservbyname par exemple). La correspondance entre un nom de machine et une adresse IP est maintenant bien normalisée, elle a d'ailleurs donné lieu à des protocoles qui utilisent le DNS. Lorsque l'on parle de résolution de nom on entend généralement par-là, la relation entre un nom de machine (hostname) et son adresse IP. Pour que ce système fonctionne, il faut impérativement qu'il y ait au plus une adresse IP qui corresponde au nom d'une machine.

Historique de la gestion des hostnames
A l'origine de TCP/IP très peu de machines étaient connectées. Les administrateurs de ces machines géraient des tables de conversion manuelle. Ces tables étaient souvent des fichiers ASCII que l'on utilise encore (voir fichier /etc/hosts sous Unix). Le format de ce fichier est relativement simple:
"une adresse " "un nom de machine" "alias" "autre alias" ....
exemple :

Cette méthode est très convenable pour un réseau sur lequel il y a très peu de machines. Chaque machine doit disposer en local de cette base. Cependant, lorsque qu'un administrateur décide de changer l'adresse d'une de ces machines, il doit mettre à jour les tables sur toutes les machines de sont réseau. Plus le nombre de machines est grand sur le réseau et plus ce système devient lourd à gérer. Sur des réseaux constitués de plusieurs dizaines de machines, ce système n'est plus envisageable, car beaucoup trop lourd à maintenir. Sun, a intégrer dans sons système NIS (Network Informations Services) une base de données unique (éventuellement dupliquée sur d'autre machine). Chaque client qui veut connaître l'adresse d'une machine doit donc la demander au serveur NIS. Cette méthode présente l'avantage d'une grande souplesse. L'administrateur ne doit plus mettre à jour qu'une seule base de données et configurer l'ensemble de ces machines pour qu'elles interrogent le serveur pour obtenir l'information. Sur un réseau constitué de plusieurs centaines de machines voir de plusieurs millions (cas de l'Internet) ce système ne convient plus, car il est très difficile d'obtenir des noms différents pour chacune des machines. Ce système suppose qu'il y ait au moins une personne (physique ou morale) qui enregistre l'unicité du nom. Sur un réseau tel que l'Internet, vu le nombre de machines qui sont connectées (donc qui demande un nom et une adresse), le nombre de machines qui sont déconnectées, ou le nombre de machines dont l'adresse et/ou le nom change, un système avec une autorité centrale ne peut plus être envisagé. Il a fallut inventer un processus qui délègue une partie de la responsabilité, tout comme il a été fait pour la gestion des adresses IP. La mise en place de ce système est connue sous le nom de DNS (Domaine Name System) ou de Système de Nom de domaine.

Le DNS

Le système de nom de domaine est un système de noms hiérarchisés par opposition à un système de noms à plats.

Ce schéma représente une partie de l'arborescence du DNS.

Le nom qualifié ou complet (FQDN) d'une machine se lit en partant de la feuille et en remontant dans l'arbre. Chaque niveau est séparé par un "." Ainsi la machine sur laquelle vous avez programmé s'appelle hardy.eisti.fr. Le domaine racine n'a pas de nom et par convention est appelé ".". Chaque niveau de l'arborescence garantie que les noms de ces fils sont uniques. La machine qui s'appelle hardy.eisti.fr. est donc différente d'une machine qui pourrait s'appeler hardy.fit.edu. Un nom de domaine est constitué par une suite de noms séparés par des points. Le système DNS ne fait pas de différence dans sa notation entre une machine (hardy.eisti.fr. ) et un domaine (eisti.fr.). Pour chaque domaine et sous domaine (., com., edu, ..., fr, ..., fit.edu, eisti.fr, ibp.fr,..) un responsable est désigné. C'est à ce responsable d'assurer l'unicité des noms du domaine qu'il gère. Ce système est distribué, car à aucun endroit de l'Internet il existe une base de données complète du système de nom.
Lorsqu'un applicatif veut connaître l'adresse IP d'une machine, il doit demander au résolveur (appelé par la fonction C gethostbyname) de lui la donner.
Le fonctionnement du résolveur est très simple. Il est basé sur le modèle client serveur. Dans chaque domaine, il y a une (ou plusieurs) machine qui connaît l'adresse de toutes les machines de son domaine et les adresses des serveurs de ses sous-domaines. Ainsi lorsque le résolveur doit trouver le nom d'une machine (A.B.C.D), il commence par demander au serveur de la zone (ou domaine) . l'adresse de la machine A.B.C.D.. Si le serveur de la zone "." ne connaît pas directement l'adresse, il pourra donner au résolveur l'adresse du serveur de la zone D.
Ce dernier pourra répondre ou donner l'adresse du serveur de la zone C.D. ainsi de suite jusqu'à ce que le résolveur est obtenu l'adresse de la machine A.B.C.D.
Le système DNS est donc un système qui garantie l'unicité des noms sur le réseau Internet. Ce système ne fait pas que la résolution des noms, il peut contenir d'autres informations. Il peut par exemple donner le nom de la machine qui a pour adresse 194.57.186.17 ou donner le nom de la machine qui gère le mail d'un domaine,...
Le niveau principal de la hiérarchie du DNS n'a pas été choisi au hasard. Le découpage est normalement géographique. Chaque pays est représenté par son code de pays normalisé ISO (fr, uk, sp, us). A ceci s'ajoute quelques exceptions. Le domaine arpa où l'on a regroupé les machines qui disposaient de noms avant la mise en place du DNS.
Le domaine us existe mais aux USA, il est possible de faire enregistrer un domaine en fonction du secteur d'activité de l'établissement.

Un sous-domaine (ou machine) peut se faire enregistrer dans plusieurs domaines.


Support de cours Réseaux EISTI