top of page
  • Photo du rédacteurOlivier Lebeau

Network 102 - Les bases du protocole IP : IPv4 et IPv6

Dernière mise à jour : 25 mai

Une notion importante à comprendre lorsqu'on parle de réseau informatique, les règles de l'adressage IP. Afin d'être joignable, les sites et services auxquels on accède sur Internet doivent pouvoir être trouvée. Un peu comme quand on va chez un ami, un médecin ou à une quelconque destination, il est nécessaire de connaitre l'adresse de destination pour pouvoir s'y rendre. Sinon, il faudrait taper de maison en maison pour vérifier si on est ou non arrivé à destination. Sur Internet, c'est pareil, imaginez vous juste aller vérifier et vos mails, si le service qui gère vos mails ne possédez pas d'adresses comment votre PC ferait pour le joindre ?

C'est de là que vient la notion d'adressage IP, comme un moyen pour que les paquets réseaux puissent identifier une source de laquelle elle provient et une destination vers laquelle elle transite.


Le protocole IP


Le protocole IP est celui qui a été reconnu pour acheminer les paquets sur un réseau et permettre de ce fait l'adressage réseau. Puisqu'on parle de réseau, ceux qui ont lu mes articles précédents feront peut-être le lien avec la couche 3 du modèle OSI (sinon je t'invite lire cet article c'est intéressant crois moi ! :) ).


C'est ce protocole qui va ajouter les en-têtes IP à nos segments TCP dans le processus d'encapsulation des données. C'est dans ces en-têtes qu'on retrouve les adresses IP, qui sont en quelque sorte des identifiants uniques dans un réseau, et je précise bien, DANS UN RESEAU, pour que les appareils chargés de la transmission de l'information puissent l'acheminer vers le bon destinataire.


L'en-tête IPv4 est représentée de la façon suivante :

En-tête IPv4

Chaque champ a un rôle dans le fonctionnement du protocole IP avec notamment les champs suivants :

  • Version : Indique la version d'IP

  • Total Length : Indique la longueur totale du paquet (En-tête + Data)

  • Identification : Permet d'indiquer le numéro du paquet. Dans le cas d'un message fragmenté, il permet au destinataire de reconstituer l'information à partir des différents paquets.

  • TTL : Time to live, indique la durée de vie du paquet sur le réseau.

  • Prot : Indique le protocole utilisé (TCP/UDP/ICMP).

  • Adresse source/destination : permet d'identifier les adresses des participants à la communication .


Le champ d'identification va de pair avec le champ Flgs qui permet de déterminer si le paquet est fragmenté ou non. Dans un réseau, les routeurs peuvent ne pas relayer des paquets si ceux-ci dépassent une certaine taille. Cette taille est appelée MTU (Maximum Transmission Unit). Par défaut, elle est de 1500 octets pour Ethernet. Si un paquet en transit passe par un routeur ayant un MTU plus faible, par exemple 1400 octets, le paquet sera fragmenté en deux paquets par le routeur. Ce fonctionnement n'est pas optimal car il génère de la latence et rend le trafic non optimisé, ce qu'il est préférable d'éviter.


Pour plus d'informations sur les autres champs, je t'invite à suivre le lien suivant : IPv4 — Wikipédia (wikipedia.org)


L'adressage IP


Comme mentionné plus haut, l'adressage IP permet d'identifier de façon unique un appareil au sein d'un réseau via une adresse. Celle-ci peut être assignée dynamiquement par le biais d'un protocole comme DHCP (Dynamic Host Configuration Protocol) ou statiquement en spécifiant soit même une adresse au niveau de la configuration IP de son appareil.


Si je regarde au niveau de mon PC par exemple :

ipconfig montrant les adresses IPv4 et IPv6

Au niveau de ma carte wlan0, qui est la carte Wifi de mon PC, il y'a deux lignes liées à l'adressage IP : inet et inet6. Pourquoi deux lignes ? Parce qu'il existe aujourd'hui deux versions d'IP qui cohabitent.


Ces adresses sont représentés de la façon suivante :

IPv4 : 10.0.0.10

IPv6 : fe80::52c2:e8ff:fe4d:3d25


Tu peux voir que chacune de ces valeurs est associée à un /24 ou /64. C'est deux valeurs sont ce qu'on appelle le masque de sous-réseau qui permet d'identifier dans quel réseau les appareils se situent.


Pourquoi cette différence entre ces deux adresses ? Le codage n'est pas le même, si une adresse IPv4 est codée sur 32 bits, une adresse IPv6 le sera elle sur 128 bits.


Pourquoi avoir deux adresses codées différemment ? Parce que le nombre d'adresses disponible n'est pas le même. Alors qu'IPv4 permet d'adresser 2^32 périphériques (+/- 4 milliards), IPv6 permet d'en adresser 2^128 ( je te laisse faire le calcul mais ça fait vraiment beaucoup ).

L'intérêt d'avoir une possibilité d'adresser un nombre plus grand de périphériques vient du fait qu'aujourd'hui, le nombre d'adresse IPv4 est limitant par rapport à la croissance rapide des appareils interconnectées à Internet.


Le protocole IP historique : IPv4


Le protocole IPv4 est la première version du protocole IP a avoir été et à être toujours aujourd'hui largement déployée.


Je pense que tu as déjà vu des adresses de la forme 10.0.0.10, comme dans mon exemple précédent ou encore 192.168.1.1 qui est très courante. Ces adresses sont écrites sous leur forme numérique, ce qui est quand même plus lisible que leur forme réelle qui est binaire.

Si je reprend mon exemple 10.0.0.10 :



Comme tu peux le voir dans l'exemple ci-dessus, chaque valeur numérique est associée à 8 bits. L'adresse IPv4 est donc composée de 32 bits au total, soit 4 groupes de 8 bits, soit 4 octets.


Chaque bits est une puissance de 2, de ce fait, dans un octet, chaque bit de droite à gauche prend respectivement les valeurs suivantes :

  • 2^0 : 1 -> 00000001

  • 2^1 : 2 -> 00000010

  • 2^2 : 4 -> 00000100

  • 2^3 : 8 -> 00001000

  • 2^4 : 16 -> 00010000

  • 2^5 : 32 -> 00100000

  • 2^6 : 64 -> 01000000

  • 2^7 : 128 -> 10000000


Les valeurs numériques de chaque octet sont alors définis en faisant le somme des bits qui sont à 1. De cette façon, dans un réseau, chaque octet peut prendre une valeur allant de 0.0.0.0 à 255.255.255.255 (même si on le verra plus tard ce n'est pas forcément vrai)


Dans notre exemple, 10.0.0.10 est obtenu de la façon suivante :


  • 10 : 00001010 -> 0+0+0+0+8+0+2+0

  • 0 : 00000000 -> 0+0+0+0+0+0+0+0

  • 0 : 00000000 -> 0+0+0+0+0+0+0+0

  • 10 : 00001010 -> 0+0+0+0+8+0+2+0


Jusque là ça va non ? Je vais donc rajouter un peu plus de détail ! Ce qu'on a vu jusqu'à présent, c'est globalement comment est définie une adresse IPv4, maintenant comment ça fonctionne en réalité ?

Masque de sous-réseau


Chaque adresse IP est associée à ce qu'on appelle un masque de sous-réseau. C'est ce masque qui permet de définir pour une adresse IP à quel réseau elle appartient. De la même façon qu'une adresse IP ce masque est codé sur 32 bits et pour chacun de ces octets une valeur qui va de 0 à 255. Dans ma capture d'écran d'exemple, mon adresse IP 10.0.0.10 est suivie d'un /24 qui est l'indication du masque de sous-réseau. Il s'agit de la notation dite CIDR (Classless Interdomain Routing).


Pourquoi Classless ? Parce qu'initialement, les adresses IPs étaient définies en classes dans lesquelles les entreprises venaient piocher des adresses au besoin.


Classe A

Classe B

Classe C

Classe D

Classe E

0.0.0.0 - 127.255.255.255

128.0.0.0 - 191.255.255.255

192.0.0.0 - 223.255.255.255

224.0.0.0 - 239.255.255.255

240.0.0.0 - 255.255.255.255

De ces classes, on retiendra surtout les classes privées qui sont des plages réseaux à usage local et non utilisé sur internet. Ces adresses sont utilisées localement pour permettre le routage en dehors d'internet.


  • Classe A : 10.0.0.0

  • Classe A : 127.0.0.0

  • Classe B : 172.16.0.0 à 172.31.0.0

  • Classe C : 192.168.0.0 à 192.168.255.0


Pour remédier à la pénurie d'adresses IPv4, les organismes ont eu l'idée d'organiser les plages d'adresses IP par classes. L'association d'un bloc d'adresse à un masque permet de créer un sous-réseau. Il découpe en quelque sorte une adresse IP en deux parties, une partie liée au réseau (NetID), une partie liée à l'hôte (HostID).


Puisqu'un exemple est plus parlant, je vais reprendre mon 10.0.0.10/24.

Le /24 est un raccourci pour indiquer le fait qu'il y'a 24 bits à 1.

Le masque qui en découle est donc le suivant :


Association masque de sous réseau / adresse ip

L'exemple 24 est facile puisque la coupure se fait proprement au niveau d'un octet. Si on se base sur cet exemple, il indique que les 3 premiers octets composent le NetID et le dernier octet compose le HostID.


Quelle implication ça a ? Et bien ce sous réseau est composé des adresses allant de 10.0.0.0 à 10.0.0.255. Je vais mieux décomposer pour que ça soit plus clair en reprenant la forme binaire de mon adresse IP.


Association masque de sous réseau / adresse ip binaire

Si tu regardes les deux lignes en binaire, la première correspondant à mon adresse IP et la seconde correspondant à mon masque tu peux voir que dans les deux cas, il s'agit de 4 octets.


Tous les bits à 1 sur mon masque définissent mon NetID en se superposant aux bits correspondant de mon adresse IP. Les trois octets de gauche sont à 1 sur mon masque ce qui fait que les 3 octets de gauche de mon adresse IP constitue le NetID. Le dernier octet est laissé libre et constitue l'ensemble des adresses IP qui peuvent être allouées dans ce sous-réseau soit 10.0.0.0 à 10.0.0.255.

En revanche, deux adresses sont réservées : 10.0.0.0 qui constitue l'adresse réseau et 10.0.0.255 qui constitue l'adresse de broadcast qui sera utilisé quand les hôtes du réseau vont communiquer avec tous les hôtes qui constituent le réseau. De ce fait, ces adresses ne sont jamais attribuées.


Aussi, les plages d'adresses IP privées peuvent s'écrire en adressage CIDR :

  • 10.0.0.0/8

  • 172.16.0.0/12

  • 192.168.0.0/16


IPv6


Comme mentionné plus tôt, IPv6 est le successeur, ou en tout cas, doit être le successeur de IPv4. Si la base reste la même, plusieurs changements viennent avoir lieu avec IPv6 sur le fonctionnement global.


Différence majeur, il n'y a plus 32 bits mais 128 bits dans une adresse. Autre différence, il n'y a pas de représentation décimale mais une représentation hexadécimale de l'adresse.


Ainsi lorsqu'on écrite 10.0.0.10 en IPv4, une adresse IPv6 aura la forme suivante (exemple de Wikipédia) :


  • 2001:0db8:0000:85a3:0000:0000:ac1f:8001


Cette forme peut être simplifiée de la façon suivante en enlevant les 0 consécutifs et les 0 non significatifs :

  • 2001:0db8:0000:85a3:0000:0000:ac1f:8001 -> Retrait des 0 non significatifs

  • 2001:db8:0:85a3:0:0:ac1f:8001 -> Retrait des 0 consécutifs

  • 2001:db8:0:85a3:::ac1f:8001


Les adresses IPv6 sont décrites en différents types en fonction du rôle de l'adresse.


  • ::/8 adresses réservées

  • ::1/128 -> Adresse de bouclage. Equivalent du 127.0.0.1

  • 2000::/3 -> Monodiffusion mondiale : Adresse publique unique

  • fe80::/10 -> Adresse de lien local

  • fc00::/7 -> Adresses locales uniques équivalentes à 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16

  • ...


N'étant pas plus utilisé que ça aujourd'hui, je ne m'étendrais pas plus que ça sur IPv6, les principales informations nécessaires à la compréhension du protocole et sa différence avec IPv4 ayant été mentionné !











Comments


bottom of page