Vous avez vu lors de la simulation d'un réseau, qu'en plus de l'IP de chaque machine, il fallait préciser le masque du sous-réseau à laquelle elle
appartenait.
A quoi correspond cette notion ?
On le rappelle, Internet n'est que la connexion entre eux de multiples plus petits réseaux ( on parle de sous-réseaux ), chacun ayant son propre
domaine de diffusion hors duquel ne "sortent" pas les données qui circulent, et qui sont donc indépendants les uns des autres : pour faire circuler les données d'un réseau à un autre,
il faut une machine spéciale ( un routeur ) pour "passer" de l'un à un autre.
Par contre, les machines sur un même sous-réseau peuvent directement communiquer les unes avec les autres.
Mais alors, il faudrait deux adresses IP pour identifier une machine donnée :
Or, l’adressage IP ne définit qu’une seule adresse IP par machine reliée à Internet. Cela semble insuffisant...
En réalité, non : il suffit de segmenter cette adresse en deux parties distinctes, l’une pour identifier le sous-réseau, et l’autre pour la machine elle-même.
C’est là où le masque entre en jeu, c’est lui qui joue le rôle de séparateur entre ces deux adresses.
Dans une adresse IP ( nous prendrons l'exemple d'une IPv4, mais tout restera valable pour des adresses IPV6 ), un certain nombre des bits qui la compose sont toujours les mêmes pour toutes les machines du sous-réseau : ce sont eux qui identifient le sous-réseau auquel elle appartient.
C'est le masque de sous-réseau qui permet de savoir quels sont ces bits.
Il est composé, comme l'adresse IP, de 4 octets, soit 32 bits.
Comme le masque définit tout le sous-réseau, il doit donc être le même pour tous les hôtes qui le composent. Il leur permettra de déterminer si une IP donnée appartient au même sous-réseau qu'eux ( et sera donc directement accessible ) ou pas.
Souvent, tous les bits d'un octet du masque sont à 1 ou à 0 : ces octets prennent donc les valeurs 0 ou 255 ( mais pas obligatoirement, voire exemples plus bas ).
172.174.96.2
avec un masque de sous-réseau 255.255.255.0
: en binaire, le masque s'écrit : 11111111.11111111.11111111.00000000
; les 3 x 8 = 24 bits de poids forts de l'adresse correspondent donc à la partie réseau ( soit 172.174.96.XX ), et les 8 bits de poids faible ( donc le dernier octet ) à la partie machine, ce qui fait donc 28 = 256 IP différentes qui peuvent exister sur ce sous-réseau : de 172.174.96.0
à 172.174.96.255
.92.16.96.2
avec un masque de sous-réseau 255.255.0.0
appartient à un réseau pour lequel les deux derniers octets correspondent à la partie machine de l'adresse, soit 256 x 256 = 65 536 IP différentes peuvent exister ( la dernière étant 92.16.255.255
).Une notation condensée du couple IP/masque existe, appelée notation CIDR ( = Classless Inter-Domain Routing ) : elle consiste à indiquer l'IP avec un "/" suivi du nombre décimal
de bits de poids fort identifiant le sous-réseau ( c'est à dire les bits des octets communs à toutes les adresses du sous-réseau ).
Pour les exemples précédents :
255.255.255.0
s'écrit en binaire : 11111111.11111111.11111111.00000000
soit 3 x 8 = 24 bits de poids fort; l'IP sera donc indiquée : 172.174.96.2/24
.
255.255.0.0
a 2 octets, soit 2 x 8 = 16 bits de poids fort; l'IP sera écrite : 92.16.96.2/16
( on remarque du coup qu'avec cette notation, il est très facile de connaître le nombre total d'IP que l'on peut avoir dans ce sous-réseau : chaque IPv4 faisant 32 bits, la différence permet de savoir le nombre de bits "libres", donc le nombre de valeurs différentes possibles. Pour le premier exemple ci-dessus, le nombre de bits "libres" est 32 - 24 = 8 → 28 = 256 IP différentes )
Parmi toutes les IP possibles dans un sous-réseau, deux ne peuvent être attribuées à des hôtes :
Le masque de sous-réseau est donc indissociable de l'adresse IP. Une adresse seule ne voudra rien dire puisqu’on ne saura pas quelle est la partie réseau et quelle est la partie machine. De la même façon, un masque seul n’aura pas de valeur puisqu’on n’aura pas d’adresse sur laquelle l’appliquer. L’adresse IP et le masque sont donc liés l’un a l’autre.
Il va falloir refaire un peu de binaire...ça n'est jamais mauvais !...
200.67.80.45
, avec le masque de sous réseau 255.0.0.0
.
192.168.16.5/21
( attention, moins facile ! ).
192.168.16.125
appartient-elle au même sous-réseau ? ( à vous de traduire "appartient au même sous-réseau"... )192.168.22.5
?0.0.0.0
?L'adresse d'un sous-réseau est ce qui permet à une machine de savoir si une autre est située sur le même sous-réseau qu'elle.
Rappel : les bits à 1 du masque de sous-réseau indiquent les bits de l'IP qui correspondent à la partie réseau ( et les bits à 0 indiquent la partie machine.)
On montre alors que pour déterminer l'adresse du sous-réseau, il suffit de faire une opération de ET logique entre l'IP et le masque.
Soit une machine d'IP 192.168.1.24
et de masque 255.255.255.0
.
On rappelle la table de vérité du ET logique :
A | B | A ET B |
---|---|---|
0 | 0 | 0 |
1 | 0 | 0 |
0 | 1 | 0 |
1 | 1 | 1 |
L'adresse de diffusion ( broadcast ) permet d'envoyer des messages à toutes les machines d'un sous-réseau.
Rappel : elle correspond à une IP avec tous les bits de la partie machine à 1.
On montre de même que, pour trouver l'adresse de diffusion du sous-réseau, il faut faire une opération de OU logique entre l'IP et le complément à 1 du masque; le complément à 1 du masque correspond au masque avec tous ses bits inversés : 0 → 1 et 1 → 0 .
Le complément à 1 du masque peut lui-même s'obtenir par une opération de OU EXCLUSIF entre le masque et la valeur 255.255.255.255
255.255.255.0
et la valeur 255.255.255.255
, montrer que le complément à 1 du masque est 0.0.0.255
192.168.1.24
et le complément à 1 du masque permet bien d'obtenir l'adresse de diffusion ( 192.168.1.255
)
On rappelle la table de vérité du OU et du OU EXCLUSIF logiques :
A | B | A OU B | A OU EXCLUSIF B |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 1 | 1 |
0 | 1 | 1 | 1 |
1 | 1 | 1 | 0 |
Écrire en Python une fonction adresse_sous_reseau
, qui :
Entrez l'IP sous la forme xxx.xxx.xxx.xxx : 192.168.1.24
Entrez le masque sous la même forme : 255.255.255.0
L'adresse du sous-réseau est : 192.168.1.0
Quelques indications :
split()
qui permet de séparer des "mots" dans une chaîne selon un caractère séparateur présent dans la chaîne.
octets = ip.split('.')
&
. Il peut très bien travailler avec des nombres en base 10, inutile de convertir en binaire au préalable !Vérifiez le bon fonctionnement de votre fonction avec les exemples précédents.
Écrire une fonction adresse_diffusion
, qui :
Entrez l'IP sous la forme xxx.xxx.xxx.xxx : 192.168.1.24
Entrez le masque sous la même forme : 255.255.255.0
L'adresse du sous-réseau est : 192.168.1.0
L'adresse de diffusion est : 192.168.1.255
Quelques indications :
|
. Il peut lui aussi très bien travailler avec des nombres en base 10, inutile de convertir en binaire au préalable !^
Vérifiez le bon fonctionnement de votre fonction avec les exemples du chapitre.