Jak obliczyć zakres IP, gdy podany jest adres IP i maska sieciowa?

Gdy zakres IP jest zapisywany jako aaa.bbb.ccc.ddd / netmask ( CIDR notacja) muszę obliczyć pierwszy i ostatni adres ip w tym zakresie za pomocą C#.

Przykład:

Wejście: 192.168.0.1/25

Wynik: 192.168.0.1 - 192.168.0.126

Author: Chris Weber, 2009-09-24

8 answers

Mój dobry przyjaciel Alessandro maładny post dotyczący operatorów bitowych w C#, powinieneś o tym poczytać, żebyś wiedział co robić.

To całkiem proste . Jeśli złamiesz adres IP podany do binary, adres sieciowy jest adresem ip, w którym wszystkie bity hosta (0 w masce podsieci) są równe 0, a ostatni adres, adres transmisji, jest adresem, w którym wszystkie bity hosta są równe 1.

Na przykład:

ip 192.168.33.72 mask 255.255.255.192

11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)

Pogrubione części to bity hosta (reszta to bity sieciowe). Jeśli zamienisz wszystkie bity hosta na 0 Na IP, otrzymasz pierwszy możliwy adres IP:

11000000.10101000.00100001.01000000 (192.168.33.64)

Jeśli zamienisz wszystkie bity hosta na 1, Otrzymasz ostatni możliwy adres IP (czyli adres nadawczy):

11000000.10101000.00100001.01111111 (192.168.33.127)

Więc dla mojego przykładu:

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
 56
Author: balexandre,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-05 15:29:27

Po prostu napiszę kod:

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);
 23
Author: Joren,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 10:48:54

Nauczyłem się tego skrótu pracując na stanowisku rozmieszczenia sieci. Pomogło mi to tak bardzo, że pomyślałem, że podzielę się tym sekretem ze wszystkimi. Do tej pory nie udało mi się znaleźć łatwiejszego sposobu w Internecie, o którym wiem.

Na przykład sieć 192.115.103.64 / 27, jaki jest zakres?

Pamiętaj tylko, że maska podsieci jest 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

From / 27 wiemy, że (11111111.1111111.1111111.11100000). Licząc od lewej, jest to trzecia Liczba z ostatniego oktetu, która równa się 255.255.255.224 maska podsieci. (Nie licz 0, 0 jest /24) więc 128, 192, 224..etc

Tutaj, gdzie przychodzi Matematyka:

Użyj maski podsieci - maska podsieci poprzedniej wymienionej maski podsieci w tym przypadku 224-192=32

Wiemy, że 192.115.103.64 to sieć: 64 + 32 = 96 (Następna network for / 27)

Czyli mamy .0 .32. 64. 96. 128. 160. 192. 224. (Nie można użyć 256, ponieważ jest .255)

Oto zakres 64 -- 96.

Sieć jest 64.

Pierwszy host to 65.(pierwsza sieć +1)

Ostatni host to 94. (broadcast -1)

Transmisja jest 95. (ostatnia sieć -1)

 8
Author: Jamison Ye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-30 19:04:28

Odwróć maskę (XOR z jedynkami), a to z IP. Dodaj 1. To będzie zakres początkowy. Lub IP z maską. To będzie zakres końcowy.

 5
Author: Vladislav Rastrusny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 10:12:51

Polecam korzystanie z biblioteki IPNetwork https://github.com/lduchosal/ipnetwork . Od wersji 2 obsługuje również IPv4 i 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);

Wyjście

  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
Baw się dobrze !
 3
Author: LukeSkywalker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-11 09:41:13

Wiem, że to jest starsze pytanie, ale znalazłem tę fajną bibliotekę na nuget, która wydaje się robić tylko sztuczkę dla mnie:

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

 2
Author: Matt Millican,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-03 17:46:58

Możesz już to wiedzieć, ale aby sprawdzić, czy dobrze to robisz, spójrz na http://www.subnet-calculator.com/ - można tam zobaczyć, jak bity reprezentują część sieci i hosta adresu.

 1
Author: Trevor Tippins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-24 11:03:53

Input: 192.168.0.1/25

Maska to ta część: /25

Aby znaleźć adres sieciowy wykonaj następujące czynności:

  • Odejmujemy maskę od długości ip (32 - mask) = 32-25 = 7 i pobieramy te bity z prawej

  • W podanym adresie ip I. E: 192.168.0.1 w binarnym jest: 11111111 11111111 00000000 00000001 Teraz, biorąc 7 bitów z prawej '0' 1111111 11111111 00000000 00000000 Który w dziesiętnym jest: 192.168.0.0 (to jest adres sieciowy)

Aby znaleźć pierwszy poprawny / użyteczny adres ip dodaj +1 do adres sieciowy I. E: 192.168.0.1

Aby znaleźć ostatni / broadcast address procedura jest taka sama jak w przypadku znalezienia adresu sieciowego, ale tutaj musisz dokonać (32-mask) bity od prawej do " 1 "

I. E: 11111111 11111111 00000000 01111111 Co w dziesiętnym to 192.168.0.127

Aby znaleźć ostatni poprawny / użyteczny adres ip odjmij 1 od adresu nadawcy I. E: 192.168.0.126

 1
Author: Nilay Jha,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-05 17:30:19