Calcul des masques de sous réseaux

Calcul des masques de sous réseaux

1 – Calcul du masque en ligne

Saisie de l'IP :

Saisie du masque :

2 – Fonction de calcul de masque de sous réseaux

Cette outil vous permettra de calculer, en fonction du masque de sous réseaux de votre choix, la plage IP disponible. L’outil vous indiquera en plus, la première adresse disponible ainsi que la dernière.

3 – Suivi du développement

3.1 – Problème restant

3.2 – RoadMap

  • Saisir l’adresse de début et de fin et calculer le masque.

3.3 – Suivi du projet

  • V1.2
    Optimisation du code par Pascal de Serveurperso.com en remplaçant le case par une seule ligne.
  • V1.1
    Addition d’une adresse IP à une constante grâce à la méthode suivante : Conversion de l’IP (chaîne) en inetaddr grâce à la commande ip2long(), puis addition de +1 par exemple et retour à la chaîne avec la fonction inverse long2ip().
    Traitement des cas particulier /31 et 32 pour faire apparaître les bon résultat (N/A par exemple).
  • V1.0
    Création du formulaire de saisie.
    Création du script basé sur le squelette whois.php.
    Calcul du nombre d’host grâce à $calcul_host=pow(2,32-$calcul_mask)-2; signifiant 2 Exposant (32-masque), le tout -2 car on retire le réseau et le broadcast.
    Vérification des champ de saisie.

4 – Code source

<?PHP

// ********************************************
// Affichage de l'entete html
// ********************************************
echo
    '
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
    <head>
    <LINK REL="StyleSheet" HREF="../style.css" TYPE="text/css">
    <title>FrameIP, Pour ceux qui aiment IP - Script Masque</title>
    <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <META NAME="AUTHOR" CONTENT="www.frameip.com">
    <META NAME="COPYRIGHT" CONTENT="Copyright (c) 2003 by framip">
    <META NAME="KEYWORDS" CONTENT="masque, ip, classe, A, B, C, D, E, 255, 0, 128, bits, binaire, routeur, wan, reseaux, lan, comaraison, adresse, segment, convertion, hote, passerelle, route, calcul, sousreseau">
    <META NAME="DESCRIPTION" CONTENT="Frameip, pour ceux qui aiment IP - Script Masque">
    <META NAME="ROBOTS" CONTENT="INDEX, FOLLOW">
    <META NAME="REVISIT-AFTER" CONTENT="1 DAYS">
    <META NAME="RATING" CONTENT="GENERAL">
    <META NAME="GENERATOR" CONTENT="powered by frameip.com - webmaster@frameip.com">
    </head>
    <body>
    ';

// ********************************************
// Initiation des variables
// ********************************************
$calcul_adresse_ip=$_POST['IP'];
$calcul_mask=$_POST['MASK'];

// **********************************************
// Récupération de la date et heure
// **********************************************
$annee=date("Y");
$mois=date("m");
$jour=date("d");
$heure=date("H");
$minute=date("i");
$seconde=date("s");

// **********************************************
// Récupération de l'IP cliente
// **********************************************
$ip_client=getenv("REMOTE_ADDR");

// **********************************************
// Récupération du Ptr de l'IP cliente
// **********************************************
$ptr=gethostbyaddr("$ip_client");
if ($ptr==$ip_client)
$ptr="Pas de ptr";

// **********************************************
// Récupération du port TCP source
// **********************************************
$port_source=getenv("REMOTE_PORT");

// **********************************************
// Récupération de l'IP du browser
// **********************************************
$ip_browser=getenv("HTTP_X_FORWARDED_FOR");

// ********************************************
// Validation du champs IP
// ********************************************
$calcul_inetaddr=ip2long($calcul_adresse_ip);
$calcul_adresse_ip=long2ip($calcul_inetaddr);

// ********************************************
// Vérification de la saisie
// ********************************************
$erreur=0; // Initialisation
if (($calcul_inetaddr==0)||($calcul_inetaddr==-1))
    masque_erreur(1);
if (($calcul_mask<1)||($calcul_mask>32))
    masque_erreur(2);

// ********************************************
// Conversion du masque
// ********************************************
// Optimisation fournit par Pascal de Serveurperso.com
$calcul_chaine_mask = (string) long2ip(256*256*256*256 - pow(2, 32 - $calcul_mask)); 

// ********************************************
// Calcul du nombre de HOST
// ********************************************
if ($calcul_mask==32)
    $calcul_host=1;
else
    $calcul_host=pow(2,32-$calcul_mask)-2;

// ********************************************
// Calcul de la route
// ********************************************
$calcul_route=$calcul_inetaddr&ip2long($calcul_chaine_mask); // Ajoute l'IP et le masque en binaire
$calcul_route=long2ip($calcul_route); // Convertit l'adresse inetaddr en IP

// ********************************************
// Calcul de la premiere adresse
// ********************************************
if ($calcul_mask==32)
    $offset=0;
else
    $offset=1;

if ($calcul_mask==31)
    $calcul_premiere_ip="N/A";
else
    {
    $calcul_premiere_ip=ip2long($calcul_route)+$offset;
    $calcul_premiere_ip=long2ip($calcul_premiere_ip);
    }

// ********************************************
// Calcul de la dernière adresse
// ********************************************
if ($calcul_mask==32)
    $offset=-1;
else
    $offset=0;

if ($calcul_mask==31)
    $calcul_derniere_ip="N/A";
else
    {
    $calcul_derniere_ip=ip2long($calcul_route)+$calcul_host+$offset;
    $calcul_derniere_ip=long2ip($calcul_derniere_ip);
    }

// ********************************************
// Calcul du broadcast
// ********************************************
if ($calcul_mask==32)
    $offset=0;
else
    $offset=1;
$calcul_broadcast=ip2long($calcul_route)+$calcul_host+$offset;
$calcul_broadcast=long2ip($calcul_broadcast);

// ********************************************
// Présentation des résultats
// ********************************************
echo '
    <p align="center">
        <font size="4" color="#008000">
            <b>
                Masque de sous réseaux
            </b>
        </font>
    </p>
    ';

echo '
    <table border="0" width="100%" id="table1">
        <tr>
            <td width="50%" align="right"><b>Les saisies</b></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td width="50%" align="right">Adresse IP :</td>
            <td>'.$calcul_adresse_ip.'</td>
        </tr>
        <tr>
            <td width="50%" align="right">Masque de sous réseau :</td>
            <td>'.$calcul_mask.'</td>
        </tr>
        <tr>
            <td width="50%" align="right">&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td width="50%" align="right"><b>Les résultats</b></td>
            <td>&nbsp;</td>
        </tr>
        <tr>
            <td width="50%" align="right">Masque de sous réseau :</td>
            <td>'.$calcul_chaine_mask.'</td>
        </tr>
        <tr>
            <td width="50%" align="right">Nombre maximum d\'hôte :</td>
            <td>'.$calcul_host.'</td>
        </tr>
        <tr>
            <td width="50%" align="right">L\'adresse de réseau (La route) :</td>
            <td>'.$calcul_route.'</td>
        </tr>
        <tr>
            <td width="50%" align="right">Première adresse d\'hôte :</td>
            <td>'.$calcul_premiere_ip.'</td>
        </tr>
        <tr>
            <td width="50%" align="right">Dernière adresse d\'hôte :</td>
            <td>'.$calcul_derniere_ip.'</td>
        </tr>
        <tr>
            <td width="50%" align="right">Adresse de broadcast :</td>
            <td>'.$calcul_broadcast.'</td>
        </tr>
    </table>
    ';

// ********************************************
// Fin du script général
// ********************************************
fin_du_script();

// ********************************************
// Fonction d'affichage de l'erreur de saisie
// ********************************************
function masque_erreur($erreur) // $erreur représente le numéro d'erreur.
    {
    // ********************************************
    // Affichage de titre d'erreur
    // ********************************************
    echo
        '
        <p align="center">
            <b>
                <font size="5" color="#008000">
                    Erreur
                </font>
            </b>
        </p>
    ';
    echo "<BR>";

    // ********************************************
    // Message personnalisé
    // ********************************************
    switch ($erreur)
        {
        case 1:
            echo'Le calcul ne peux pas avoir lieu car le champ IP est vide ou non valide.';
        break;
        case 2:
            echo'Le calcul ne peux pas avoir lieu car le champ MASK est vide ou non valide.';
        break;
        }

    // ********************************************
    // Fin du script général
    // ********************************************
    fin_du_script();
    }

function fin_du_script()
    {
    // ********************************************
    // Affiche de l'Url
    // ********************************************
    echo '
        <p align="right">
            <a href="http://www.frameip.com">
                www.frameip.com
            </a>
        </p>
        ';

    // ********************************************
    // Fin de la page Html
    // ********************************************
    echo
        '
        </body>

        </html>
        ';

    // ********************************************
    // Fin du script général
    // ********************************************
    exit(0);
    }

?>

5 – Les vidéos

  • 5.1 - What is IPv4 exhaustion ? Vidéo en Anglais

    Cette video en anglais vous présente qu'est ce que l'épuissement des adresses IPv4. Unfortunately we are running out of IP version 4 (IPv4) addresses. There are a variety of reasons for this, and a variety of solutions that help address parts of the problem. But the real solution is a slow migration toward IP version 6 (IPv6) which provides a lot more addresses.

    What is IPv4 exhaustion ?

6 – Suivi du document

Création et suivi de la documentation par _SebF

7 – Discussion autour du calcul des masques de sous réseaux

Vous pouvez poser toutes vos questions, faire part de vos remarques et partager vos expériences à propos du calcul des masques de sous réseaux. Pour cela, n’hésitez pas à laisser un commentaire ci-dessous :

Commentaire et discussion

11 commentaires sur la page : “Calcul des masques de sous réseaux”

  1. Je crois que j’ai réussi à faire le même algo pour IPv6 :

    // Merci à « f dot wiessner at smart-weblications dot net » de php.net
    function ip2long6($ipv6) {
    $ip_n = inet_pton($ipv6);

    $ipv6long = «  »;
    $bits = 15;
    while($bits >= 0) {
    $bin = sprintf(« %08b », ord($ip_n[$bits]));
    $ipv6long = $bin.$ipv6long;
    $bits–;
    }

    return gmp_strval(gmp_init($ipv6long, 2), 10);
    }

    $ipv6 = « 2a01:cb00:f14:6500::2 »;
    echo « IPv6: $ipv6 »;

    $ipv6long = ip2long6($ipv6);
    echo « IPv6 long: $ipv6long »;

    $cidr = « 2a01:c000::/19 »;
    echo « CIDR: $cidr »;

    $pos = strpos($cidr, « / »);
    $network = substr($cidr, 0, $pos);
    echo « Network: $network »;

    $netlong = ip2long6($network);
    echo « Network long: $netlong »;

    $mask = substr($cidr, $pos + 1);
    echo « Mask: $mask »;

    $maskbin = str_repeat(« 1 », $mask);
    echo « Mask bin: $maskbin »;

    $masklong = gmp_init($maskbin, 2);
    echo « Mask long: $masklong »;

    //$long128 = gmp_add(gmp_init(str_repeat(« 1 », 128), 2), 1);
    $long128 = « 340282366920938463463374607431768211456 »;
    $masktest = gmp_sub($long128, gmp_pow(2, 128 – $mask));

    if(gmp_and($ipv6long, $masktest) == gmp_and($netlong, $masktest))
    echo « Match! »;

  2. Je crois avoir vue un bug dans le calculateur d’adresse IP.
    En sortie, l’adresse de réseau est identique à l’adresse IP rentrée :

    Les saisies

    Adresse IP : 10.10.10.200
    Masque de sous réseau : 30

    Les résultats

    Masque de sous réseau : 255.255.255.252
    Nombre maximum d’hôte : 2
    L’adresse de réseau (La route) : 10.10.10.200
    Première adresse d’hôte : 10.10.10.201
    Dernière adresse d’hôte : 10.10.10.202
    Adresse de broadcast : 10.10.10.203

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *