c# - tabla - subredes ip
¿Cómo se calcula el rango de IP cuando se proporciona la dirección IP y la máscara de red? (8)
Cuando un IP-Range se escribe como aaa.bbb.ccc.ddd / netmask ( Notación CIDR ), necesito calcular la primera y la última dirección IP incluida en este rango con C #.
Ejemplo:
Entrada: 192.168.0.1/25
Resultado: 192.168.0.1 - 192.168.0.126
Aprendí que este atajo no funciona en la posición de despliegue de la red. Me ayudó mucho, pensé que compartiría este secreto con todos. Hasta ahora, no he podido encontrar una forma más fácil en línea que yo sepa.
Por ejemplo, una red 192.115.103.64 / 27, ¿cuál es el rango?
solo recuerde que la máscara de subred es 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
desde / 27 sabemos que (11111111.11111111.11111111.11100000). Contando desde la izquierda, es el tercer número del último octeto, que equivale a 255.255.255.224 máscara de subred. (No cuente 0, 0 es / 24) entonces 128, 192, 224..etc
Aquí donde entra la matemática:
use la máscara de subred - máscara de subred de la máscara de subred anterior listada en este caso 224-192 = 32
Sabemos que 192.115.103.64 es la red: 64 + 32 = 96 (la siguiente red para / 27)
lo que significa que tenemos .0 .32. 64. 96. 128. 160. 192. 224. (No se puede usar 256 porque es .255)
Aquí está el rango 64 - 96.
la red es 64.
primer host es 65. (primera red +1)
El último host es 94. (emisión -1)
la emisión es 95. (última red -1)
Entrada: 192.168.0.1/25
La máscara es esta parte: /25
Para encontrar la dirección de red haga lo siguiente:
Resta la máscara de la longitud del IP (32 - máscara) = 32 - 25 = 7 y toma esos bits de la derecha
En la dirección IP dada, Ie:
192.168.0.1
en binario es:11111111 11111111 00000000 00000001
Ahora, tomando 7 bits de la derecha ''0''1111111 11111111 00000000 00000000
Que en decimal es:192.168.0.0
(esta es la dirección de red)
Para encontrar la primera dirección IP válida / utilizable, agregue +1 a la dirección de red Ie: 192.168.0.1
Para encontrar la última / dirección de difusión, el procedimiento es el mismo que para encontrar la dirección de red, pero aquí tiene que hacer (32 máscaras) bits de derecha a ''1''
Es decir: 11111111 11111111 00000000 01111111
que en decimal es 192.168.0.127
Para encontrar la última dirección IP válida / utilizable, reste 1 de la dirección de difusión Ie: 192.168.0.126
Es posible que ya lo sepas, pero para comprobar que estás obteniendo estas cosas, eche un vistazo a http://www.subnet-calculator.com/ . Puede ver cómo los bits representan la red y las partes de la dirección. .
Invierta la máscara (XOR con unos), Y con IP. Agregar 1. Este será el rango de inicio. O IP con máscara. Este será el rango final.
Recomendaría el uso de IPNetwork Library https://github.com/lduchosal/ipnetwork . A partir de la versión 2, también es compatible con IPv4 e 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);
Salida
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
Que te diviertas !
Sé que esta es una pregunta más antigua, pero encontré esta biblioteca ingeniosa en Nuget que parece hacer el truco para mí:
Voy a publicar el código:
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);
mi buen amigo Alessandro tiene una buena publicación sobre operadores de bits en C #, deberías leer sobre esto para que sepas qué hacer.
Es bastante fácil . Si desglosa la IP que le ha dado en binario, la dirección de red es la dirección IP donde todos los bits de host (los 0 en la máscara de subred) son 0, y la última dirección, la dirección de difusión, es donde todo el host los bits son 1.
Por ejemplo:
ip 192.168.33.72 mask 255.255.255.192
11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)
Las partes en negrita son los bits HOST (el resto son bits de red). Si convierte todos los bits de host a 0 en la IP, obtendrá la primera IP posible:
11000000.10101000.00100001.01000000 (192.168.33.64)
Si convierte todos los bits de host en 1, obtendrá la última IP posible (también conocida como la dirección de difusión):
11000000.10101000.00100001.01111111 (192.168.33.127)
Entonces para mi ejemplo:
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