Рассчитать сеть между двумя 2 IP-адресами без CIDR

У меня проблема, когда я дал два IPv4-адреса, и мне нужно рассчитать наилучшую возможную сеть между ними. Например, у меня есть 10.240.204.160 и 10.240.220.160, и мне нужно найти все минимально доступные подсети между ними.

Обратите внимание, что эти два IP-адреса не являются обозначением CIDR.

Решение, которое я подумал. Т.е.

  1. получить номер хоста между ними (здесь 4096)
  2. найти установленный бит в 4096, который является 12-м битом
  3. Теперь создайте маску подсети 20, т.е. 255.255.240.0
  4. Таким образом, я получу маски подсети между этими двумя IP-адресами.

Теперь вопрос в том, что, предположим, я получил 255.255.240.0, а затем, используя начальный IP-адрес, он предоставит сеть 10.240.192.0/20, которая будет обслуживать

10.240.192.1 to 10.240.207.255, но я начал с 10.240.204.160 to 10.240.220.160, поэтому он будет ломаться неправильно

Похоже, я сделаю огромную ошибку, если буду придерживаться своей версии истории.

Кто-нибудь здесь, пожалуйста, помогите мне.


person Akaks    schedule 05.02.2015    source источник


Ответы (2)


Вы используете неправильную маску. Вы должны использовать /19 вместо /20.

/20 предлагает вам 16 подсетей. Простая математика учит нас 192 + 16 = 208 (192 - результат 0 + 16 = 16, 16 + 16 = 32, 32 + 16 = 48 и т. Д.)

/19 предлагает 32 подсети -> 192 + 32 = 224

Помните, что 224 - начало следующей сети. В вашей /19 сети будут подсети от 10.240.192.0/24 до 10.240.223.0/24.

10.240.204.160 и 10.240.220.160 принадлежат сети 10.240.192.0/19.

person CustomX    schedule 05.02.2015
comment
На самом деле мне нужно вычислить подсети между 10.240.204.160 и 10.240.220.160. Если я сохраню / 19, тогда у меня будет очень большой диапазон, в котором я сомневаюсь, что IP-адреса менее 10.240.204.160 могут уже быть частью какой-то другой сети. Таким образом, диапазон ограничен, нельзя выходить за его пределы при расчете подсети - person Akaks; 05.02.2015
comment
@Akaks, 10.240.204.160/20 принадлежит сети 10.240.192.0/20, а 10.240.220.160/20 принадлежит сети 10.240.208.0/20. Итак, вы видите 2 разные сети. Вот почему вам понадобится маска /19. - person CustomX; 05.02.2015
comment
Теперь я нашел ту же проблему, что и у меня. Здесь perlmonks.org/?node_id=118346 . Я пытаюсь найти ответ сейчас, пожалуйста, обновите, если найдете что-нибудь - person Akaks; 06.02.2015
comment
@Akaks, ты никогда ничего не просил о программировании. Вы просто хотели знать, как рассчитать сеть между двумя адресами (которые я предоставил). Если вам нужен ответ о том, как это сделать в Perl, я предлагаю вам создать новый вопрос. - person CustomX; 06.02.2015
comment
Что ж, спасибо за комментарий, я искал любую формулу или алгоритм, чтобы написать программу - person Akaks; 06.02.2015
comment
@Akaks, я бы определенно добавил это к вопросу, потому что тогда вы, кажется, забыли самую важную часть вопроса;) - person CustomX; 06.02.2015
comment
Может быть, я не буду хорошо объяснять свою проблему, спасибо за ответ. Вопрос по-прежнему тот же, что и мне нужно позаботиться о том, чтобы к нему зашел только данный хост. Если бы я взял / 19, он бы отличался от исходного ввода, который находится между 10.240.204.160-223.255. Я уверен, что если вы пройдете по ссылке выше, вы сможете сказать это логически. - person Akaks; 06.02.2015
comment
@Akaks, я думаю, вам нужно погуглить азы IP-адресации. Маска /19 предоставит вам диапазон 10.240.192.0 to 10.240.223.255 (который включает оба IP-адреса, которые вы указали. Маска /20 предоставит вам диапазон 10.240.192.0 to 10.240.207.255 (который включает только 10.240.204.160 IP). Вы можете посмотреть здесь - person CustomX; 06.02.2015

Я искал готовый код и наткнулся на эту ветку. В итоге я написал на питоне следующее. У вас всегда есть шанс, что вы охватите 2 подсети. Вы просто пропустили последний шаг здесь, чтобы проверить и при необходимости расширить сетевую маску на один бит.

def calc_inclusive_subnet(ip1, ip2): #accepts 2 IP strings
    #make IP Address objects
    ip1_obj=ipaddress.IPv4Address(ip1)
    ip2_obj=ipaddress.IPv4Address(ip2)

    if ip1_obj<=ip2_obj:
        min_ip=ip1_obj
        max_ip=ip2_obj
    else:
        min_ip=ip2_obj
        min_ip=ip1_obj

    distance = int(max_ip)-int(min_ip)
    ip_range=0 #increment powers of 2 until you have subnet distance
    while 2**ip_range < distance:
        ip_range += 1

    net = ipaddress.IPv4Network(str(min_ip) + '/' +str(32-ip_range), strict=False)
    if max_ip not in net: 
    # i.e. if the distance implies one size network, but IPs span 2
        ip_range+=1
        net = ipaddress.IPv4Network(str(min_ip) + '/' +str(32-ip_range), strict=False)

    return net
person Tim B    schedule 31.08.2018
comment
Спасибо, было очень полезно !. Есть небольшая ошибка в остальном if ip1_obj<=ip2_obj:, вы дважды назначаете min_ip вместо _3 _ / _ 4_ - person Smasho; 09.09.2019