Подтвердить что ты не робот

Как рассчитать диапазон IP-адресов, когда заданы IP-адрес и сетевая маска?

Когда IP-диапазон записывается как aaa.bbb.ccc.ddd/netmask (CIDR Notation) Мне нужно рассчитать первый и последний включенный ip-адрес в этом диапазоне с С#.

Пример:

Вход: 192.168.0.1/25

Результат: 192.168.0.1 - 192.168.0.126

4b9b3361

Ответ 1

мой хороший друг Alessandro имеет хороший пост относительно битовых операторов в С#, вы должны прочитать об этом, чтобы вы знали, что делать.

Это довольно легко. Если вы разбиваете IP-адрес, предоставленный вам двоичным, сетевой адрес - это IP-адрес, где все биты хоста (0 в маске подсети) равны 0, а последний адрес - широковещательный адрес, где находится весь хост биты равны 1.

Например:

ip 192.168.33.72 mask 255.255.255.192

11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)

Полужирные части представляют собой бит HOST (остальные - биты сети). Если вы перевернете все хосты в 0 на IP, вы получите первый возможный IP:

11000000.10101000.00100001.01000000 (192.168.33.64)

Если вы измените все биты хоста на 1, вы получите последний возможный IP-адрес (так называемый широковещательный адрес):

11000000.10101000.00100001.01111111 (192.168.33.127)

Итак, для моего примера:

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

Ответ 2

Я просто отправлю код:

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);

Ответ 3

Я изучил этот ярлык от работы в позиции развертывания сети. Мне это очень помогло, я подумал, что поделюсь этим секретом со всеми. До сих пор я не мог найти более простой способ онлайн, о котором я знаю.

Например, сеть 192.115.103.64/27, каков диапазон?

просто помните, что маска подсети равна 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

из/27 мы знаем, что (11111111.11111111.11111111.11100000). Подсчет слева, это третий номер из последнего октета, который равен маске подсети 255.255.255.224. (Не считайте 0, 0 есть /24), так что 128, 192, 224..etc

Здесь, где идет математика:

используйте маску подсети - маску подсети предыдущей маски подсети в этом случае 224-192 = 32

Мы знаем, что 192.115.103.64 - это сеть: 64 + 32 = 96 (следующая сеть для /27)

что означает, что мы имеем .0.32. 64. 96. 128. 160. 192. 224. (Нельзя использовать 256, потому что это .255)

Вот диапазон 64 - 96.

сеть - 64.

первый хост - 65. (первая сеть +1)

Последний хост - 94. (трансляция -1)

широковещательная передача - 95. (последняя сеть -1)

Ответ 4

Инвертировать маску (XOR с одним), И с IP. Добавить 1. Это будет начальный диапазон. ИЛИ IP с маской. Это будет конечный диапазон.

Ответ 5

Я бы рекомендовал использовать библиотеку IPNetwork https://github.com/lduchosal/ipnetwork. Начиная с версии 2, он поддерживает также IPv4 и 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);

Выход

  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

Удачи!

Ответ 6

Я знаю, что это старый вопрос, но я нашел эту отличную библиотеку на nuget, которая, кажется, делает для меня всего лишь трюк:

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

Ответ 7

Возможно, вы уже это знаете, но чтобы убедиться, что вы правильно это поняли, посмотрите http://www.subnet-calculator.com/ - вы можете см. там, как биты представляют сетевую и хост-часть адреса.

Ответ 8

Вход: 192.168.0.1/25

Маска - это часть: /25

Чтобы найти сетевой адрес, выполните следующие действия:

  • Вычтите маску из длины ip (32 - mask) = 32 - 25 = 7 и возьмите эти биты справа

  • В данном ip-адресе I.e: 192.168.0.1 в двоичном выражении: 11111111 11111111 00000000 00000001 Теперь, взяв 7 бит из правого '0' 1111111 11111111 00000000 00000000 Что в десятичной форме: 192.168.0.0 (это сетевой адрес)

Чтобы найти первый действительный/полезный IP-адрес, добавьте +1 к сетевому адресу I.e: 192.168.0.1

Чтобы найти последний/широковещательный адрес, процедура аналогична процедуре поиска сетевого адреса, но здесь вы должны сделать (32-маска) бит справа на "1"

I.e: 11111111 11111111 00000000 01111111 Что в десятичной форме 192.168.0.127

Чтобы найти последний действительный/полезный ip-адрес, вычитайте 1 из широковещательного адреса I.e: 192.168.0.126