Réseau TCP/IP, théorie et pratique

Article écrit et wikisé par Nicolas Thauvin (orgrim).

Introduction

Les systèmes Unix et donc par extension Debian GNU/Linux ont été pensé en réseau. Les possibilités sont réduites lorsqu'on ne dispose pas d'une configuration réseau fonctionnelle.

Cet article vous propose donc d'aborder les grands principes du fonctionnement du réseau et les outils pratiques à utiliser pour avoir une configuration qui fonctionne sous Debian.

Théorie

Tout d'abord, l'objectif du réseau est de permettre à des machines de communiquer entre elles, c'est à dire d'envoyer et de recevoir des données. Ces données sont tout simplement des suites de 0 et de 1, du binaire.

Les concepts de la communication en réseau sont normalisés, afin de garantir une intéropérabilité du système et de pouvoir connecter des machines diverses et variées entre elles (un PC de bureau, un routeur ADSL par exemple), par différents moyens(des câbles, des fibres optiques, des ondes radio par exemple).

Les pionniers du réseau ont donc défini un ensemble de règles à suivre pour communiquer, indépendantes des machines et des liaisons établies entre celles-ci.

Comment faire pour communiquer ?

Pour pouvoir parler à son voisin, et surtout se faire comprendre, il faut plusieurs conditions :

  • Pourvoir l'atteindre physiquement (aller à un mètre de lui, ou lui téléphoner par exemple)
  • Parler dans une langue qu'il puisse comprendre
  • Parler chacun son tour, afin que le message ne soit pas noyé dans le bruit

Avec des ordinateurs c'est un peu la même chose :

  • Les machines doivent être connectées entre elles (il peut y avoir des intermédiaires)
  • Le récepteur doit pouvoir décoder le message de l'émetteur (avec des formes connues des deux interlocuteurs)
  • Les données doivent être découpées en morceaux (comme des répliques d'une conversation) pour qu'une machine ne monopolise pas la liaison.

Trois éléments sont donc nécessaires au minimum :

  • des connexions pour s'atteindre,
  • des protocoles pour se comprendre,
  • un découpage en paquets des données trop longues, pour donner une chance à tout le monde de parler.

Le modèle OSI

Présentation

Le modèle OSI est LA référence de communication réseau, il s'agit d'un ensemble de règles abstraites établie par l'ISO (International Standards Organization), l'organisme international de normalisation.

Ce modèle ne définie pas des protocoles en eux mêmes, mais des classes de protocoles et des règles d'opérabilités entre eux. Il définit 7 classes de protocoles, qui sont organisés en 7 couches d'une pile.

Le principe de fonctionnement et les 7 couches

Il faut effectuer un ensemble de tâches pour envoyer un message ou le recevoir. Si on revient à un dialogue humain, pour envoyer dire bonjour à son voisin, il faut :

  1. aller le voir
  2. s'assurer qu'il n'a y pas d'obstacle entre vous (exemple baisser la stéréo)
  3. s'assurer qu'il est prêt à vous écouter (faites un signe de la main pour qu'il vous reconnaisse)
  4. dire “bonjour”

Ceci est peut-être carricatural mais on voit bien qu'on effectue un peu ces étapes lorsqu'on lui téléphone.

Dans le cadre des ordinateurs, le modèle OSI définit ces étapes, chaque étape étant un niveau de la pile. Plus précisément :

Niveau Couche Description
7 Application Protocoles des programmes applicatifs qui utilisent le réseau
6 Présentation Standard de présentation des données aux appliactions
5 Session Gestion des sessions de communication entre les applications
4 Transport Gestion et correction d'erreurs de bout en bout
3 Réseau Vision unifié d'un réseau pour les niveaux suppérieurs
2 Liaison Assurance d'une transmition correcte des données le lien physique
1 Physique Définition des caractéristiques physiques du media de communication
  • 1. La couche physique

Il n'y a pas vraiment de protocole sur cette couche se sont plutôt les normes physiques que doivent respecter les éléments du lien, comme par exemple:

  • les tensions à faire passer dans les câbles
  • la disposition et la forme des connecteurs
  • la bande de fréquence pour des ondes radios

Elle garantie qu'un signal peut être transmit entre divers élément physique.

  • 2. La couche liaison

Cette couche permet définir les règles pour envoyer et recevoir des données sur un lien physique. Plus particulièrement elle normalise le format du signal physique sous forme de trames. Elle garantie qu'une trame est transmise et qu'elle arrive bien à destination.

Par exemple, deux machines sont reliées par un câble et elles envoient chacune une trame vers l'autre en même temps. Les deux signaux se rencontrent et s'en trouvent dénaturés provoquant une collision: la norme implique dans ce cas que la trame soit renvoyée!

La norme de liaison la plus utilisée connue est l'Ethernet, elle permet à plusieurs machines d'utiliser les mêmes liens et définit pour cela l'adressage MAC (une adresse unique par élément réseau).

  • 3. La couche réseau

La couche réseau permet de fournir la vision d'un réseau unifié aux niveaux supérieurs. Elle fournit un adressage pour les machines et permet de dépasser la dimension point-à-point des éléments agissant au niveau liaison. On n'a donc plus à s'occuper des switchs qui interviennent au niveau inférieur.

Le protocole le plus connu de cette couche est IP.

  • 4. La couche transport

La couche transport permet de garantir au destinataire que les données sont exactement celles émisent par l'expéditeur. Plus simplement, une machine envoit des paquets dans un certain ordre et les protocoles de la couche transport s'arrangent pour que la machine de destination reçoive les paquets dans le même ordre.

Les protocoles les plus répandus à ce niveau sont TCP, UDP, ICMP.

  • 5. La couche session

La couche session permet de gérer une suite de connexions.

  • 6. La couche présentation

Elle donne des mécanismes pour unifier le format des données pour les applications.

  • 7. La couche application

Elle définit les protocoles utilisés par les applications pour communiquer entre elles.

Intéraction entre les niveaux et encapsulation

Un niveau “N” doit être capable de manipuler les données fournies par le niveau “N-1” pour retrouver les informations le concernant. Il doit aussi être capable de manipuler les données du niveau “N+1” pour ajouter les siennes.

Concrètement le protocole IP doit soit manipuler les données fournies par le protocole TCP pour pouvoir les fournir au protocole PPP.

Cette intéraction se voit aussi lorsqu'une machine doit définir son adresse IP, elle demande aux autres machines si l'adresse n'est déjà utilisée. Pour cela, elle demande quelle adresse MAC possède l'adresse IP en question, en stipulant de répondre à son adresse MAC.

Lors d'une communication entre deux applications hébergées sur des machines distantes, les données partent de l'application, traversent les couches de 7 vers 1 pour arriver jusqu'au niveau physique. Ensuite elle voyagent jusqu'à la machine de destination, et traversent les couches de 1 vers 7 pour arriver jusqu'à l'application.

A chaque fois qu'une couche est traversée vers le bas (de 7 vers 1), un en-tête est ajouté, le corps étant la donnée issue du niveau supérieur. A l'inverse, lorsque les niveaux sont traversés de 1 vers 7, l'en-tête d'un niveau est retiré et le corps est donné au niveau supérieur. Il s'agit de l' encapsulation et de la décapsulation

L'en-tête d'un niveau contient une information pertinente pour ce niveau. Pour IP (niveau 3) c'est l'adresse. L'en-tête contient l'adresse IP source et l'adresse IP destination. Pour TCP, c'est le port, ici aussi source et destination.

Exemple :

Transport En-tête Données
Réseau En-tête Données Données
Liaison En-tête Données Données Données

La pile TCP/IP

Le modèle OSI est très général et on utilise plus courament la pile TCP/IP qui fusionne les niveaux 4 et 5 dans une couche transport, et les niveaux 6 et 7 dans une couche application. Les principes de communication entre les niveaux et l'encapsulation restent valables.

Même si on reduit le modèle OSI de cette façon, il reste la référence et les protocoles normalisés au niveau international obéissent toujousr au modèle OSI.

On parle de pile TCP/IP parce qu'on utilise principalement Ethernet (avec ARP), IP, TCP et UDP sur internet.

Ethernet

En ce qui concerne Ethenet, il faut retenir que cette norme permet de faire communiquer des entités sur un moyen physique commun, en gérant les collisions.

Ensuite, il existe le protocole ARP (Address Resolution Protocol = Protocole de découverte d'adresse) qui permet d'identifier uniquement des machines connectées grâce à leur adresse MAC, sorte de numéro de série réseau, car il est unique.

Enfin, la taille des données provonant des niveaux supérieurs doit être comprise entre 46 et 1500 octets pour tenir dans une seul trame. Si cette taille est trop petite, des données sont ajoutés pour atteindre 46. Si la taille est trop grande, les données sont fragmentées, ce qui peut diminuer les performances.

1500 est la longueur maximale par défaut, dans le langage ethernet, cette longueur s'appelle la MTU (Maximum Transfert Unit).

IP

Le protocole IP a pour rôle de donner une vision uniforme du réseau sous-jacent pour les niveaux supérieurs du modèle OSI. Le but est de pouvoir contacter n'importe quelle machine depuis n'importe quelle autre.

Pourquoi ne pas utiliser seulement les adresses MAC puisqu'elle sont uniques ? Tout d'abord parce que tout le monde sur internet n'utilise pas forcément Ethernet. Ensuite, lorsque la taille du réseau devient grande, comme par exemple celle d'Internet d'échelle mondiale, tout celà devient vite ingérable car il faut demander à tout le monde où est la machine à contacter. Enfin, Internet est un ensemble de réseaux connectés entre eux, historiquement il a été plus facile de faire une couche de compatibilité supplémentaire que de recommencer depuis zéro pour uniformiser tout ça.

C'est ici qu'intervient la notion de routage. Il est plus simple et moins consommateur en ressources de pouvoir contacter directement les machines proches et de demander à une machine particulière comment contacter les autres.

Pour ce faire, on attribue une adresse IP à chaque machine, puis définit des routes qui permettent de trouver les autres.

  • Les routes directes permettent d'accéder directement aux destinataires.
  • Les routes indirectes utilisent un intermédiaire.

La limite entre route directe et indirecte est définie par le masque de réseau.

Une adresse IP est un mot binaire de 4 octets, pour simplifier l'écriture on sépare les 4 octets par des points et on les écrits en décimal (et non en héxadécimal). La première adresse est donc 0.0.0.0 et la dernière 255.255.255.255.

Le masque porte bien son nom car il ne permet de directement contacter seulement les adresses commençant par les mêmes chiffres. Il s'agit également d'un mot binaire de 4 octets. Par exemple :

L'adresse 192.168.0.1 avec un masque de 255.255.255.0 peut communiquer directement avec les adresses de 192.168.0.0 à 192.168.0.255.

Si on lui associe un masque de 255.255.0.0, elle pourra communiquer directement avec les adresses de 192.168.0.0 à 192.168.255.255.

Le masque est une suite de bit qui servent à déterminer le préfixe, grâce à une opération de ET logique entre l'adresse IP et le masque. C'est pourquoi le masque est parfois rammené seulement à ce nombre de bits : 192.168.0.1/255.255.255.0 devient 192.168.0.1/24.

Ensuite, il existe des adresses particulières, qui sont l' adresse de réseau et l' adresse de diffusion (broadcast). Comme dit précedemment, le masque définit une plage d'adresses :

  • La première adresse de cette plage est l' adresse de réseau. (192.168.0.0 dans notre exemple pour un masque à 255.255.255.0)
  • La dernière adresse de cette plage est l' adresse de diffusion. (192.168.0.255 dans notre exemple pour un masque à 255.255.255.0)

Ces adresses ont un rôle particulier, elle ne sont attribuées à aucune machine, mais toutes les machines répondent à ces adresses. L'adresse de réseau et le masque forment le réseau.

Pour contacter les adresses en dehors du réseau, il faut utiliser des routes indirectes, pour cela on utilise des routeurs ou encore passerelles, qui ont des adresses sur plusieurs réseaux. Ils peuvent donc relayer les communications entre plusieurs réseaux de cette façon.

Pour terminer, sur Internet, il existe des adresses publiques et privées. Les adresses privées sont :

10.0.0.0        -   10.255.255.255  (10/8)
172.16.0.0      -   172.31.255.255  (172.16/12)
192.168.0.0     -   192.168.255.255 (192.168/16)

Il y a aussi le réseau de loopback, 127.0.0.0/8, utilisé pour permettre aux applications de fonctionner correctement même sans carte réseau ou modem. Toutes les machines ont l'adresse 127.0.0.1 qui est elle-même.

En pratique

Et que fait le noyau dans tout ça ?

Le noyau Linux commande le matériel, donc il permet l'utilisation des périphériques réseaux aux applications. Il doit également fournir un ensemble de moyen faciles d'utilisation pour que ces applications permettent de communiquer en réseau.

Concrètement, il intervient jusqu'au niveau 4 inclu. Pour simplifier, le programmeur d'une application doit juste dire qu'elle adresse il veux contacter et choisir d'utiliser TCP ou UDP. Ensuite, le noyau lui fournit un descripteur de fichier (du moins en langage C), c'est à l'application d'implémenter les protocoles des couches supérieures.

Les commandes utiles

Le noyau garde la correspondance entre les adresses MAC et IP des machines distantes, afin de pouvoir forger des paquets cohérents à leur destination. On gère cette table de correspondance avec arp. Pour voir la table actuelle, il faut l'utiliser avec l'option -a.

Une commande à connaitre est ifconfig qui permet de paramétrer les interfaces réseaux. Elle permet aussi d'afficher la configuration actuelle.

# ifconfig -a
eth0      Link encap:Ethernet  HWaddr 00:0E:0C:2C:3C:70  
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5657164 errors:0 dropped:0 overruns:0 frame:0
          TX packets:6608879 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1438432867 (1.3 GiB)  TX bytes:902860874 (861.0 MiB)
          Base address:0xec00 Memory:d9000000-d9020000 
lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:42 errors:0 dropped:0 overruns:0 frame:0
          TX packets:42 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:2571 (2.5 KiB)  TX bytes:2571 (2.5 KiB)

Ensuite, il y a route ou netstat -r qui permet d'afficher et de modifier la table de routage, on peut ainsi voir les routes actuellement configurées. On notera la possibilité d'avoir une route par défaut, il s'agit de la route à utiliser lorsque les autres ne permettent pas d'atteindre la machine désirée.

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0

Dans cet exemple, Gateway vaut 0.0.0.0 pour la première route, ceci indique qu'il s'agit d'une route directe. Pour la deuxième route, 192.168.0.1 est le routeur distant, cette route est indirecte.

La commande netstat, permet d'obtenir des informations sur les connexions en cours ainsi que ports sur lesquels des applications attendent des connexions. On utilisera netstat -atu pour connaitre toutes connexions TCP et UDP établies et les ports utilisés.

# netstat -tau 
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State           
tcp        0      0 *:ftp                   *:*                     LISTEN     
tcp        0      0 *:smtp                  *:*                     LISTEN     
tcp        0     48 192.168.0.2:49990       192.168.0.1:ssh         ESTABLISHED
udp        0      0 *:32768                 *:*                                
udp        0      0 192.168.0.2:ntp         *:*                                
udp        0      0 localhost:ntp           *:*                                
udp        0      0 *:ntp                   *:*

Les noms des protocoles applicatifs (ftp, smtp, ssh, ntp dans l'exemple) proviennent du fichier /etc/services.

  • La commande ping permet de tester si une machine répond en utilisant le protocole ICMP (Elle peut être configurée pour ne pas répondre).
  • La commande traceroute permet de trouver les routeurs par lesquels passent une route vers une machine donnée. Cette commande utilise le protocole ICMP.
  • La commande dig permet d'effectuer une résolution DNS, c'est-à-dire trouver l'adresse IP correspondante à un nom de machine :
    $  dig www.andesi.org
    ; <<>> DiG 9.2.1 <<>> www.andesi.org
    ;; global options:  printcmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58349
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    ;; QUESTION SECTION:
    ;www.andesi.org.                        IN      A
    ;; ANSWER SECTION:
    www.andesi.org.         3600    IN      A       213.161.194.93
    ;; Query time: 78 msec
    ;; SERVER: 80.10.246.1#53(80.10.246.1)
    ;; WHEN: Fri Aug  5 22:00:52 2005
    ;; MSG SIZE  rcvd: 48

l'option -x de dig permet de faire l'opération inverse.

 
reseau/reseau-tcp-ip-theorie-et-pratique.txt · Dernière modification: 18/02/2008 22:56 (modification externe)