web-dev-qa-db-fra.com

Comment calculer la plage IP lorsque l'adresse IP et le masque de réseau sont donnés?

Lorsqu'une plage IP est écrite en tant que aaa.bbb.ccc.ddd/netmask ( notation CIDR ), je dois calculer la première et la dernière adresse IP incluse dans cette plage avec C #.

Exemple:

Entrée: 192.168.0.1/25

Résultat: 192.168.0.1 - 192.168.0.126

36
Anheledir

mon bon ami Alessandro avoir un Nice post concernant les opérateurs de bits en C #, vous devriez lire à ce sujet afin de savoir quoi faire.

C'est assez facile . Si vous décomposez l'IP qui vous est donnée en binaire, l'adresse réseau est l'adresse IP où tous les bits de l'hôte (les 0 dans le masque de sous-réseau) sont 0, et la dernière adresse, l'adresse de diffusion, est l'endroit où tout l'hôte les bits sont 1.

Par exemple:

ip 192.168.33.72 mask 255.255.255.192

11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)

Les parties en gras sont les bits de l'hôte (les autres sont des bits de réseau). Si vous mettez tous les bits d'hôte à 0 sur l'IP, vous obtenez la première IP possible:

11000000.10101000.00100001.01000000 (192.168.33.64)

Si vous mettez tous les bits de l'hôte à 1, vous obtenez la dernière IP possible (alias l'adresse de diffusion):

11000000.10101000.00100001.01111111 (192.168.33.127)

Donc pour mon exemple:

the network is "192.168.33.64/26":
Network address: 192.168.33.64
First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice)
Last useable: 192.168.33.126
Broadcast address: 192.168.33.127
61
balexandre

Je vais juste poster le code:

IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 });
int bits = 25;

uint mask = ~(uint.MaxValue >> bits);

// Convert the IP address to bytes.
byte[] ipBytes = ip.GetAddressBytes();

// BitConverter gives bytes in opposite order to GetAddressBytes().
byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray();

byte[] startIPBytes = new byte[ipBytes.Length];
byte[] endIPBytes = new byte[ipBytes.Length];

// Calculate the bytes of the start and end IP addresses.
for (int i = 0; i < ipBytes.Length; i++)
{
    startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]);
    endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]);
}

// Convert the bytes to IP addresses.
IPAddress startIP = new IPAddress(startIPBytes);
IPAddress endIP = new IPAddress(endIPBytes);
26
Joren

Masque inversé (XOR avec ceux), ET avec IP. Ajouter 1. Ce sera la plage de départ. OR IP avec masque. Ce sera la plage de fin.

8
Vladislav Rastrusny

J'ai appris ce raccourci en travaillant au poste de déploiement réseau. Cela m'a beaucoup aidé, j'ai pensé que je partagerais ce secret avec tout le monde. Jusqu'à présent, je n'ai pas pu trouver un moyen plus simple en ligne que je sache.

Par exemple un réseau 192.115.103.64/27, quelle est la portée?

rappelez-vous juste que le masque de sous-réseau est 0, 128, 192, 224, 240, 248, 252, 254, 255

255.255.255.255 11111111.11111111.11111111.11111111/32

255.255.255.254 11111111.11111111.11111111.11111110/31

255.255.255.252 11111111.11111111.11111111.11111100/30

255.255.255.248 11111111.11111111.11111111.11111000/29

255.255.255.240 11111111.11111111.11111111.11110000/28

255.255.255.224 11111111.11111111.11111111.11100000/27

255.255.255.192 11111111.11111111.11111111.11000000/26

255.255.255.128 11111111.11111111.11111111.10000000/25

255.255.255.0 11111111.11111111.11111111.00000000/24

de/27 nous savons que (11111111.11111111.11111111.11100000). En comptant à partir de la gauche, c'est le troisième nombre du dernier octet, qui équivaut à 255.255.255.224 masque de sous-réseau. (Ne comptez pas 0, 0 est/24) donc 128, 192, 224..etc

Voici où les mathématiques interviennent:

utiliser le masque de sous-réseau - masque de sous-réseau du masque de sous-réseau répertorié précédent dans ce cas 224-192 = 32

Nous savons que 192.115.103.64 est le réseau: 64 + 32 = 96 (le prochain réseau pour/27)

ce qui signifie que nous avons .0 .32. 64. 96. 128. 160. 192. 224. (Impossible d'utiliser 256 car il s'agit de .255)

Voici la gamme 64 - 96.

réseau est 64.

le premier hôte a 65 ans. (premier réseau +1)

Le dernier hôte est 94. (diffusion -1)

la diffusion est de 95. (dernier réseau -1)

8
Jamison Ye

Vous le savez peut-être déjà, mais pour vérifier que vous obtenez ce genre de choses correctement, jetez un œil à http://www.subnet-calculator.com/ - vous pouvez y voir comment les bits représentent le parties réseau et hôte de l'adresse.

2
Trevor Tippins

Contribution: 192.168.0.1/25

Le masque est cette partie: /25

Pour trouver l'adresse réseau, procédez comme suit:

  • Soustrayez le masque de la longueur ip (32 - mask) = 32 - 25 = 7 et prenez ces bits de la droite

  • Dans l'adresse IP donnée I.e: 192.168.0.1 en binaire est: 11111111 11111111 00000000 00000001 Maintenant, en prenant 7 bits à partir de la droite '0' 1111111 11111111 00000000 00000000 Qui en décimal est: 192.168.0.0 (c'est l'adresse réseau)

Pour trouver la première adresse IP valide/utilisable, ajoutez +1 à l'adresse réseau I.e: 192.168.0.1

Pour trouver la dernière adresse/diffusion, la procédure est la même que celle de la recherche d'une adresse réseau, mais ici, vous devez créer des bits (32 masques) de droite à "1".

C'est à dire: 11111111 11111111 00000000 01111111 Qui en décimal est 192.168.0.127

Pour trouver la dernière adresse IP valide/utilisable, soustrayez 1 de l'adresse de diffusion I.e: 192.168.0.126

2
Nilay Jha

Je recommanderais l'utilisation de la bibliothèque IPNetwork https://github.com/lduchosal/ipnetwork . À partir de la version 2, il prend également en charge IPv4 et IPv6.

IPv4

  IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25");

  Console.WriteLine("Network : {0}", ipnetwork.Network);
  Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
  Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
  Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
  Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
  Console.WriteLine("Usable : {0}", ipnetwork.Usable);
  Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);

Sortie

  Network : 192.168.0.0
  Netmask : 255.255.255.128
  Broadcast : 192.168.0.127
  FirstUsable : 192.168.0.1
  LastUsable : 192.168.0.126
  Usable : 126
  Cidr : 25

S'amuser !

2
LukeSkywalker

Je sais que c'est une question plus ancienne, mais j'ai trouvé cette bibliothèque astucieuse sur nuget qui semble faire juste l'affaire pour moi:

http://nuget.org/packages/TakeIo.NetworkAddress/

2
Matt Millican