Cours["net"][1] = "IP Address"

Cours d'introduction sur le réseau IP.

Cours["net"][1] = "IP Address"
Photo by Christian Wiediger / Unsplash

Le réseau IP est un élément clé du fonctionnement d'Internet. Il permet à des milliards de terminaux de communiquer entre eux, en envoyant et en recevant des paquets de données. Sans le réseau IP, il serait impossible de naviguer sur le web, d'envoyer des e-mails, ou de regarder des vidéos en ligne.

Dans ce cours, nous allons étudier les bases du réseau IP. Nous allons voir comment les adresses IP sont utilisées pour identifier chaque dispositif connecté à Internet, et comment elles sont gérées et groupées pour permettre une communication efficace.

Ce cours s'adresse aux débutants qui souhaitent comprendre les fondamentaux du réseau IP. Nous allons voir des concepts simples, mais importants, qui vous permettront (je l'espère) de mieux comprendre le fonctionnement d'Internet et des réseaux locaux, et à l'avenir, je l'espère comment construire ce type de réseaux.

0x1 - Adress

Une adresse IP est un identifiant unique attribué à chaque dispositif connecté à Internet. Elle permet à ces terminaux de communiquer entre eux en envoyant des packets. Ces packets sont pour l'instant à notre niveau de simples données binaires, que l'on cherche à envoyer à un autre terminal via le réseau.

Comme son nom l'indique, une adresse, ressemble à adresse réelle, lorsque vous avez un packets (une lettre ou un colis dans le monde réel), vous y attachez une étiquette avec l'adresse de votre destinataire et vous le confiez au réseau (la poste ou votre transporteur).

Dans le monde réel, une adresse est composée d'un numéro, d'une rue, d'un code postal et d'un pays au minimum. En informatique, c'est un nombre binaire :  

Il existe deux versions d'adresse IP : IPv4 et IPv6.

IPv4

IPv4, d'une taille de 32 bits (4 octets) est la version la plus courante d'adresse et est toujours majoritairement utilisée de nos jours.

Pour plus de simplicité, il est possible de représenter cette adresse de 32 bits en 4 octets en base 10 (la manière dont nous comptons naturellement, par opposition au binaire pour les ordinateurs, est la base 2) et de les séparer par des points. Ces 4 octets forment alors des nombres et varient de 0 à 255. On obtient à la fin une adresse lisible par un humain de la forme XXX.XXX.XXX.XXX. Ex : 192.168.1.1, 8.8.8.8, 10.10.100.254

On peut donc créer environ 4.3 milliards d'adresses en version 4 (4 294 967 296 pour être exact). Bien que suffisant en 1981, lorsqu'elles ont été inventées, de nos jours ce nombre n'est plus suffisant. Beaucoup de techniques sont ainsi utilisées pour réduire l'utilisation de cet espace d'adresse.

IPv6

Une de ces solutions : la version 6 du protocole IP (ne me demandez pas où est passée la version 5, ils l'ont mangé, comme la version 9 d'un fameux système d'exploitation)

La version plus récente d'adresse, IPv6, est composée de 128 bits, soit 16 octets.
Il y a donc beaucoup beaucoup beaucoup d'adresses IPv6 possibles, suffisamment pour plusieurs planètes pour plusieurs siècles au minimum : ~3.4e38 adresses.

🪐
En comparaison, on estime qu'il y a cent milliards (100 000 000 000) d'étoiles dans notre galaxie. Vous pouvez donc avoir ~3.4e27 adresses IPv6 pour chaque système solaire dans notre galaxie

Pour représenter les adresses IPv6 en hexadécimal, on utilise 8 groupes de 16 bits (4 chiffres hexadécimaux chacun), séparés par des deux-points.
Par exemple, une adresse IPv6 valide pourrait être représentée comme 127a:508e:31b0:30:a:ec8:c3bb:d783

Comme ces adresses sont tellement nombreuses, il est courant d'avoir de larges parties à 0 : 127a:508e:31b0:0:0:0:0:1
On peut alors utiliser deux deux-points, pour indiquer ces parties : 127a:508e:31b0::1

C'est beaucoup plus gros qu'une IPv4 !

La transition vers l'IPv6 est toujours en cours, il est actuellement assez courant de supporter les deux simultanément.

Bien que le nombre d'IPv4 vienne à manquer, cela ne veut pas pour autant dire qu'elles vont disparaître. De nombreuses stratégies sont utilisés pour réduire le nombre d'adresses IPv4 nécessaires sur Internet. Nous en verrons certaines dans les prochains cours.

Attribution

Les adresses IP sont attribuées par les organisations régionales Internet (ORI), également connues sous le nom de registres Internet régionaux (RIR). Il en existe cinq dans le monde, chacun responsable d'une région géographique spécifique.

Liste des ORI/RIR

  • AfriNIC pour l'Afrique
  • APNIC pour l'Asie-Pacifique
  • ARIN pour l'Amérique du Nord
  • LACNIC pour l'Amérique latine et les Caraïbes
  • RIPE NCC pour l'Europe, le Moyen-Orient et certaines parties de l'Asie centrale

Une fois les adresses attribuée à un FAI, il est important de noter que ces dernières ne sont généralement pas attribuées de manière permanente aux clients.
Les FAI utilisent des techniques de gestion d'adresses IP pour allouer des adresses IP temporaires à leurs clients.

Cela permet de réduire le gaspillage d'adresses IP, au prix de devoir trouver des solutions pour "trouver" l'adresse que l'on cherche au cas où elle changerait. (Solutions que l'on étudiera dans de prochains cours).

Comprendre le fonctionnement des adresses IP est essentiel.
Gardez à l'esprit que ce ne sont, initialement, que des gros nombres binaires, qui permettent d'indiquer, à l'instar d'une adresse réelle, une destination virtuelle unique.

En cas de doute dans leur fonctionnement, passer en binaire sera toujours la solution. Cela est aussi vrai pour la partie suivante.

0x2 - Groups

Donner une adresse, c'est bien, acheminer notre packets vers cette adresse, c'est mieux.

Vous savez ce qui est encore mieux ? Le faire vite. Pour reprendre l'analogie avec la Poste, si le colis/lettre que votre grand-mère vous a envoyé depuis la ville voisine fais 40 fois le tour de la Terre avant de vous parvenir, il aurait été surement plus rapide que cette dernière marche jusque chez vous (la pauvre, a son âge, ça devrait être vous qui marchez jusque chez elle !).

On fait donc des groupes d'adresses selon leur emplacement géographique ou du fournisseur d'accès Internet qui les possèdent. Exactement comme pour la Poste, ou vous avez un groupe par pays, lui-même divisé en plus petites régions, puis en ville, en rue, et enfin en numéro de rue.

Maintenant comment on fait des groupes d'adresses ?

Imaginons que l'on travaille avec des IPv4 uniquement, dans un monde simplifié. Dans ce monde, il n'y a que 2 pays, chacun composés de 4 régions. Chacune de ces régions est composée de 8 villages, chacun composés de 16 maisons.

On décide d'attribuer toutes les IPv4 dont le premier octet est 1 au premier pays, et celles dont le premier octet est 2 au second pays (Pays 1 : 1.X.X.X ; Pays 2 : 2.X.X.X).Le second octet est choisi pour représenter la région (P1, R1 : 1.1.X.X ; P2, R3, 1.3.X.X), le troisième, le village et le quatrième la maison.

On veut désigner un groupe d'adresse, par exemple, toutes les adresses de la région 2, du pays 1. Cela compose donc toutes les adresses de la région 1.2.X.X.

On va donc dire à l'ordinateur de ne comparer que les deux premiers octets de notre adresse. Si les deux premiers octets d'une adresse quelconque sont les 1.2, l'adresse fait partie de notre réseau.

Pour désigner ce groupe de manières plus simple que "les deux premiers octets désignent le réseau", on utilise une notation particulière : la notation CIDR :

On met à 0 les emplacements qui peuvent changer dans l'adresse de notre réseau, et l'on rajoute un / puis le nombre de bits que l'ordinateur doit prendre en compte dans sa comparaison.

ℹ️
C'est pour cela que les adresses qui se terminent en .0 n'existent pas.
Bien que théoriquement possibles, ces adresses sont utilisées pour désigner des réseaux (et donc des groupes d'adresses). La première adresse possible se termine donc en .1

Pour notre exemple 1.2.X.X : on a deux octets à comparer = 2 x 8 = 16, on désigne donc ce réseau par 1.2.0.0/16

Autre exemple, désigner toutes les adresses de la première ville, de la première région du premier pays : 1.1.1.X
On est dans le cas où l'on compare les trois premiers octets. 3 x 8 = 24
Le réseau est donc 1.1.1.0/24

Cette notation à un avantage, dans l'exemple ci-dessus, nous avons utilisé la base 10 pour décider de nos groupes, nos "taille de réseau" après notre "/" sont donc logiquement des multiples de 8. Dans la réalité, rien n'empêche de diviser à des non multiples de 8.

Par exemple 1.1.1.240/28 contient toutes les adresses de 1.1.1.240 à 1.1.1.255

Pas sûr de vous pour ce /28 ? Ne vous inquiétez pas, en binaire tout prend son sens.

Pour comprendre cet exemple plus complexe, on va regarder comment un ordinateur compare le début de nos deux adresses.

Reprenons notre premier exemple en /16 : 1.2.0.0/16. On va demander à l'ordinateur de me dire si l'adresse 1.2.1.2 est dans le réseau, puis si l'adresse 1.3.0.1 est aussi dans le réseau. Pour ce faire, l'ordinateur va créer un masque, une seconde adresse qui contient 16 fois 1 à partir de la gauche, puis le reste à 0. (Dans le cas d'un /24, 24 fois 1, puis le reste à 0) :
/16 : 1111 1111 . 1111 1111 . 0000 0000 . 0000 0000
/24 : 1111 1111 . 1111 1111 .  1111 1111 . 0000 0000

ℹ️
Comme une adresse, un masque est généralement présenté sous sa forme en base 10 :
Un /16 (1111 1111 . 1111 1111 . 0000 0000 . 0000 0000) donne 255.255.0.0
Un /24 (1111 1111 . 1111 1111 . 1111 1111 . 0000 0000) donne 255.255.255.0
Un /28 (1111 1111 . 1111 1111 . 1111 1111 . 1111 0000) donne 255.255.255.240

Il est donc possible de désigner un réseau par son adresse et son masque ou son adresse et sa taille de masque (notation CIDR) :
1.1.0.0/16 est équivalent à 1.1.0.0 avec un masque de 255.255.0.0

Le rôle de ce masque est, comme son nom l'indique, de masquer une partie de l'adresse : 
Les ordinateurs sont particulièrement bons pour faire l'opération "ET" en binaire.
Si l'on donne à la machine une adresse, il peut utiliser l'opération ET entre l'adresse et le masque du réseau. Une fois qu'il aura obtenus cette adresse "masquée" il suffit de la comparer avec l'adresse du réseau, si elle est identique, le réseau est le même, si elle est différente, le réseau n'est pas le même.

Pour l'adresse 1.3.0.1, en revanche :

Elle n'appartient pas au réseau.

Comprenez donc que le masque peut-être 1111 1111 . 1111 0000 . 0000 0000 . 00000 (c'est un /12) et que rien ne l'oblige à être un multiple de 8.

Si cette notion de masque n'est pas encore très claire, entrainez-vous :

⚔️
Un /32 en IPv4 représente donc un groupe composé d'une seule adresse !

Maintenant que l'on a fait des groupes de réseaux, on peut commencer à planifier nos routes :

En partant du haut de cet arbre, il est facilement possible d'acheminer un colis vers sa destination finale.

Lorsqu'un packet arrive, que ça soit à une ville, région ou pays, il suffit de vérifier à quel groupe appartient son l'IP de destination et de l'envoyer vers le groupe auquel il appartient.

Dans la réalité, le monde n'est pas relié de manière aussi hiérarchique, la connexion ressemble beaucoup plus à un sac de nœuds qu'un bel arbre comme celui au-dessus :

Les groupes seuls ne sont alors plus vraiment suffisants lorsque nous sommes dans ce type de situation. Comment spécifier au bureau du Pays 1 qu'il faille passer soit par la Région 4 ou la Région 1 pour accéder à la Région 2 ? Comment lorsque comme ici, il y a plusieurs chemins possibles, choisir le plus rapide ? Comment, si un chemin est fermé temporairement, faire en sorte d'utiliser un chemin plus lent, mais ouvert ?

Facile de se perdre dans un monde aussi complexe que le nôtre
Toutes ces questions sont celles que vous devriez maintenant essayer de vous poser. Créez-vous un petit univers sur un tableau blanc/un cahier. Assignez-lui des adresses, dessinez votre monde sous forme de graphe, et arrivez aux mêmes problématiques.

Les IPv6, elles, fonctionnent d'une manière similaire, avec à la différence des IPv4, des tailles des masques qui peuvent aller jusqu'à /64 (face à /32 pour une IPv4)

Trop simple n'est-ce pas ?

0x3 - EOF

Premier cours terminé, un cours très théorique, mais nécessaire pour comprendre ce que nous allons voir dans les cours suivants. N'hésitez pas à vous abonner aux prochains cours avec le bouton en haut à droite, et à faire des retours dans les commentaires.

Comme toujours, vous pouvez retrouver la fiche résumée ici :