计算两个IP地址非CIDR之间的网络

时间:2015-02-05 13:08:06

标签: networking ipv4 subnet cidr

我遇到问题我在哪里给了两个IPv4地址,我必须计算它们之间最好的网络。例如,我有10.240.204.16010.240.220.160,我必须找到它们之间的所有最小可用子网。

请注意,这两个IP地址不是CIDR表示法。

我认为的解决方案.i.e

  1. 获取它们之间的主机数量(这里是4096)
  2. 在4096中找到第12位的设置位
  3. 现在创建一个20的子网掩码,即255.255.240.0
  4. 这样我将在这两个IP地址之间获得子网掩码
  5. 现在的问题是假设我得到了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开始,因此它会错误地打破

    感觉我会犯下大错的错误如果我选择我的故事版本。

    任何人都可以帮助我。

2 个答案:

答案 0 :(得分:1)

你使用错误的面具。您应该使用/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/2410.240.223.0/24

10.240.204.16010.240.220.160属于10.240.192.0/19网络。

答案 1 :(得分:0)

我一直在寻找预制的代码,却偶然发现了这个线程。我最终在python中编写了以下内容。您始终有机会跨越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