Réseaux
200.0.0.0
et l'adresse de diffusion 200.255.255.255
( respectivement première et dernière adresse )11111111.00000000.00000000.00000000
. Dans ce masque, 8 bits correspondent donc à l'adresse réseau. L'IP s'écrira donc en notation CIDR : 200.67.80.45/8
11111111.11111111.11111000.00000000
2 = 255.255.248.0
192.168.16.5
s'écrit en binaire : 11000000.10101000.00010000.00000101
. Pour trouver l'adresse du sous-réseau, on ne garde que les 21 bits de poids forts, et on met tous ceux de la partie adresse machine à 0,
soit : 11000000.10101000.00010000.000000002
= 192.168.16.0
192.168.34.12
= 11000000.10101000.00100010.00001100
soit une adresse de sous-réseau avec le même masque ( 21 premiers bits ) : 11000000.10101000.00100000.0000000
= 192.168.32.0
← n'appartient pas au même sous-réseau 192.168.22.125
= 11000000.10101000.00010110.01111101
soit une adresse de sous-réseau : 11000000.10101000.00010000.0000000
= 192.168.16.0
← appartient au même sous-réseau 0.0.0.0
correspond donc à "tous les bits de l'adresse appartiennent à la partie machine" : il n'y a pas de partie réseau, donc pas de sous-réseau. Il s'agit donc d'internet dans sa globalité !
11000000.10101000.00000001.00011000
ET 11111111.11111111.11111111.00000000
= 11000000.10101000.00000001.00000000 soit : 192.168.1.0, qui est bien l'adresse du sous-réseau.
( cela s'explique en remarquant que le ET logique ne "conserve" que les bits de l'IP de même position que ceux à 1 du masque; les autres bits de l'IP sont eux "forcés à zéro" par les bits à 0 du masque...)
def sous_reseau(ip: str, masque: str)->str:
"""
Fonction pour déterminer l'adresse d'un sous-réseau à partir d'une IP et du masque de sous-réseau
Entrée : 2 chaînes de caractères représentant l'IP et le masque sous la forme XXX.XXX.XXX.XXX
Sortie : une chaîne de caractère représentant l'adresse du sous-réseau sous la même forme
"""
ip = ip.split('.') # séparation dans une liste des 4 octets de l'IP
masque = masque.split('.') # séparation dans une liste des 4 octets du masque; attention ces deux listes contiennent encore des chaînes, pas des nombres !
sr = "" # chaîne vide qui contiendra l'adresse du sous-réseau
for i in range(0,4): # pour chacun des 4 octets de l'IP et du masque
et = int(ip[i]) & int(masque[i]) # opération ET logique entre les octets de même position après leur transtypage en entier
sr += str(et) + '.' # ajout de l'octet calculé ( après transtypage en chaîne ) à la chaîne 'sr'
return sr
def sous_reseau(ip, masque):
.............
return sr
ip = input("Entrez l'IPv4 sous la forme : XXX.XXX.XXX.XXX : ")
masque = input("Entrez le masque sous la même forme : ")
print("L'adresse du sous-réseau est :", sous-reseau(ip,masque)) # apppel de la fonction et affichage du résultat
11111111.11111111.11111111.00000000
XOR 11111111.11111111.11111111.11111111
= 00000000.00000000.00000000.11111111 qui correspond bien à tous les bits du masque inversés, soit : 0.0.0.255
11000000.10101000.00000001.00011000
OU 00000000.00000000.00000000.11111111
= 11000000.10101000.00000001.11111111 soit 192.168.1.255 qui est bien l'adresse de diffusion.
def diffusion(ip: str, masque: str)-> str:
"""
Fonction pour déterminer l'adresse de diffusion à partir d'une IP et du masque de sous-réseau
Entrée : 2 chaînes de caractères représentant l'IP et le masque sous la forme XXX.XXX.XXX.XXX
Sortie : une chaîne de caractère représentant l'adresse du sous-réseau sous la même forme
"""
ip = ip.split('.') # séparation dans une liste des 4 octets de l'IP
masque = masque.split('.') # séparation dans une liste des 4 octets du masque; attention ces deux listes contiennent encore des chaînes, pas des nombres !
for i in range(0,4): # pour chaque octet du masque
masque[i] = int(masque[i]) ^ 255 # calcul de son complément à 1 en faisant un OU EXCLUSIF entre l'octet ( transtypé en entier ) et 255
diff = "" # chaîne vide qui contiendra l'adresse de diffusion
for i in range(0,4): # pour chacun des 4 octets de l'IP et du complément à 1 du masque
ou = int(ip[i]) | masque[i] # opération OU logique entre les octets de même position après transtypage en entier ( sauf pour les éléments de la liste masque[], qui ont déja été précédemment transtypés )
diff += str(ou) + '.' # ajout de l'octet calculé ( après transtypage en chaîne ) à la chaîne 'sr'
return diff