用python netaddr cidr_merge总结相邻的子网

时间:2014-07-09 17:30:23

标签: python python-3.x

python 3.3.4 netaddr 7.12 Mac OSX 10.8.5

我有一个不会与netaddr.cidr_merge()合并的IPNetworks列表,即使有些是相邻的。我做错了吗?

import netaddr
from netaddr import IPNetwork
iplist =[
    IPNetwork('10.105.205.8/29'), 
    IPNetwork('10.105.205.16/28'), 
    IPNetwork('10.105.205.32/27'), 
    IPNetwork('10.105.205.64/26'), 
    IPNetwork('10.105.205.128/26'),
    IPNetwork('10.105.205.192/28'),
    IPNetwork('10.105.205.208/29'),
    IPNetwork('10.105.206.48/28'),
    IPNetwork('10.105.206.80/28')
    ]

>>> summary = netaddr.cidr_merge(iplist)
>>> summary == iplist
    True

from the documentation

netaddr.cidr_merge(ip_addrs)

接受可迭代的IP地址和子网序列的函数,将它们合并到最小的CIDR列表中。它尽可能合并相邻的子网,包含在其他子网中的子网,并删除任何重复的子网。

参数:ip_addrs - 可迭代的IP地址和子网序列。 返回:IPNetwork对象的汇总列表。

2 个答案:

答案 0 :(得分:2)

netaddr在这里正常运作。并非所有相邻的子网都可以汇总。

例如,考虑子网10.255.255.0/2411.0.0.0/24。虽然它们是相邻的 - 第一个以10.255.255.255结尾,第二个以11.0.0.0结尾 - 但它们无法汇总,因为它们跨越的边界比这两个网络中的任何一个都大得多。

此外,无论它们如何对齐,两个相邻的网络只有在尺寸相同的情况下才能连接在一起。不匹配的大小不能组合到一个范围内,因为组合网络的大小不会是2的幂。

答案 1 :(得分:2)

@duskwuff -

感谢您的回复。我同意第一部分,但第二部分...我认为我知道你在哪里,但它不是100%准确。例如,如果我从上面获取编辑列表,并附加10.105.205.0/29。子网将总结为/ 25。是的,它们必须是2的幂,但是在netaddr总结之前必须存在整个子网的所有部分,无论它们是否大小相同。

   iplist =[
        IPNetwork('10.105.205.8/29'), 
        IPNetwork('10.105.205.16/28'), 
        IPNetwork('10.105.205.32/27'), 
        IPNetwork('10.105.205.64/26'),
        ]
    >>> iplist.append(IPNetwork('10.105.205.0/29'))
    >>> netaddr.cidr_merge(iplist)
        [IPNetwork('10.105.205.0/25')]