Calculer un masque réseau
Appliquer un ET bit à bit entre adresse IP et masque pour retrouver le réseau.
Pourquoi « les trois premiers nombres » ?
La leçon précédente lisait 192.168.1.10/24 intuitivement : « les trois premiers nombres désignent le réseau ». Ici, nous refaisons le même calcul en binaire, pour comprendre d'où vient cette règle au lieu de l'apprendre par cœur. L'outil est l'opérateur & (ET bit à bit) vu avec les portes logiques.
Vous réutiliserez ce calcul chaque fois qu'une application ne parvient pas à joindre un service : il dit si la destination est sur le réseau local ou s'il faut passer par une passerelle.
Objectifs
À la fin de cette leçon, vous saurez :
- calculer un ET bit à bit entre adresse IP et masque pour retrouver le réseau ;
- expliquer pourquoi
255.255.255.0et/24sont la même chose vue en binaire ; - manipuler tout cela en JS et en shell.
🔗 Leçon précédente dans ce chapitre : adresses, masques et réseaux locaux · Prérequis : le binaire et les bits · portes logiques
Bits sur le fil
Que vous envoyiez une requête HTTP ou une image, le réseau transporte des suites d'octets dans des paquets (voir la première leçon de ce chapitre). Les différents supports transmettent ces bits par des signaux électriques, lumineux ou radio. IP fournit les adresses ; TCP peut apporter ordre et fiabilité.
Le masque réseau : un ET bit à bit
Reprenons 192.168.1.10/24, que la leçon précédente lisait intuitivement ("les 3 premiers nombres"). En binaire :
IP 192.168.1.10 = 11000000.10101000.00000001.00001010
Masque /24 = 11111111.11111111.11111111.00000000 (= 255.255.255.0)
──────── 24 bits à 1 ──────── 8 bits à 0
AND bit à bit ↓
Réseau = 11000000.10101000.00000001.00000000 = 192.168.1.0
Hôte (part machine) = 00000000.00000000.00000000.00001010 = 10
Règle : 1 AND 1 = 1, sinon 0. Le masque "garde" les bits réseau, "efface" les bits hôte. Changez de masque, le réseau change :
Même IP, masque /16 = 255.255.0.0 = 11111111.11111111.00000000.00000000
Réseau = 192.168.0.0 (deux premiers octets seulement)
C'est pourquoi la question « même réseau ? » dépend du masque. Deux adresses dont le résultat IP AND masque est identique appartiennent au même sous-réseau pour ce masque. Ce calcul aide une machine à décider si la destination est directement joignable sur son réseau local ou s'il faut passer par une passerelle ; il ne suffit pas, à lui seul, à garantir que la communication fonctionnera.
Par exemple, depuis 192.168.1.10/24, une destination 192.168.1.200 donne aussi le réseau 192.168.1.0 : la machine cherchera à la joindre sur le réseau local. 192.168.2.10 donne 192.168.2.0 avec le même masque : il faut normalement passer par une passerelle.
Faites-le en JS — c'est exactement l'opérateur & de la leçon sur les portes :
function ipToInt(ip) {
return ip.split(".").reduce((acc, oct) => (acc << 8) + Number(oct), 0) >>> 0;
}
function intToIp(n) {
return [n >>> 24, (n >>> 16) & 255, (n >>> 8) & 255, n & 255].join(".");
}
function reseau(ip, prefix) {
const ipInt = ipToInt(ip);
const masque = prefix === 0 ? 0 : (0xffffffff << (32 - prefix)) >>> 0;
return intToIp(ipInt & masque);
}
reseau("192.168.1.10", 24) // "192.168.1.0"
reseau("192.168.1.10", 16) // "192.168.0.0"
reseau("10.0.5.200", 8) // "10.0.0.0"
ipToInt("255.255.255.0").toString(2).padStart(32,"0")
// "11111111111111111111111100000000" ← 24 uns puis 8 zéros
Observez : 255 = 11111111, 0 = 00000000. Le masque n'est qu'un entier 32 bits avec prefix uns à gauche.
Exercice guidé en shell (optionnel mais éclairant) :
ipcalc 192.168.1.10/24 # si installé : affiche réseau, broadcast, masque en binaire
# sinon : python3 -c "import ipaddress; print(ipaddress.ip_network('192.168.1.10/24'))"
Exercice
- Calculez à la main le réseau de
10.0.5.1/8: écrivez IP et masque en binaire, faites le AND, reconvertissez. - Avec la fonction
reseauci-dessus, vérifiez :192.168.1.10/24vs192.168.1.200/24même réseau ? Et192.168.1.10/16vs192.168.2.10/16? - Question de synthèse : pourquoi la leçon précédente pouvait-elle écrire "
/24= les trois premiers nombres" sans mentir, et que manquait-il pour le comprendre vraiment ?
Résumé
- Adresse IP = entier 32 bits, masque =
prefixuns à gauche, réseau = IPANDmasque. /24"trois premiers nombres" n'est que la lecture décimale de "24 bits à 1" — le binaire lève la magie.
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Exercice 1. 10.0.5.1 = 00001010.00000000.00000101.00000001, masque /8 = 11111111.00000000.00000000.00000000 (255.0.0.0). AND = 00001010.00000000.00000000.00000000 = 10.0.0.0. C'est le réseau.
Exercice 2.
reseau("192.168.1.10",24) // "192.168.1.0"
reseau("192.168.1.200",24) // "192.168.1.0" → même réseau
reseau("192.168.1.10",16) // "192.168.0.0"
reseau("192.168.2.10",16) // "192.168.0.0" → même réseau aussi en /16 (deux premiers octets identiques)
Exercice 3. "/24 = trois premiers nombres" est vrai car 24 bits = 3×8 bits = 3 octets complets, donc le masque 255.255.255.0 garde exactement les trois premiers octets. Ce qui manquait était la cause : comprendre que 255 = 11111111 et que le masque est un ET binaire qui "garde/efface" des bits — sans binaire, la règle ressemble à une recette ; avec, c'est une opération que l'élève sait rejouer et généraliser à /16, /26, etc.