Couche 3 : La couche Réseau

Son rôle

Le rôle de la couche 3 est donc d'interconnecter les réseaux. Cela va nous permettre d'envoyer un message d'un réseau à un autre.

Mais comment envoyer un message à un réseau auquel nous ne sommes pas directement reliés et qui peut parfois être à l'autre bout du monde ?
Les réseaux sont tous reliés entre eux, comme une chaîne. Internet est comme un énorme ensemble de réseaux collés les uns aux autres. Pour aller de mon réseau au réseau du site jaynerro.com, je passe par plusieurs réseaux intermédiaires, comme indiqué sur la figure suivante.

On voit bien qu'il y a potentiellement plusieurs chemins possibles pour aller de mon réseau à celui du site jaynerro.com.
La couche 3 va donc me permettre de joindre n'importe quel réseau sur Internet, en passant à travers d'autres réseaux. Ma connexion à une machine sur un autre réseau se fera à travers des réseaux, de proche en proche.

Nous pouvons très bien illustrer ceci en utilisant la commande traceroute sous Linux (ou tracer sous Windows). La commande traceroute permet d'indiquer par quelles machines nous passons pour aller d'un point à un autre sur Internet.

Son identifiant : l'adresse IP

Une adresse multifonction

L'adresse IP est l'adresse du réseau et de la machine. Plus exactement, une partie de l'adresse représentera l'adresse du réseau, et l'autre partie l'adresse de la machine. Une adresse IP est codée sur 32 bits (soit 4 octets).

Afin de simplifier la lecture et l'écriture d'adresses IP pour les humains, nous avons choisi d'écrire les adresses avec la notation en décimal pointée. Cette dernière sépare les 4 octets sous forme de 4 chiffres décimaux allant de 0 à 255.
Cela donne par exemple : 192.168.0.1

On en déduit que la plus petite adresse IP est: 0.0.0.0 (quand tous les bits de l'adresse sont à 0) alors que la plus grande vaut : 255.255.255.255 (quand tous les bits sont à 1).

Au niveau des ordinateurs et des différents matériels réseau manipulant les adresses IP, ces dernières sont manipulées en binaire (base 2).

L’adresse IP permet d’identifier la localisation géographique des machines, ou au moins de savoir à quel réseau elles appartiennent, contrairement à l’adresse MAC. Grâce à elle, on peut souvent localiser les émetteurs et récepteurs des messages qui transitent dans un réseau.

Le masque de sous-réseau

Nous allons ajouter une information supplémentaire à l'adresse IP : le masque de sous-réseau. Ces deux informations, adresse IP et masque, sont inséparables car c'est le masque qui indique quelle est la partie réseau de l'adresse, et quelle est la partie machine.

Définition : Les bits à 1 dans le masque représentent la partie réseau de l'adresse IP.

On en déduit que les bits à 0 représentent la partie machine de l'adresse. Prenons un exemple : on associe l'adresse IP 192.168.0.1 au masque 255.255.0.0.
Écrivons maintenant ces deux adresses en binaire pour y voir plus clair :

192.168.0.1 -> 11000000.10101000.00000000.00000001
255.255.0.0 -> 11111111.11111111.00000000.00000000

L'exercice que nous venons de faire était très facile, car la coupure entre les deux parties de l'adresse se faisait entre deux octets. Or, il arrive très souvent que la coupure se fasse en plein milieu d'un octet. Par exemple, si nous reprenons l'exemple précédent en utilisant le masque 255.255.240.0, qu'est-ce que cela donne au niveau de l'adresse ?

192.168.0.1 -> 11000000.10101000.00000000.00000001
255.255.240.0 -> 11111111.11111111.11110000.00000000

On ne peut pas repasser en décimal étant donné que la coupure se fait au milieu d'un octet. En effet, on ne peut malheureusement pas écrire un demi-octet ou une partie d'un octet seulement. On ne peut parler qu'en binaire.
La partie réseau de l'adresse est 11000000.10101000.0000 et la partie machine est 0000.00000001.

La contiguïté des bits

Dans un masque en binaire, il doit y avoir les 1 à gauche et les 0 à droite. On ne peut pas mélanger les 1 et les 0.

Ainsi, on retrouvera toujours les mêmes valeurs pour les octets d'un masque, qui sont les suivantes :
00000000 -> 0
10000000 -> 128
11000000 -> 192
11100000 -> 224
11110000 -> 240
11111000 -> 248
11111100 -> 252
11111110 -> 254
11111111 -> 255

Il nous faut maintenant le mettre en pratique pour trouver les plages d'adresses associées à tel ou tel masque. Une plage d'adresse est l'ensemble des adresses définies par l'association d'une adresse et d'un masque, de la plus petite adresse à la plus grande.

Calcul de plages d'adresses

Calcul de la première et de la dernière adresse d'une plage

La première adresse du réseau est celle dont tous les bits de la partie machine sont à 0 et la dernière adresse du réseau est celle dont tous les bits de la partie machine sont à 1.

Exemple : l'adresse 192.168.0.1 associée au masque 255.255.240.0.
Trouvons la première et la dernière adresse du réseau auquel appartient cette adresse.
Nous avons le masque et l'adresse :
255.255.240.0 -> 11111111.11111111.11110000.00000000
192.168.0.1 -> 11000000.10101000.00000000.00000001
Première adresse : 11000000.10101000.00000000.00000000 = 192.168.0.0
Dernière adresse : 11000000.10101000.00001111.11111111 = 192.168.15.255

Nombre d'adresses dans un réseau

Si jamais nous n'avions qu'un seul bit pour la partie machine, nous aurions deux possibilités sur ce bit, 0 ou 1. Si nous en avions deux, il y aurait 2 x 2 adresses possibles, soit 4 adresses (00, 01, 10, 11) et ainsi de suite.
Donc pour trouver le nombre d'adresses dans un réseau, il suffit de connaître le nombre de bits de la partie machine. Or, vu que la partie machine est définie par le masque, le nombre de machines disponibles dans un réseau est directement dépendant du masque.

La relation est même encore plus explicite : nombre d'adresses dans un réseau = 2Nombrede0danslemasque.

Adresse de réseau, adresse de broadcast

Parmi la plage d'adresses définie par une adresse IP et un masque, deux adresses sont particulières, la première et la dernière.

La première adresse d'une plage est l'adresse du réseau lui-même. Cette adresse ne pourra donc pas être utilisée pour une machine.

La dernière adresse d'une plage est une adresse spéciale, l'adresse de broadcast.
Quand nous envoyons un message à l'adresse de broadcast, ce message va être reçu par toutes les machines de notre réseau.

NB : Une adresse qui finit en 255 n'est pas obligatoirement une adresse de broadcast et une adresse qui finit en 0 n'est pas obligatoirement une adresse de réseau.

Exemple :
10.8.65.31/255.255.255.224 => Réseau allant de 10.8.65.0 à 10.8.65.31 = Adresse de broadcast !
192.168.1.0/255.255.254.0 => Réseau allant de 192.168.0.0 à 192.168.1.255 = Adresse de machine !

Par contre, une adresse de broadcast est toujours impaire ; une adresse de réseau est toujours paire.

Des adresses particulières

Les RFC

Nous venons de voir les adresses et les masques et nous avons découvert que nous formons des réseaux en les associant. Cependant, toutes les adresses n'ont pas la même signification, notamment, certaines adresses ont été réservées pour ne pas pouvoir être utilisées sur Internet. Ces adresses sont définies dans la RFC 1918.

Une RFC (Request for comments) est un document qui propose et présente une technologie que l'on souhaite voir utiliser sur Internet.

Par exemple, si je veux créer un nouveau protocole qui va révolutionner Internet, je vais le présenter dans une RFC qui pourra être lue, puis soumise à proposition, et enfin acceptée comme standard d'Internet.
Ainsi, depuis la nuit des temps, les RFC précisent le fonctionnement détaillé d'à peu près tout ce qui se trouve sur Internet. Par exemple, il y a une RFC qui présente le protocole IP, la RFC 791.

La RFC 1918

Cette RFC précise des plages d'adresses, soit des réseaux, qui ont une utilité particulière. En effet, ces plages d'adresses sont réservées pour une utilisation privée. Cela veut dire que si vous faites un réseau chez vous, ou dans une entreprise, il vous faudra obligatoirement utiliser ces adresses.

Il y a une raison à cela : imaginons que j'installe mon réseau chez moi et que je n'ai pas connaissance de la RFC 1918. Je choisis donc un réseau au hasard, par exemple le réseau 92.243.25.0/255.255.255.0. Mais malheureusement, cette plage réseau appartient à quelqu'un sur Internet. On pourrait penser que ce n'est pas grave, car de toute façon, mon réseau est privé et ne dérangera personne sur Internet. En fait, je vais avoir des problèmes...

Par exemple, j'essaye d'aller sur mon site préféré, jaynerro.com. Et badaboum, cela ne marche pas ! En effet, l'adresse du site jaynerro.com est 92.243.25.239, qui est une adresse qui appartient à la plage réseau que j'ai choisie. Ainsi, quand ma machine essaye de joindre cette adresse, elle pense que la machine se situe sur son propre réseau, d'après son adresse, et donc elle n'arrive pas à la joindre. Je ne pourrai donc jamais aller sur le site jaynerro.com.

Comment bien choisir son adresse alors ?

C'est simple, il suffit de choisir sa plage d'adresses dans les plages réservées à cet effet dans la RFC 1918.
Les plages définies sont :

  • 10.0.0.0/255.0.0.0
  • 172.16.0.0/255.240.0.0
  • 192.168.0.0/255.255.0.0

Ces adresses n'appartiennent à personne sur Internet, je serai sûr de pouvoir joindre n'importe quel site sur Internet. C'est aussi pour cela que, très souvent, les adresses qui sont données par les opérateurs sont dans ces plages.

Un protocole : IP

Pour rappel, un protocole est un langage. Il permet aux machines qui dialoguent ensemble de se comprendre.
Pour la couche 3 du modèle OSI, c'est le protocole IP, ou Internet Protocol.
Comme pour la couche 2, nous allons devoir définir de quelles informations nous allons avoir besoin, et dans quel ordre les placer.

Déjà, nous pouvons nous douter que nous allons avoir l'adresse IP de l'émetteur ainsi que celle du récepteur. Néanmoins, il va y avoir beaucoup d'autres informations. Dans un premier temps, nous n'allons voir que celles qui nous intéressent, et nous ajouterons petit à petit les autres éléments de l'en-tête IP.
Nous avons donc :

  • adresse IP émetteur ;
  • adresse IP destinataire.

Jusqu'ici rien d'étonnant, il est normal d'avoir les informations identifiant les participants à la communication.

Toutefois, nous avons dit que l'adresse IP devait toujours être accompagnée du masque ; va-t-on avoir le masque aussi dans l'en-tête IP ?

La question à laquelle il va falloir répondre est surtout : est-il nécessaire de connaître le masque d'une machine pour lui envoyer un message ?
Pour y répondre, mettons-nous dans la peau d'une machine qui veut envoyer un message à une autre.
Nous sommes la machine A qui a pour adresse 192.168.0.1/24 et nous souhaitons envoyer un message à une machine B d'adresse 192.168.1.1/24. Ce qui est important pour moi, en tant que machine A, c'est de savoir si la machine B est sur mon réseau. En effet, si elle est sur mon réseau, je lui parlerai grâce à la couche 2. Si elle est sur un autre réseau, il faudra que je fasse appel à la couche 3.

De quoi ai-je besoin pour savoir si la machine B est sur mon réseau ?

Pour savoir si la machine B est sur mon réseau, c'est facile ! Je regarde la plage d'adresses de mon réseau, et je n'ai plus qu'à regarder si l'adresse de la machine B appartient à cette plage.

Dans notre cas, ma plage d'adresses va de 192.168.0.0 à 192.168.0.255. Elle ne contient donc pas l'adresse de la machine B (192.168.1.1). J'en déduis donc que B n'est pas sur mon réseau et qu'il va falloir utiliser la couche 3 pour communiquer avec elle.

Nous remarquons au passage que nous n'avons pas eu besoin du masque de la machine B pour savoir si elle appartenait à notre réseau. Il ne sera donc pas utile d'indiquer le masque dans l'en-tête IP. L'adresse IP suffira.

Comme pour la trame de couche 2, un format de message est défini par le protocole. Pour le protocole IP, le message s'appelle un datagramme ou un paquet.

Le datagramme / paquet

Comme pour la couche 2, le datagramme IP va être une suite de 0 et de 1 organisés.
Voici la forme qu'il va prendre :

Datagramme / paquet IP

Nous voyons ici que le format général est proche de celui de la trame Ethernet, mais que les informations contenues sont différentes et dans un ordre différent. L'adresse IP de destination est en fin d'en-tête. Et pourtant, nous avions vu en couche 2 qu'il était important que l'adresse MAC de destination soit en début d'en-tête pour que la machine qui reçoit la trame sache immédiatement si celle-ci lui est destinée. Pourquoi cela serait différent pour IP ?
Pour le comprendre, nous allons devoir aborder d'autres notions.

L'encapsulation

Qu'est-ce qui circule sur le réseau ? Des trames ? Des datagrammes ? Les deux ? Pour répondre à cette question, nous allons devoir nous replonger dans le modèle OSI.

Comme nous le voyons, un message est envoyé depuis la couche 7 du modèle OSI, et il traverse toutes les couches jusqu'à arriver à la couche 1 pour être envoyé sur le réseau.

Que devient notre message d'origine, ainsi que les en-têtes de chaque couche ?

Un en-tête va être ajouté à chaque passage par une couche. On va ainsi accumuler les en-têtes des différentes couches (voir la figure suivante).

Au passage par la couche 4, on ajoutera l'en-tête de couche 4, puis celui de couche 3 en passant par la couche 3, et ainsi de suite.

Ce mécanisme s'appelle l'encapsulation, car on encapsule un message dans un autre.

Nous voyons clairement qu'au final, ce qui va circuler sur le réseau est une trame de couche 2, qui contient le datagramme de couche 3 (qui lui-même contiendra l'élément de couche 4).
Ainsi, je vous ai plus ou moins menti quand je vous ai donné le format d'une trame Ethernet.

Je ne vous ai pas dit que dans les données à envoyer, il y avait en fait l'en-tête de couche 3, l'en-tête de couche 4, puis enfin, les données à envoyer.

Ceci dit, j'ai eu raison de vous le présenter ainsi, car la couche 2 est incapable de lire les informations de couche 3 ou de couche 4, de même qu'elle ne comprend pas les données à envoyer. Pour elle, tout cela est une suite de 0 et de 1 qu'elle est incapable de comprendre, elle ne voit ça que comme des données.
Maintenant, vous, vous savez que parmi ces données il y a aussi les en-têtes des couches supérieures.

Exemple réel

En utilisant le logiciel wireshark, nous pouvons voir les trames qui passent sur notre réseau. Wireshark est un sniffer. Un sniffer est un programme qui écoute sur le réseau, intercepte toutes les trames reçues par votre carte réseau, et les affiche à l'écran.
Si l'on se plonge dans le contenu d'une trame en cliquant sur l'une d'entre elles, nous pouvons voir que Wireshark sépare les éléments de chacune des couches du modèle OSI.

Nous pouvons voir les éléments vus par la couche 1 (Frame...), puis la couche 2 Ethernet, puis la couche 3 IP, Internet Protocol, la couche 4 que nous ne connaissons pas encore et les données applicatives qui sont ici du web HTTP.

Pour revenir à pourquoi l'adresse IP de destination n'est pas en début d'en-tête IP ?

Quand un message arrive sur une machine, il remonte les couches du modèle OSI de la couche 1 à la couche 7. Il passe donc par la couche 2 qui lit l'adresse MAC de destination :

  • si c'est bien celle de la carte réseau, il lit le reste de la trame, puis transmet les données (le paquet/datagramme) à la couche 3 ;
  • si ce n'est pas celle de la carte réseau, il jette la trame.

Donc si le message arrive à la couche 3, cela veut obligatoirement dire que la machine sait déjà que le message lui est destiné, puisque l'adresse MAC de destination est la sienne. Elle n'a donc pas la nécessité de savoir immédiatement si l'adresse IP de destination est la sienne, puisqu'elle sait déjà que le paquet est pour elle.
Le choix de mettre l'adresse IP en fin d'en-tête n'est pas anodin et sert surtout à mettre les informations importantes de couche 3 proches des informations importantes de couche 4 que nous verrons plus tard.

Le matériel de couche 3 permettant de relier plusieurs réseaux est le   routeur .

Références

"Apprenez le fonctionnement des réseaux TCP/IP" de Eric Lalitte - Collection OpenClassrooms
Concevez votre réseau TCP/IP - OpenClassrooms