如何计算多个IP地址中最大可能的公用子网



我有一个包含所有不同IP地址的CSV文件。我想在这些IP地址中找到最大可能的公共子网及其CIDR值。例如,"35.168.107.193"one_answers"34.199.153.226"都属于34.0.0.0/7。

仅供参考,我得到了一个python代码,它能够计算两个IP地址中最大的公共子网。有没有什么方法可以修改这个代码,这样我就不必手动向函数传递两个参数,程序就可以扫描CSV文件中的所有IP地址,而不仅仅是两个IP地址?

导入ipad地址

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
max_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

最大的可能的IPv4子网总是0.0.0.0/0。很可能,您要的是包含这些地址的最小子网。

你可以

  • 将两个地址都转换为uint32
  • 异或转换后的地址-相同的位变为0,不同的位变成1
  • 从第31位开始计数0位-计数是您的前缀长度

最新更新