Calculatrice IP
(2ème partie).
Réponse AJAX

Objectif de l'atelier.

Pour mieux comprendre les mécanismes IP, améliorer la calculatrice IP avec les fonctionnalités suivantes :

Remarque importante : ces améliorations sont à rajouter dans le fichier PHP du TP précédent, ce n'est pas un nouveau code.

Est-ce que deux adresses IP sont dans le même réseau IP ?

Initiation et exercices d'entraînement

Important, car c'est là-dessus qu'une machine se basera pour savoir si la requête doit être envoyée directement au destinataire ou si elle doit être envoyé à la passerelle. Quand vous faites une LAN chez les copains, vous devez vous assurer d'être tous dans le même réseau IP. Quand vous acheter un nouvel équipement (point d'accès, caméra IP) avec un IP préconfiguré en usine, vous devez être sûr d'être dans le même réseau IP que lui pour pouvoir vous y connecter et le configurer.

Comment faire pour savoir si deux machines sont dans le même réseau IP ? Il suffit de comparer la partie réseau de l'adresse, sans tenir compte de la partie hôte.

Est-ce que les adresses 192.168.0.129/26 et 192.168.0.193/26 sont dans le même réseau IP ? Justifiez la réponse. Pour les futurs réseaux, vous devrez notamment préciser l'adresse de réseau de chacune des deux adresses suivantes.

Votre réponse n°1

Est-ce que les adresses 192.168.0.33/27 et 192.168.0.62/27 sont dans le même réseau IP ? Justifiez la réponse.

Votre réponse n°2

Ecriture d'une fonction qui renvoie une adresse réseau à partir d'une adresse IP

Contrairement à la version précédente de la calculatrice, on ne va pas travailler avec des traitements de chaînes de caractères, mais avec des et arithmétiques (&), comme dans les vrais routeurs. Ceci vous aidera à mieux comprendre les mécanismes mis en oeuvre dans le routage (et les filtrages IP).

Dans une première étape, vous allez créer une fonction getAdresseReseau($adresseIP, $masqueRéseau) :

Ecrivez le corps de la fonction en utilisant le principe suivant :
octet n°i de l'adresse réseau = octet n°i de l'adresse IP & octet n°i du masque.
Dans l'idéal vous pouvez réaliser ça avec un foreach, mais vous pouvez également utiliser un for ou répéter 4 fois l'opération pour chacun des 4 octets.

Testez cette fonction en mettant, tout au début de la page PHP :
<?php print_r(getAdresseReseau(array(172,18,22,???), array(255, 255, 255, 0)); exit(); ?>
array(172,18,22,???) est l'adresse de votre machine au lycée. Vous devez obtenir comme résultat :
Array ( [0] => 172 [1] => 18 [2] => 22 [3] => 0 )

Collez ici le code de la fonction getAdresseReseau() :

Votre réponse n°3

Ecriture d'une fonction qui compare l'adresse réseau de deux adresses IP passées en paramètre

On va maintenant voir si deux adresses IP sont dans le même réseau IP.

Evidemment, dans ce traitement, vous utiliserez la fonction faite à l'étape précédente.

Ecrivez la fonction mêmeRéseau($adresseIP1, $adresseIP2, $masqueRéseau)

Le principe est simple :

Collez ici le code de la fonction mêmeRéseau() (cette réponse est éligible à la qualité de "réponse parfaite " si le corps de la fonction tient en une seule ligne et qu'il n'y a rien d'inutile) :

Votre réponse n°4

Ecriture du formulaire HTML qui permet de saisir facilement deux nouvelles adresses à comparer

En-dessous du formulaire du TP précédent, rédiger en HTML un nouveau formulaire qui permet de saisir 2 adresses IP et un masque de réseau au format normal (255.255.255.0 par exemple).

Le nom des champs est libre.

Faite le traitement PHP suivant : si le formulaire est validé, alors on affiche Les deux adresses sont dans le même réseau IP ou Les deux adresses ne sont pas dans le même réseau IP.

Collez ici le code HTML du formulaire et le traitement associé :

Votre réponse n°5

Quel est le plus grand masque commun à deux adresses IP ?

C'est utilisé par exemple par les administrateurs réseaux qui configurent des routeurs, et qui essaient de fusionner les règles de routage pour simplifier la table de routage.

Par exemple : si les paquets à destination de 172.18.22.0/24 et ceux à destination de 172.18.23.0/24 se voient appliquer la même règle de routage, alors il est inutile de rentrer deux règles dans le routeur (une pour chaque réseau).

On peut effectivement fusionner avec une règle unique à destination de 172.18.22.0/23, car 23 est le plus grand masque commun à ces deux adresses.

Pour répondre à cette question, une méthode est de convertir l'adresse en binaire et de compter le nombre de bits communs au début. Dans l'exemple ci-dessus :
172.18.22.0 = 1010 1100 . 0001 0010 . 0001 0110 . 0000 0000
172.18.23.0 = 1010 1100 . 0001 0010 . 0001 0111 . 0000 0000
La plus grande partie commune a été mise en évidence, on voit qu'elle tient sur 23 bits.

Quel est le plus grand masque de réseau commun à 172.18.213.12 et 172.18.218.47 ?

Votre réponse n°6

Ecrivez la fonction plusGrandMasqueCommun($adresseIP1, $adresseIP2) qui renvoie la taille du plus grand masque commun.

Une méthode simple consiste à

Collez ici le code PHP correspondant à la fonction plusGrandMasqueCommun() :

Votre réponse n°7

D'après une destination et une table de routage, quelle va être la route empruntée ?

Il s'agit maintenant de reproduire le fonctionnement des tables de routage. Heureusement, on a déjà fait la moitié du travail : c'est la fonction mêmeRéseau qui va servir à savoir quelle ligne de la table de routage va être appliquée.

Par exemple, si on veut atteindre la destination 74.18.22.7 avec la table de routage suivante :
table de routage
On alanyse la table depuis le bas vers le haut, en se posant à chaque fois la question : est-ce que la destination à atteindre (74.18.22.7) est dans le même réseau que la Destination réseau de la table de routage (255.255.255.255), d'après le Masque réseau inscrit dans la table de routage (255.255.255.255) ? La réponse est non, car mêmeRéseau($Destination_à_atteindre, $Destination_réseau, $Masque) renvoie faux.

On recommence avec l'entrée suivante de la table de routage, jusqu'à ce qu'on trouve l'entrée qui correspond (mêmeRéseau renvoie vrai).

Dans ce cas, quelle va être l'entrée de la table de routage qui va être appliquée pour atteindre cette destination ?

Votre réponse n°8

On va maintenant programmer la fonction PHP getRoute($table_de_routage, $adresseIP_à_atteindre).

En php, créez la table de routage qui est tout simplement un tableau de tableaux de tableaux, sur le schéma suivant :

Ecrivez la fonction PHP getRoute($table_de_routage, $adresseIP_à_atteindre), qui renvoie la route à utiliser. Vous y parcourerez les routes avec un foreach :

Cette réponse est éligible à la qualité de réponse parfaite parfaite si le corps du foreach tient en une seule ligne, et qu'il n'y a rien d'inutile.

Votre réponse n°9