Страницы

Поиск по вопросам

понедельник, 30 декабря 2019 г.

Подсчет количества ip адресов в диапазоне IPv6?

#c_sharp #net #сеть #ipv6


Дан IPv6 диапазон (разделитель дефис): 2c0f:ffd8::-2c0f:ffd8:ffff:ffff:ffff:ffff:ffff:ffff

Как быстро подсчитать колличество IP адресов в этом диапазоне?
    


Ответы

Ответ 1



В диапазоне адресов специального формата, вроде того, который показан у вас в вопросе (общий префикс, и 00..00-ff...ff) количество адресов определяется очень просто. Берется количество доступных для изменения бит, и 2 возводится в эту степень. Так, ваш префикс 2c0f:ffd8 содержит 8*4 = 32 бита, остается 96 изменяемых бит, что дает 2^96 = 79 228 162 514 264 337 593 543 950 336 разных адресов.

Ответ 2



Если не учитывать зарезервированные диапазоны адресов, то самый простой способ, как написал в комментах @PetSerAl, преобразовать оба адреса в числа и вычесть одно из другого. IPv6 содержит 128 бит и его численное значение не влезет ни в long, ни в decimal, поэтому для расчетов потребуется использовать BigInteger (для этого нужно подключить System.Numerics). Для преобразования сналала переведем адрес в массив байтов с помощью IPAddress.GetAddressBytes, затем воспользуемся конструктором BigInteger(byte[]). При преобразовании нужно учесть различия в байтовом представлении: IPAddress.GetAddressBytes возвращает байты начиная со старших разрядов, а BigInteger ожидает получить их в обратном порядке, поэтому массив потребуется перевернуть; BigInteger рассматривает массив байтов как представление числа со знаком (число считается отрицательным если установлен старший бит старшего байта). Чтобы избежать этого можно добавить 0 в конец массива. Пример метода, который преобразует строку адреса в число: private static BigInteger AddressToBigInteger(string addressString) { var address = IPAddress.Parse(addressString); var bytes = address.GetAddressBytes(); Array.Reverse(bytes); Array.Resize(ref bytes, bytes.Length+1); return new BigInteger(bytes); } Применение: var first = AddressToBigInteger("2c0f:ffd8::"); var second = AddressToBigInteger("2c0f:ffd8:ffff:ffff:ffff:ffff:ffff:ffff"); Console.WriteLine(second - first + 1); //+1, чтобы включить обе границы диапазона

Комментариев нет:

Отправить комментарий