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.
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.
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.
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) :
function getAdresseReseau($adresseIP, $masqueRéseau) { ... }
array(192, 168, 0, 129)
.array(255, 255, 255, 0)
.return array($octet1, $octet2, $octet3, $octet4) ;
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(); ?>
où 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() :
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 :
$tab1==$tab2
).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) :
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é :
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.
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() :
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 :
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 ?
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 si le corps du
foreach
tient en une seule ligne,
et qu'il n'y a rien d'inutile.