Python 中的 IPv4Network - 计算不同大小的下一个最小子网?

IPv4Network in Python - Calculating next minimum subnet of different size?

我正在使用 Python 中的 ipaddress 模块,并试图找出一种方法来计算下一个可用子网(具有相同前缀或不同前缀) t 与现有子网重叠(新子网必须 大于旧子网)。

假设我从网络开始:

from ipaddress import IPv4Network

# From 10.90.1.0 to 10.90.1.31
main_net = IPv4Network("10.90.1.0/27")

我知道下一个可用地址将是 10.90.1.32,我什至可以很容易地通过以下方式计算出来:

next_ip = main_net.broadcast_address + 1
# will output 10.90.1.32
print(next_ip)

如果我想找到下一个 /27,我只需像这样创建一个新网络:

# From 10.90.1.32 to 10.90.1.63
new_net = IPv4Network(f"{next_ip}/27")

到目前为止这一切都非常简单,但是现在如果我要查找的下一个子网是 /26/28 怎么办 - 我如何才能找到下一个最小起始 IP 地址Python?

中的任何一种情况

我已经探索过使用 supernet 方法,例如我可以这样做:

# Will print 10.90.1.0/26
print(main_net.supernet(new_prefix=27))

这个方法的问题是它会打印 10.90.1.0/26 与现有的 10.90.1.0/27 网络重叠,我可以做一个循环并让它继续生成下一个 /26 直到它们不再重叠,但对我来说似乎效率低下。当然,还有更好的方法吗?

多亏了 Ron Maupin 的有用评论和有用指南的帮助,我成功地创建了一个函数来执行此操作。我还想多测试一下,但相信它是正确的:

def calculate_next_ip_network(ip_bytes, current_prefix, next_prefix):
    next_prefix_mask = (~((1 << (32 - next_prefix)) - 1)) & 0xFFFFFFFF
    if next_prefix <= current_prefix:
        bit_shift = 32 - next_prefix
    else:
        bit_shift = 32 - current_prefix
    new_ip = (((next_prefix_mask & ip_bytes) >> bit_shift) + 1) << bit_shift
    return bytes([new_ip >> i & 0xFF for i in (24, 16, 8, 0)])

用法:

nt = IPv4Network("10.90.1.56/29")
current_prefix = nt.prefixlen
next_prefix = 25
ip_bytes = int.from_bytes(nt.network_address.packed, byteorder="big")
next_ip = calculate_next_ip_network(ip_bytes, current_prefix, next_prefix)
print(IPv4Address(next_ip))
# Should print "10.90.1.128"