Я не могу найти быстрый / эффективный метод определения допустимого диапазона IP-адресов на основе заданного IP-адреса маршрутизатора и маски сети

Я знаю, как рассчитать IP-адрес подсети и широковещательный IP-адрес путем преобразования всех IP-адресов и сетевых масок в двоичный код и выполнения побитового И / ИЛИ, но такой подход занимает много времени и легко приведет к ошибкам ...

2 ответа2

1

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

В противном случае используйте маску сети для расчета размера подсети (от 2 до числа нулевых битов в маске сети). Найдите максимальный IP-адрес, который кратен размеру подсети, но меньше, чем IP-адрес маршрутизатора. Этот IP-адрес является сетевым адресом, а IP-адрес плюс размер подсети минус 1 - широковещательный адрес.

1

Если что-то занимает время, напишите это.

Python имеет модуль ipaddress :

$ python
Python 3.4.2 (default, Oct  8 2014, 13:44:52) 
>>> import ipaddress
>>> x = ipaddress.IPv6Interface("2001:470:709a:107::1a2b:3c/64")
>>> x.network
IPv6Network('2001:470:709a:107::/64')
>>> y = ipaddress.IPv4Interface("194.219.181.195/26")
>>> y.network
IPv4Network('194.219.181.192/26')
>>> y.network.network_address
IPv4Address('194.219.181.192')
>>> y.network.broadcast_address
IPv4Address('194.219.181.255')

Что приведет к:

#!/usr/bin/env python
import ipaddress
import sys

for arg in sys.argv[1:]:
    addr = ipaddress.ip_interface(arg)
    print("address =", addr)
    print("network =", addr.network)
    if addr.version == 4:
        print("netmask =", addr.netmask)
        print("broadcast =", addr.network.broadcast_address)
    print()

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .