Les réseaux, c'est aussi beaucoup d'algorithmes : pour le routage, pour la détermination des IP, la correction des erreurs, etc...
Voici quelques petites activités en Python autour des réseaux.
On rappelle que 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.
Comment trouver cette adresse ? Rappelez-vous comment ça marche : les bits de poids fort à 1 du masque de sous-réseau indiquent les bits de l'IP qui correspondent à la partie réseau ( et les bits de poids faible à 0 indiquent la partie machine.)
On montre alors facilement que pour déterminer l'adresse du sous-réseau, il suffit de faire une opération de ET logique octet par octet entre l'IP et le masque.
192.168.1.24
et le masque 255.255.255.0
permet bien d'obtenir l'adresse du sous-réseau ( 192.168.1.0
); penser pour cela à travailler en binaire !
192.168.1.24 ET 255.255.255.0 = 192.168.1.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 |
sous_reseau(ip, masque)
, 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 !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 octet par octet 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
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 |
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
) ( penser à travailler en binaire ! )diffusion(ip, masque)
, 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 !^
Vous avez décodé une trame Ethernet à la main....plutôt fastidieux, non ? Et encore, c'était une trame simple !!
Pour une trame contenant des données, comme celle dans ce fichier, nous allons faire faire ce décodage par un ordinateur, qui est beaucoup plus performant pour ce genre de travail "bête et méchant"...
La première chose à faire sera d'extraire les données du fichier texte ci-dessus, de façon à récupérer les octets sous forme d'une liste de chaînes de caractères, chaque élément de la liste correspondant à un des octets.
→ écrire une fonction extraire_octets(fichier)
, qui :
Quelques indications :
\n
), non imprimable mais quand même présent dans le fichier : il faudra donc le
retirer de chaque ligne, ce qui s'effectue avec la fonction rstrip()
:
chaine = chaine.rstrip('\n')
split()
déja vue précédemment pour séparer les octets de chaque ligne; quel est le caractère séparateur ici ?
def extraire_octets(fichier) :
............
return liste_octets
octets = extraire_octets('trame.txt')
print(octets)
>>> ['00', '24', 'd4', '78', '74', '23', '50', 'e5', ............]
Au cas où vous n'arriviez pas à faire cette tâche, voila le fichier Python avec la liste déja construite, ce qui vous permettra de continuer l'activité.
Vous allez maintenant compléter le programme principal, de façon à ce que le script affiche, dans le format adapté à chaque information :
C'est un travail laborieux mais pas très compliqué : il suffit d'indiquer dans le script "où" dans la liste des octets se trouvent les données qui nous intéressent...
Quelques indications :
split()
, permet de construire une chaîne à partir des éléments d'une liste, la méthode join()
; elle permet de préciser le caractère à intercaler entre chaque "mot"
de la chaîne de caractères.
chaine = ':'.join(liste_mots)
chr(code_ascii)
permet d'obtenir le caractère correspondant à un code ASCII.Voila si tout fonctionne les informations qui doivent s'afficher :
MAC destination 00:24:d4:78:74:23
MAC source : 50:e5:49:67:3d:dd
Version IP : IPv4
IP source : 192.168.1.35
IP destination : 212.27.63.106
Port source : 51738
Port destination : 80
GET / HTTP/1.1
Host: nsivaugelas.free.fr
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:75.0) Gecko/20100101 Firefox/75.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: fr-FR
Accept-Encoding: gzip, deflate
Connection: keep-alive
Upgrade-Insecure-Requests: 1
If-Modified-Since: Sun, 01 Dec 2019 20:45:39 GMT
If-None-Match: "11943c6d1-58a-5de42673"
Cache-Control: max-age=0
( Vous avez bien entendu reconnu la requête HTTP d'un client vers le serveur Free de la page nsivaugelas...)