Les Forums

Les Forums

Les forums sont fermés. Ils restent présent pour consultation et archivage.
Vous pouvez désormais poser vos questions directement dans les commentaires en bas de chaque page du site.
Alors n'hésitez pas à participer

Calcul d'@ ip

bonjour,

voilà, je voudrais savoir suivant une ip donné, du quantième réseau il s'agit.
c'est pas clair ? bon un exemple simple:

192.168.0.130/24 ici la machine est la deuxième machine (130) du réseau (128) ! ok

bon mais comment calculer facilement un exemple qui parrait complexe comme celui ci

15.200.56.197/8 ?

Y'a t'il une astuce pour trouver rapidement le quantième réseau ?

si qq'un a une piste de réflexion même incomplete qu'il ne se gène surtout pas


a+

ou deuxième machine du sous-réseau 192.168.0.128/26. Donc cela dépend de la masque de sous-réseau. Si vous voulez pour n'importe laquelle, ouff, je ne voir pas d'autre moyen que de calculer.

Dans l'exemple 15.200.56.197/8:
- si l'on prendre une masque sous-réseau de 16bits (255.255.0.0), la machine sera la ((56*256)+197=) 14533ème du 201ème sous-réseau.
- si l'on prendre une masque sous-réseau de 12 bits (255.240.0.0), il y aura 16 sous-réseaux, et la machine est dans le 13ème (12 est le résultat de 200 div 16, plus un car le quantième de sous-réseau commence à 1, pas 0). Son quantième dans ce dernier est de *256*256+56*256+197 = 538821 (8 est résultat de 200 mod 16).

On poura trouver un algorithme et créer un script pour calculer, mais à coup de tête, je ne peux pas 😉

/*rectif du 26/02/2006:
- la machine est dans le 13ième sous-réseau
- 8 est résultat de 200 mod 16
*/
/* rectif du28/02/2006:
- 14533ème du 201ème sous-réseau
*/
Euh, si je puis me permettre, /8 décrit un masque 255.0.0.0 😀

Ceci dit, il exist un petit logiciel (subnet calc de mémoire) qui permet justement de voir dans quel segment se trouve la machine.

Ce logiciel a une limite, il refuse le déclassage (une adresse commençant par 192 ne pourra exister que dans un masque de classe C ou B, mais si on travaille sur un masque classe A, le logiciel signale une erreur).

Sinon, un moyen simple est de se rappeler que 255 recopie la partie de l'adresse et pour les chiffres différents de 255 (dans le masque), il suffit de les traduire en binaire.

A partir de là, les segments se voient quasiment automatiquement.
La question se pose lorsqu'on divise le réseau (apparemment classful) de départ en sous-réseaux.
Si je ne me suis pas trompé, le logiciel "subnetcalc" ne donne pas le quantième réseau, et rapidemment en plus 😉 (ce que voulais).
La question se pose lorsqu'on divise le réseau (apparemment classful) de départ en sous-réseaux.
Si je ne me suis pas trompé, le logiciel "subnetcalc" ne donne pas le quantième réseau, et rapidemment en plus 😉 (ce que

absolument bvffalo73


voici un exemple plus révélateur 12.150.146.98/224
c'est la deuxième machine dans le réseau 12.150.146.96
mais c'est le quantième réseau ?

permettez-moi de corriger, c'est plutôt 12.150.146.98/27, ou masque 255.255.255.224.
Les calculs effectués pour l'autre exemple ne peut plus être appliqués, on devra chercher des règles plus génériques.

Voici mes raisonnements:
- Le réseau de départ est un de class A, donc masque 255.(0)^3
- La masque de sous-réseau est (255)^3.224, donc on utilise 19 bits pour cette masque.
- Intuitivement, je dirais: (150*256^2 + 146*256 + 98 ) div 32 = 308371,
donc 308372ème sous-réseau.
(div 32 car chaque sous-rés utilise 32 adresses).

A vérifier quand j'aurai le temps (ou si quelqu'un veut bien le faire)
Après quelques nuits de réflexion, voici ce que j'ai pu trouver:

Adresse de départ: A.B.C.D appartient à un réseau classful /n (n = [8,16,24])
Segmentation avec une masque de m bits (n<m<32), donc m tjs supérieur à 8
Qr: quantième de sous-réseau (à calculer), l'adresse de ce dernier sera A.Bs.Cs.Ds/m
Qh: quantième de hôte dans le sous-réseau
k: nombre de bits réservé à la partie host de sous-rés (k = 32 - m)
i: nombre de bits réservé à la partie hôtes de double-mot qui est différent entre la masque réseau de départ et la masque de sous-réseau. (i = k mod 8 )
Par exemple:
[code:1:018dc4dae1]
255.0.0.0 11111111 00000000 00000000 00000000
255.224.0.0 11111111 11100000 00000000 00000000
=> n = 8, m = 11, k = 21, i = 5
[/code:1:018dc4dae1]

Calcul génériques:
[code:1:018dc4dae1]
k = 32 - m
i = k mod 8
si 8<m<16
Qr = (B*256^2 div 2^k) + 1
Qh = (B mod 2^i)*256^2 + C*256 + D
Bs = B - (B mod 2^i)
Cs = 0
Ds = 0
finsi

si m = 16
k = 32 - m = 16
i = k mod 8 = 0
Qr = (B*256^2 div 2^k) + 1
= B + 1
Qh = C*256 + D
Bs = B
Cs = 0
Ds = 0
finsi

si 16<m<24
si n = 8 // class A subneting
Qr = ((B*256^2 + C*256) div 2^k) + 1
finsi
si n = 16 // class B subneting
Qr = ((C*256) div 2^k) + 1 = (C*2^8) div 2^k + 1
finsi
Qh = (C mod 2^i)*256 + D
Cs = C - (C mod 2^i)
Ds = 0
finsi

si m = 24
k = 32 - m = 8
i = 8 mod 8 = 0
si n = 8 // class A subneting
Qr = ((B*256^2 + C*256) div 2^k) + 1
= ((B*256^2 + C*256) div 256) + 1
= B*256 + C + 1
finsi
si n = 16 // class B subneting
Qr = ((C*256) div 2^k) + 1 = (C*2^8) div 2^k + 1
finsi
Qh = D
Bs = B
Cs = C
Ds = 0
finsi

si 24<m<32
i = k mod 8 = k // (car 0<k<8)
si n = 8
Qr = ((B*256^2 + C*256 + D) div 2^k) + 1
finsi
si n = 16
Qr = (C*256 + D) div 2^k) + 1
finsi
si n = 24
Qr = (D div 2^k) + 1
finsi
Qh = D mod 2^i
Bs = B
Cs = C
Ds = D - (D mod 2^i)
finsi
[/code:1:018dc4dae1]

Exemple: Hôte 15.200.56.197 dans le réseau 15.0.0.0/8 de départ ( n=8 )
-----------
- si l'on prendre une masque sous-réseau de 12 bits (255.240.0.0):
m = 12 (8<m<16)
i = 32 - m - 16 = 4
k = 32 - m = 20
Qr = (B*256^2 div 2^k) + 1 = (200*256^2 div 2^20) + 1 = 13
=> 13ème sous-rés

Qh = (B mod 2^i)*256^2 + C*256 + D = (200 mod 2^4)*256^2 + 6*256 + 197 = 538821
=> 538821ème hôte

Bs = B - (B mod 2^i) = 200 - (200 mod 2^4) = 192
Cs = 0
Ds = 0
=> adresse de sous-réseau: 15.192.0.0/12

- si l'on prendre une masque sous-réseau de 16 bits (255.255.0.0):
m = 16
i = 32 - m - 16 = 0
k = 32 - m = 16
Qr = B + 1 = 200 + 1 = 201
=> 201ème sous-réseau
Qh = C*256 + D = 56*256 + 197 = 14533
=> 14533ème hôte

adresse sous-réseau: 15.200.0.0/16

- si l'on prendre une masque sous-réseau de 21 bits (255.225.248.0):
m = 21 (16 < m < 24)
i = 32 - m - 8 = 3
k = 32 - m = 11

Qr = ((B*256^2 + C*256) div 2^k) + 1
= ((200*256^2 + 56*256) div 2^11) + 1 = 6408
=> 6408ème sous-rés

Qh = (C mod 2^i)*256 + D = (56 mod 2^3)*256 + 197 = 197
=> 197ème hôte

Cs = C - (C mod 2^i) = 56 - (56 mod 2^3) = 56
Ds = 0
=> le sous-réseau est 15.200.56.0/21


- si l'on prendre une masque sous-réseau de 24 bits (255.225.255.0):
m = 24
k = 32 - m = 8
i = 0
Qr = B*256 + C + 1 = 200*256 + 56 + 1 = 51257
=> 51257ème sous-res

Qh = D = 197 => 197ème hôte
=> adresse sous-réseau: 15.200.56.0/24


- si l'on prendre une masque sous-réseau de 27 bits (255.225.255.224):
m = 27 (24 < m < 32)
i = k = 32 - m = 5
Qr = ((B*256^2 + C*256 + D) div 2^k) + 1
= ((200*256^2 + 56*256 + 197 ) div 2^5) + 1 = 410055
=> 410055ème sous-rés

Qh = D mod 2^i = 197 mod 2^5 = 5 => 5ème hôte
Ds = D - (D mod 2^i) = 197 - (197 mod 2^5) = 192
=> adresse sous-réseau: 15.200.56.192/27
Bonjour,
j'ai écrit un fichier html avec un script java qui fait le calcul. J'hésite à le mettre ici car il fait 5 Ko.
Je suis pas très fort en programmation, et j'ai du apprendre JS en même temps, donc le script n'est pas terrible.
De plus, il ne marche que sous quelques conditions / restrictions:
- Le réseau de départ est classful;
- Les réseaux class D et E ne sont pas pris en compte (ils sont facile à calculer de toute façon).
Si çà intéresse quelqu'un, ou si l'admin le permet, je vais le poster. C'est plus libre que du GPL.
Lu startx25,

N'hésite surtout pas, post ton code. C'est avec plaisir que nous le lirons.

Je te remerci d'avance de partager librement test connaissances et tes productions.

@+
_SebF - Sébastien FONTAINE
salut "_chebf",
c'est le buffe qui parle, pas startx25. 😉

J'ai décidé de faire du JS car cela permet de se passer d'un serveur http (Apache bien sûr) et php; et l'anglais, c'est pour frimer.
Le voici le code, en attendant vos contributions.

[code:1:53573d311a]
<html>
<head>
<title>subnet ordinal calculator</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<style>input.button { width: 7em }</style>
<script type="text/javascript">
<!--
function ClearAll() {
var f = document.forms[0];
f.oct1.value="";
f.oct2.value="";
f.oct3.value="";
f.oct4.value="";
f.subnetpref.value="9";
ResultText.innerHTML = "";
} // function

function Validate(oct1,oct2,oct3,oct4,snpref) {
/* Validate the four double-words as IP address style
* Determine the address class following the value of first double-word
* return the network pref of origin if no error
*/
var netpref = 0;
// any of the four double-words that is ((LT 0) OR (GT 255)) will terminate function and return 0
if (isNaN(oct1) || oct1 < 0 || oct1 > 255) {
window.alert("ERROR: First double-word invalid ");
return 0;
}
if (isNaN(oct2) || oct2 < 0 || oct2 > 255) {
window.alert("ERROR: Second double-word invalid ");
return 0;
}
if (isNaN(oct3) || oct3 < 0 || oct3 > 255) {
window.alert("ERROR: Third double-word invalid ");
return 0;
}
if (isNaN(oct4) || oct4 < 0 || oct4 > 255) {
window.alert("ERROR: Fourth double-word invalid ");
return 0;
}
// Determine address class + original pref from first doubleword
if (oct1 < 128) netpref = 8; // A class
else if (oct1 < 192) netpref = 16; // B class
else if (oct1 < 224) netpref = 24; // C class
else netpref = 28; // D and E classes. No interest, not taken into account
// subnetting, so original PREF should be greater than subnet PREF
if (snpref <= netpref) {
window.alert("ERROR: subnet pref should be longer than original pref");
return 0;
}
// return netpref otherwise
return netpref;
} //function

function Calculate(f) {
/* var f = document.forms[0]; */
var oriPref = Validate(f.oct1.value,f.oct2.value,f.oct3.value,f.oct4.value,f.subnetpref.value);
// if Validate() returns 0: do nothing.
if (!oriPref) return;
else {
var SPref = f.subnetpref.value;
var Oct1 = f.oct1.value;
var Oct2 = f.oct2.value;
var Oct3 = f.oct3.value;
var Oct4 = f.oct4.value;
var Qr = 0;
var Qh = 0;
var myString = "<br /><b><i>Result:</i></b><br />";
var k = 32 - SPref;
var i = k % 8;

/*
** shift left/right operations
** 2^k = 1 << k
** X^k = X << k
** X div (2^k) = X >> k
** X * 256^2 = X * 2^16 = X << 16
** X * 256 = X << 8
*/

if (SPref < 16) {
// Qr = (Otc2 * 256) div 2^k + 1
Qr = ((Oct2 << 16) >> k) + 1;
Qh = ((Oct2 % (1 << i)) << 16) + (Oct3 << 8) + Oct4*1;
Oct2 -= Oct2 % (1 << i);
Oct3 = 0;
Oct4 = 0;
}
else if (SPref == 16) {
Qr = Oct2*1 + 1;
Qh = Oct3*256 + Oct4*1;
Oct3 = 0;
Oct4 = 0;
}
else if (SPref < 24) { // and SPref > 16
if (oriPref == 8) Qr = (((Oct2 << 16) + (Oct3 << 8)) >> k) + 1;
if (oriPref == 16) Qr = ((Oct3 << 8) >> k) + 1;
Qh = ((Oct3 % (1 << i)) << 8) + Oct4*1;
Oct3 -= (Oct3 % (1 << i));
Oct4 = 0;
}
else if (SPref == 24) {
if (oriPref == 8) Qr = (Oct2 << 8) + Oct3*1 + 1;
if (oriPref == 16) Qr = ((Oct3 << 8) >> k) + 1;
Qh = Oct4*1;
Oct4 = 0;
}
else { // 24 < SPref 24 < 32
if (oriPref == 8) Qr = (((Oct2 << 16) + (Oct3 << 8) + Oct4*1) >> k) + 1;
if (oriPref == 16) Qr = (((Oct3 << 8) + Oct4*1) >> k) + 1;
if (oriPref == 24) Qr = (Oct4 >> k) + 1;
Qh = Oct4 % (1 << k) ;
Oct4 -= (Oct4 % (1 << k));
}

myString += "Subnet address: " + Oct1 + "." + Oct2 + "." + Oct3 + "." + Oct4 + "/" + SPref + "<br />";
myString += "Subnet ordinal: " + Qr + "<br />Host ordinal in the subnet: " + Qh + "<br />";
ResultText.innerHTML = myString;
} //else
} //function
//-->
</script>
</head>
<body text="#332222" bgcolor="#cccccc">
<form method="post">
<b><i>Subnet Ordinal Calculator<br /><br />
Host address
<input maxLength="3" size="3" name="oct1" /> .
<input maxLength="3" size="3" name="oct2" /> .
<input maxLength="3" size="3" name="oct3" /> .
<input maxLength="3" size="3" name="oct4" /><br /><br />
Subnet pref</i></b>
<select name="subnetpref">
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
<option value="21">21</option>
<option value="22">22</option>
<option value="23">23</option>
<option value="24">24</option>
<option value="25">25</option>
<option value="26">26</option>
<option value="27">27</option>
<option value="28">28</option>
<option value="29">29</option>
<option value="30">30</option>
<option value="31">31</option>
</select><br /><br />
<input type="button" value="Clear Form" onclick="ClearAll();" />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
<input type="button" value="Calculate" onclick="Calculate(this.form);" />
</form>
<span id="ResultText" style="position:relative;"></span>
</body>
</html>
[/code:1:53573d311a]
Alors là, je dis B R A V O et mille mercis !!