# Les réseaux informatiques/Les masques de sous-réseau

Dans le chapitre précédent, nous avons vu que toute adresse IP est subdivisée en deux portions : un préfixe réseau qui indique dans quel réseau/sous-réseau se situe l'ordinateur, et un suffixe hôte qui indique de quelle est la place de l'ordinateur dans le dit réseau. On peut se demander comment est fait ce découpage, comment on sait que telle IP se décompose ainsi. C'est le but de ce chapitre que de vous expliquer comment on sait quelle portion d'une adresse est le préfixe réseau et l'autre le suffixe hôte. De plus, nous allons voir comment les administrateurs réseaux font pour configurer l'adresse IP ainsi, comment ils configurent la séparation entre préfixe et suffixe lors de l'installation d'un réseau. Tout cela est réalisé par ce qu'on appelle un masque de sous-réseau.

## Les classes d'adresse IP

Historiquement, la première méthode utilisée pour séparer suffixe et préfixe se basait sur un cadre assez rigide. On ne pouvait placer la démarcation qu'à des endroits bien précis : les seuls préfixes réseaux autorisés avaient une taille de 1 octet, 2 octets et 3 octets. Les premiers bits de l'adresse IP indiquaient la taille du préfixe réseau, la position de la démarcation. Ce mécanisme, inventé par les concepteurs du protocole IP, est appelé l'adressage par classes d'adresses IP. Une classe est un ensemble d'adresses IP défini par un même préfixe réseau. Il en existe cinq types : A (préfixe de 1 octet), B (préfixe de 2 octets), C (préfixe de trois octets), D (adresse multicast) et E (usage réservé, inutilisé).
La taille de chaque classe, les intervalles et nombres d'IP sont indiqués ci-dessous. Les intervalles de chaque classe n'ont pas été choisis au hasard, pas plus que leur nombre d'adresses. Vous remarquerez que chaque classe contient un nombre d'adresse qui est une puissance de deux, sans compter que les intervalles en sont des multiples. Tout cela fait que les premiers bits d'une adresse permettent d'identifier sa classe facilement : il y a une correspondance directe entre les premiers bits et la classe d'une IP.
| Classe | Intervalle d'adresses IP | Nombre d'adresses |
| Classe A | 0.0.0.0 - 127.255.255.255 | 16 777 214 adresses. |
| Classe B | 128.0.0.0 - 191.255.255.255 | 65 534 adresses. |
| Classe C | 192.0.0.0 - 223.255.255.255 | 254 adresses. |
| Classe D | 224.0.0.0 - 239.255.255.255 | |
| Classe E | 240.0.0.0 - 255.255.255.255 | |
Cette organisation n'était pas très souple et gâchait pas mal d'adresses IPv4. Imaginez le cas d'une entreprise qui a besoin de 1024 adresses, pour 1024 machines : on lui donnait une adresse de classe B pour son réseau, à savoir 65536 adresses. Il est évident que la quasi-totalité des adresses de ce réseau sont alors inutilisées.
La taille du réseau doit être choisie dans quelques classes de taille fixe et pré-déterminée : on ne peut pas choisir un intervalle d'adresses le plus proche possible du nombre de machines utilisées. Ce fait ne posait pas de problèmes au début des réseaux IP, mais il a commencé à prendre de plus en plus d'ampleur avec le temps. En août 1990, le problème a été soulevé lors de la réunion de l'IETF, un organisme de normalisation qui gère notamment IP. Divers groupes de travail se sont rassemblés et ont commencé à réfléchir sur le sujet. La première solution, le sub-netting, est apparue dès 1985. La seconde solution technique, apparue en novembre 1992 dans une réunion de l'IESG, est encore en vigueur aujourd'hui (2021).
Avec le sub-netting, il est devenu possible d'utiliser une classe d'adresse complète pour plusieurs réseaux distincts. Prenons par exemple une entreprise qui dispose de quatre réseaux distincts, contenant chacun respectivement 5000, 4000, 2000 et 6000 machines. Avec l'adressage par classe strict, il faudrait donner à chaque réseau un préfixe réseau de classe B, soit 65535 adresses différentes. Or, ces 65535 adresses suffisent à elles seules pour les quatre réseaux, mais l'adressage par classe strict ne le permet pas. C'est ce genre de problème que permet de résoudre le sub-netting : il permet de découper une classe d'adresse en sous-classes indépendantes. La classe d'adresse A/B/C correspond à un réseau complet, tandis que chaque sous-classe correspondra à ce qu'on appelle un sous-réseau. Pour cela, le suffixe hôte de l'adresse est découpé en deux morceaux : un qui identifie le sous-réseau et l'autre qui identifie la machine dans le sous-réseau. Le sub-netting permet de définir le partage en spécifiant le nombre de bits pour le sous-réseau, les bits restant étant utilisés pour la machine. C'est à l'administrateur réseau de l'entreprise ou de l'administration que revient la définition de cette configuration.

## L'adressage CIDR

De nos jours, ces classes de réseaux ont laissé la place à un système plus souple : l'adressage Classless Inter-Domain Routing (CIDR). Avec cette méthode, on peut découper une adresse en identifiant hôte et préfixe réseau où l'on veut dans l'adresse. Cela résout le problème de l'adressage par classe : on peut mettre juste ce qu'il faut d'adresses dans le réseau (à peu près, on va dire). La subdivision de l'adresse en préfixe réseau et suffixe hôte est indiquée par un masque de sous-réseau, un nombre entier de la même taille que l'IP. Si on superpose le masque et l'IP, on peut deviner le préfixe réseau et le suffixe hôte : les bits à 1 dans le masque indiquent les bits du préfixe réseau, alors que les bits à 0 indiquent le suffixe hôte. Dit autrement, on obtient l'adresse réseau en faisant un ET logique entre l'IP et le masque.
Ce masque n'a pas besoin d'être envoyé dans les paquets de données, en même temps que l'IP. En effet, ce masque sert à savoir si une adresse IP appartient à un réseau local. Quand la donnée est transférer de proche en proche sur le net, chaque réseau local va tester si l'IP qu'il vient de recevoir correspond à une de ses machines. Pour cela, il a besoin du masque, pour vérifier si L'IP et celle du réseau local ont le même préfixe réseau : si ce n'est pas le cas, la machine n'appartient pas au réseau, et elle est routée ailleurs.

### La validité d'un masque de sous-réseau

Un masque valide doit respecter deux contraintes : les bits à 1 sont tous contiguës et regroupés dans les bits de gauche. Ce qui fait qu'un masque doit ressembler à quelque chose dans le genre :
* 11111111 11111111 11111111 00000000 ;
* 11111111 11111000 00000000 00000000 ;
* 11111111 11111111 11111111 11110000.
On peut facilement déduire des contraintes sur le masque les 3 règles suivantes :
* seuls les octets suivants sont valides pour un masque de sous-réseau :
** 255 (1111 1111) ,
** 254 (1111 1110) ,
** 252 (1111 1100) ,
** 248 (1111 1000) ,
** 240 (1111 0000) ,
** 224 (1110 0000) ,
** 192 (1100 0000) ,
** 128 (1000 0000) ,
** et 0 (0000 0000) ;
* Un nombre autre que 0 ne peut être précédé que de nombres valant 255 ;
* Un nombre autre que 255 ne peut être suivi que de nombres valant 0.

### Les notations des masques de sous-réseau

On peut noter ces masques de plusieurs manières équivalentes :
* soit on écrit le masque en binaire ;
* soit on écrit chaque octet en décimal et on les sépare par des points (cela permet de gagner de la place) ;
* soit on indique le nombre de bits à 1 dans le masque, précédé d'un "/" (les contraintes vues juste avant permettent alors de retrouver le masque facilement).
Par exemple, les notations suivantes sont équivalentes (c'est le même masque) :
* 11111111 11111111 11111111 00000000 ;
* 255 . 255 . 255 . 0 ;
* /24.
De même pour :
* 11111111 11111111 00000000 00000000 ;
* 255 . 255 . 0 . 0 ;
* /16.
De même pour :
* 11111111 11100000 00000000 00000000 ;
* 255 . 224. 0 . 0 ;
* /11.