Protocole IPv4 : Les bases

Le protocole IPv4 : les bases

Introduction

IPv4 est un protocole « routable », de la couche réseau du modèle OSI (couche 3), entendez par là qu’il défini principalement un système d’adressage permettant de router des paquets.
Ce protocole est décrit dans la RFC791 publiée en 1981. Son objectif initial était de permettre l’interconnexion de réseaux.
Le principe sur lequel il est bâtit est relativement simple: attribuer aux machines une (ou plusieurs) adresses(s) d’une taille donnée afin que celle-ci puissent s’échanger des paquets de données. Ces adresses permettent aux machines composant le réseau de choisir un itinéraire pour acheminer les données depuis une source vers une destination.

Analogie

Si je veux transmettre une lettre à un voisin qui habite la même rue que moi, je ne me préoccupe pas de l’adresse de la rue. Tout ce que j’ai besoin de savoir c’est ce qui distingue sa maison de la mienne. Une caractéristique physique de sa maison.
Par contre, si je souhaite envoyer une lettre à un correspondant à l’étranger, je vais généralement faire appel à un service qui acheminera ma lettre à son destinataire. Pour que ce service puisse faire son travail, je dois lui indiquer à qui j’envoie la lettre, mais surtout, où cette personne habite. Hors pour préciser cette information, je dois disposer d’un système d’adressage. Le service postal utilisera l’adresse du destinataire pour définir l’itinéraire que prendra la lettre.
En y réfléchissant de plus près, même moi j’ai besoin de cet adressage. Sans lui je ne pourrais raisonnablement pas définir si le destinataire est dans la même rue que moi. Donc au final, quand j’envoie la lettre, le compare l’adresse du destinataire à la mienne, si nous sommes dans la même rue, je lui apporte moi même (c’est plus simple non ?), si ce n’est pas le cas, je fais appel à un service qui l’acheminera vers sa destination.
Le système postal que nous connaissons fonctionne (Si si, il fonctionne… ou pas… 😉 ) parce que nous utilisons un protocole qui consiste à indiquer sur l’enveloppe l’adresse du destinataire à un endroit défini, au dos, nous marquons notre propre adresse, pour un retour éventuel, nous l’affranchissons, indiquons aussi d’éventuelles options (courrier prioritaire, colis fragile…) etc.
Du point de vue réseau, le concept est similaire…

L’en-tête IPv4

Lorsque des données doivent être véhiculées sur un réseau, les machines les encapsulent dans un paquet muni d’un en-tête qui comporte toutes les informations nécessaires au routage des données. Voici l’en-tête:

Chacune des case représente un champs qui apporte une information précise pour le traitement du paquet IPv4:

  • Version: indique la version du protocole (toujours égal à 4 pour IPv4)
  • IHL: Longueur de l’en-tête IPv4 (nécessaire en raison de la présence possible d’options)
  • ToS: Marquage différentiel pour la qualité de service (permet de marquer un paquet comme étant plus important).
  • TPL: Longueur totale du paquet IPv4.
  • Fragment ID: Identification d’un fragment de paquet, permet de le reconstituer plus tard. Utilisé lorsqu’un paquet doit être fragmenté parce que sa taille dépasse la capacité du réseau sur lequel il doit être émis.
  • FLAG: Marqueurs permettant d’indiquer si un paquet peut/doit ou ne peut pas être fragmenté.
  • Fragment Offset: Indique la position du fragment au sein du paquet original.
  • TTL: Time To Live, représente le nombre d’intermédiaire (routeurs) par lesquels le paquet peut encore passer avant d’être détruit. Il s’agit d’un mécanisme permettant d’éviter qu’un paquet ne tourne indéfiniment dans un réseau suite à un problème de routage. On peut comparer cela à une date de péremption.
  • Protocol: Contient une valeur numérique qui identifie la nature du contenu du paquet.
  • Checksum: SOmme de contrôle calculée sur l’en-tête du paquet IPv4. Permet de contrôler l’intégrité de l’entête et donc de le détruire s’il avait été altéré.
  • Source IP: Adresse IPv4 de la machine qui a émis le paquet.
  • Destination IP: Adresse IPv4 de la machine à laquelle est destinée le paquet.
  • Options: Permet d’ajouter différentes informations optionnelles et rarement utilisées.
  • Data: Les données véhiculées dans le paquet.

Chaque machine travaillant au niveau de la couche réseau (couche 3) du modèle OSI analysera cette en-tête et agira en conséquence. Par exemple, les routeurs l’utiliseront pour acheminer les données vers la destination en fonction de l’adresse IPv4 de destination.

Types de communications IPv4

Il existe en IPv4, trois manières de communiquer…

  • Le paquet unicast: Un paquet émis par une machine, destiné à une et une seule autre machine. Une communication de un-à-un.
  • Le paquet broadcast (de diffusion): Un paquet émis par une machine et destiné à toutes les machines d’un réseau. Une communication de un-à-tous.
  • Le paquet multicast (de multi diffusion): Un paquet émis par une machine et destiné à un groupe de machine. Une communication de un-à-plusieurs.

La majorité des échanges de données sont des communications unicast. Par exemple, lorsque je surfe sur un site web, c’est ma machine (le client) qui dialogue avec le site distant (le serveur). On a donc bien une relation de un à un.
Chaque type de communication utilise un adressage différent bien que défini dans une structure unique.

L’adressage IPv4

Pierre angulaire du protocole IPv4, l’adresse IPv4 est donc une valeur numérique codée sur 32 bits (soit 2^32 adresses IPv4 au total) que l’on attribue principalement aux interfaces des machines afin que celles-ci puissent s’échanger des données. Malheureusement, toutes ces adresses ne sont pas utilisables pour adresser une machine, nous y reviendrons.
Ces adresses sont représentées généralement sous la forme de 4 octets exprimés en valeur décimale, séparés par un point. (Ex: 192.168.0.1, 80.200.14.58, etc.)
Un octet étant composé de 8 bits, sa valeur ne peut pas excéder 255. Toutes les adresses IPv4 sont donc comprises entre 0.0.0.0 et 255.255.255.255.

Pour comprendre la structure d’une adresse IPv4, le plus simple est de réfléchir à l’adresse d’une série de maisons dans une rue:

  • Toutes les maisons d’une même rue auront une partie de leur adresse commune (le nom de la rue, la commune, la ville, le pays, etc.)
  • Chaque maison aura dans son adresse un élément qui lui est propre: le numéro de la maison dans la rue.

L’adressage IPv4 fonctionne exactement sur le même principe. Toutes les interfaces de machines dans un même réseau auront une partie de leur adresse qui sera commune: l’identifiant réseau et une deuxième partie qui lui sera propre: l’identifiant hôte. Ces deux éléments ensembles formant l’adresse complète de la machine dans son réseau. Voici ce que ça donne d’un point de vue conceptuel:

L’identifiant réseau est formé par un certain nombre de bits (à gauche, les bits de poids fort), et l’identifiant hôte (à droite, les bits de poids faible) représenté par ce qui reste de bits.
Normalement une question doit vous venir à l’esprit… « Combien de bits côté réseau ? et donc combien côté hôte ? »… Et c’est ici que les Romains s’empoignèrent!

Comment définir la limite entre l’identifiant réseau et l’identifiant hôte ?

Les classes

La première idée était de faire simple, enfin, humainement simple en tout cas: on définit 5 classes. A chaque classe correspond une définition en terme de limite d’identifiant réseau/hôte ou autre etc.

  • Classe A: Toutes les adresses dont le premier bit vaut 0 (donc de 0.0.0.0 à 127.255.255.255). Ces adresses ont 8 bits pour la partie réseau, et donc 24 pour la partie hôte.
  • Classe B: Toutes les adresses dont les deux premiers valent 10 (donc de 128.0.0.0 à 191.255.255.255). Ces adresses ont 16 bits pour la partie réseau, et donc 16 pour la partie hôte.
  • Classe C: Toutes les adresses dont les trois premiers valent 110 (donc de 192.0.0.0 à 223.255.255.255). Ces adresses ont 24 bits pour la partie réseau, et donc 8 pour la partie hôte.
  • Classe D: Toutes les adresses dont les quattre premiers valent 1110 (donc de 224.0.0.0 à 239.255.255.255). Ce sont les adresses multicast. Elles représentent une groupe de machine et n’entrent donc pas dans la logique d’adresse d’une machine unique.
  • Classe E: Toutes les adresses restantes (donc de 240.0.0.0 à 255.255.255.254). Adresses réservées pour utilisation futures… ou pas… donc non utilisables pour adresser une machine.

Nous nous retrouvons donc avec 3 classes utilisables. La première qui défini des réseaux pouvant comporter 2^24 machines ( 16,7 millions de machines !!! ), la seconde qui permet d’adresser des réseaux de 2^16 machines (65536), et enfin la plus petite, qui permet elle d’adresser des réseaux de 2^8 machines (256).

Faites une pause de quelques secondes, et demandez-vous combien de sociétés que vous connaissez disposent de plus de 16 millions de machines ? Et environ 65000 machines ? …

Il faut remettre tout ça dans son contexte. IPv4 est apparu alors qu’Internet n’existait pas encore. A l’époque, ce qui est maintenant le réseau des réseaux n’était qu’une interconnexion d’établissements militaires, universitaires etc, nommé ARPAnet. Ce n’est qu’une bonne dizaine d’années plus tard que les particuliers ont commencé tout doucement à disposer d’un accès à Internet.
L’idée de base avait du sens: une société forme un réseau de machines, donc, on attribuait une plage d’adresses plus ou moins grande en fonction de la taille de la société. Donc si je suis un géant de l’informatique de l’époque, je reçois une classe A, par exemple toutes les adresses de 23.0.0.0 à 23.255.255.255. Dés lors lorsqu’un paquet doit être transmis à une machine, en fonctionne de l’adresse de destination je peux déterminer la classe de celle-ci, et donc savoir combien de bits représentent le réseau. Dans l’exemple précédent, cela signifie que toutes les adresses dont le premier octet vaut 23 sont dans le même réseau.

C’est donc un principe qui suivait la logique de l’époque mais qui manquait cruellement de vision. Quand l’accès à Internet a commencé à se démocratiser, d’abord pour les entreprises, et ensuite pour les particuliers, un problème est apparu: il était impossible de fournir suffisamment de plages d’adresses et ce parce que les classes ont découpé l’espace global d’adresses IPv4 en des ensembles trop grossiers qui ne correspondent plus aux besoins.

Autre problème, mais celui-là inhérent à IPv4, le nombre d’adresse IPv4 disponible au total est insuffisant. 2^32 adresses au total, soit un peu moins de 4,3 milliards d’adresses, pour à l’heure actuelle quelques 7 milliards d’êtres humains. Si en plus on attribue les adresses par classe, gaspillant ainsi une quantité énorme d’adresses, on comprend vite que ça ne peut mener qu’à une impasse.
Si j’attribue toutes les adresses de 23.0.0.0 à 23.255.255.255 à une société mais que celle-ci n’en utilise que 10%, cela représente approximativement 15 millions d’adresses « perdues » puisqu’on ne peut pas donner une adresse de cette classe à une machine qui n’est pas dans ce réseau. Cela reviendrait à mettre le même nom de rue à des maison qui ne sont pas physiquement dans la même rue.

Le CIDR (Classless Inter-Domain Routing)

La seule chose à faire était donc d’abandonner les classes de définir des réseaux dont la taille peut être ajustée en fonction des besoins réels afin d’éviter tant que faire se peut le gaspillage de ces adresses.
Si on abandonne les classes, on abandonne donc aussi la définition de leur taille en terme d’identifiant réseau et identifiant hôte. Il faut donc un nouvel élément qui servira de délimitation: le masque de réseau.

Masque de (sous-)réseau

Le masque est une valeur numérique qui comme l’adresse IPv4 est codé sur 32bits et représenté en décimal sous forme de 4 octets séparés par des points. (Ex: 255.255.255.0, 255.255.224.0). Son rôle est d’indiquer quels sont les bits de l’adresse qui identifient la partie réseau et donc aussi ceux qui identifient la partie hôte.
Les bits de poids fort (à gauche) représentent la partie réseau et ont leur valeur à 1. Les bits de poids faible (à droite) ont leur valeur à 0 et identifient la partie hôte de l’adresse.

C’est donc le masque du réseau qui détermine sa taille, et donc le nombre d’adresses qui font partie de ce réseau. Plus le masque est grand (plus il y a de bits à 1) plus le réseau est petit (il y a moins de bits côté hôte). Plus le masque est petit, plus le réseau est grand.

Prenons par exemple le masque suivant:

255.255.255.192

En binaire cela donne:

11111111.11111111.11111111.11000000

Il y a 26 bits à 1, donc 26 bits qui identifient la partie réseau. Il en reste donc 32-26=6 bits pour les adresses hôtes, soit 2^6=64.

Par contre avec le masque…

255.255.224.0

Qui s’écrit en binaire…

11111111.11111111.11100000.00000000

Il y a 19 bits côté réseau et donc 32-19=13 bits côtés hôte. Ce qui donne 2^13=8192 adresses dans un même réseau.

Une autre notation du masque est également souvent utilisée, en suivant le format suivant: adresse_ip / bits_réseaux
Exemple: 21.58.63.250/26, cette notation revient à écrire 21.56.63.250 / 255.255.255.192

Au lieu d’écrire l’expression décile du masque, on indique uniquement

Avec le CIDR, une adresse seule n’a plus de sens. Elle doit toujours être accompagnée d’un masque. Sans quoi il est impossible de déterminer à quel réseau elle appartient.

L’adresse de (sous-)réseau

A chaque réseau correspond une adresse qui l’identifie. Il s’agit de la première adresse du réseau lui même. Celle pour laquelle tous les bits hôtes vallent 0.
Une opération simple (un ET logique) entre une adresse quelconque et le masque qui lui est joint permet de retrouver l’adresse du réseau auquel elle appartient.

Prenons par exemple l’exemple d’une machine qui aurait la configuration suivante:

  • Adresse IPv4: 158.98.45.33
  • Masque réseau: 255.255.255.0

L’application d’un ET logique (une opération binaire) entre ces deux valeurs donnent l’adresse du réseau:

        10011110.01100010.00101101.00100001	(158.98.45.33)
ET      11111111.11111111.11111111.00000000	(255.255.255.0)
=======================================
        10011110.01100010.00101101.00000000	(158.98.45.0)

L’adresse du réseau dans lequel se trouve la machine est donc 158.98.45.0. Notez que si on tenait compte des classes. Les adresses 158… commencent par 10… en binaire et donc auraient fait partie de la classe B 158.98.0.0.

Autre exemple:

  • Adresse IPv4: 89.27.250.45
  • Masque réseau: 255.255.255.248

On retrouve donc l’adresse réseau de cette machine par l’opération suivante:

        01011001.00011011.11111010.00101101	(89.27.250.45)
ET      11111111.11111111.11111111.11111000	(255.255.255.248)
=======================================
        01011001.00011011.11111010.00101000	(89.27.250.40)

L’adresse réseau de cette machine est donc 89.27.250.40

Il est important de noter que l’adresse du réseau ne peut pas être attribuée à une machine. Une machine est un élément du réseau et non le réseau lui-même.

L’adresse de diffusion (broadcast) du (sous-)réseau

Pour chaque réseau, il existe une adresse dite de diffusion (de broadcast). Cette adresse a pour but d’émettre un paquet et de l’adresser à l’ensemble des machines du réseau en question (Communication de un à tous). Il s’agit de la dernière adresse du réseau. Celle pour laquelle tous les bits hôtes vallent 1.

Exemple:

  • Adresse: 121.43.98.205
  • Masque: 255.255.255.128

On obtient donc l’adresse réseau par l’opération logique ET (comme plus haut):

     01111001.00101011.01100010.11001101	(121.43.98.205)
ET   11111111.11111111.11111111.10000000	(255.255.255.128)
========================================
     01111001.00101011.01100010.10000000	(121.43.98.128)

L’adresse du réseau est donc 121.43.98.128.
A partir de là il suffit de mettre tous les bits hôtes, c’est à dire les 7 bits à droite à 1:

     01111001.00101011.01100010.11111111	(121.43.98.255)

L’adresse broadcast de ce réseau est donc 121.43.89.255.

Plage d’adresses utilisables

Puisque l’adresse du réseau est la première adresse dans ce réseau et que l’adresse broadcast est la dernière. Tout ce qui se trouve entre les deux forme la plage d’adresses utilisables.
On obtient le nombre d’adresses utilisable dans un réseau par la formule suivante: nb adresses = 2^n-2, où n est le nombre de bits hôtes. On soustrait deux unités pour l’adresse du réseau et l’adresse broadcast.

Exemple récapitulatif

Les données de bases étant les suivantes:

  • Adresse: 188.56.58.39
  • Masque: 255.255.248.0

On obtient l’adresse réseau en appliquant le masque à l’adresse…

     10111100.00111000.00111010.00100111	(188.56.58.39)
ET   11111111.11111111.11111000.00000000	(255.255.248.0)
========================================
     10111100.00111000.00111000.00000000	(188.56.56.0)

L’adresse réseau est donc 188.56.56.0

Pour obtenir l’adresse broadcast, il faut remplacer mettre les bits hôtes à 1…

     10111100.00111000.00111111.11111111		(188.56.63.255)

L’adresse broadcast est donc 188.56.63.255

Les adresses comprises entre 188.56.56.0 et 188.56.63.255 forment donc la plage d’adresses utilisables.
Leur nombre est de 2^11-2 = 2046 adresses.

Routage IPv4

Router un paquet consiste à l’acheminer vers la destination en fonction de sa table de routage. Cette table contient la liste des réseaux vers lesquels elle est apte à acheminer les données ainsi que les informations nécessaires au traitement du paquet.

Table de routage

La table de routage est une liste de routes, c’est-à-dire, une liste de réseaux auxquels sont attachés les informations nécessaires au routage du paquet: un next-hop (la prochaine machine à qui le paquet doit être transmis), une interface (celle par laquelle le paquet devra être émis), une métrique (une valeur permettant de comparer deux routes), etc.

exemple de table de routage sous Windows 7

IPv4 Table de routage
===========================================================================
Itinéraires actifs :
Destination réseau    Masque réseau  Adr. passerelle   Adr. interface Métrique
          0.0.0.0          0.0.0.0      192.168.1.1      192.168.1.9     10
        127.0.0.0        255.0.0.0         On-link         127.0.0.1    306
        127.0.0.1  255.255.255.255         On-link         127.0.0.1    306
  127.255.255.255  255.255.255.255         On-link         127.0.0.1    306
      192.168.1.0    255.255.255.0         On-link       192.168.1.9    266
      192.168.1.9  255.255.255.255         On-link       192.168.1.9    266
    192.168.1.255  255.255.255.255         On-link       192.168.1.9    266
        224.0.0.0        240.0.0.0         On-link         127.0.0.1    306
        224.0.0.0        240.0.0.0         On-link       192.168.1.9    266
  255.255.255.255  255.255.255.255         On-link         127.0.0.1    306
  255.255.255.255  255.255.255.255         On-link       192.168.1.9    266
===========================================================================
  • Destination réseau: L’adresse du réseau de destination.
  • Masque réseau: Détermine la taille du réseau en question.
  • Adresse passerelle: L4adresse IPv4 de la machine à qui le paquet doit être transmis pour l’acheminer vers le réseau en question.
  • Adresse Interface: L’adresse de l’interface par laquelle le paquet devra être émis/routé.
  • Métrique: permet de choisir en plusieurs routes qui indiquerait la même destination.

Exemple de table de routage sur un routeur Cisco

Codes: C - connected, S - static, I - IGRP, R - RIP, M - mobile, B - BGP
 D - EIGRP, EX - EIGRP external, O - OSPF, IA - OSPF inter area
 N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
 E1 - OSPF external type 1, E2 - OSPF external type 2, E - EGP
 i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
 * - candidate default, U - per-user static route, o - ODR
 P - periodic downloaded static route

Gateway of last resort is 10.0.0.1 to network 0.0.0.0

 10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C       10.0.0.0/30 is directly connected, Serial0/0
O       10.0.10.0/24 [110/782] via 10.0.0.1, 00:53:35, Serial0/0
 192.168.0.0/30 is subnetted, 1 subnets
C       192.168.0.0 is directly connected, FastEthernet0/0
 192.168.1.0/24 is variably subnetted, 3 subnets, 2 masks
C       192.168.1.0/28 is directly connected, FastEthernet0/0.10
C       192.168.1.16/28 is directly connected, FastEthernet0/0.20
C       192.168.1.32/29 is directly connected, FastEthernet0/0.30
O*E2 0.0.0.0/0 [110/1] via 10.0.0.1, 00:50:51, Serial0/0

Lorsqu’on y est pas habitué, cet affichage put perturber. Ceci dit, chaque route est précédée d’un symbole. Dans le cas présent, les routes commençant par un « C » indiquent une route directement connectée. Donc un réseau directement attaché au routeur (dans Windows 7, on le voit avec la mention « On-link »).
Les routes commençant par « O » sont des routes apprises à l’aide d’un protocole de routage, OSPF. Ce sont des routes vers des réseaux qui se trouvent au-delà d’une autre machine.

Pour chacun de ces routes on a donc un format du genre:

ORIGINE     Réseau/Masque [AD/Métrique]     next-hop     Interface

Le terme « AD » représente la distance administrative. Il s’agit d’une notion que l’on retrouve surtout sur les routeurs Cisco. Cette élément permet lui aussi de différencier des routes. Chaque source d’information aura sa distance administrative. Par exemple une route connectée a une AD=0, une route statique AD=1, une route OSPF AD=110, etc. (valeurs par défaut).

Pour plus d’explication concernant les tables de routage, je vous invite à lire cet article: « Table de routage – Comment ça marche?« 

1 Comment on “Protocole IPv4 : Les bases

  1. Très bon cour merci , n’ayant pas l’esprit cartésien, les analogies et explications claires m’ont permis de cerner ce protocole . Merci a l’auteur :p