首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获取python中网络的所有子网ID?

如何获取python中网络的所有子网ID?
EN

Stack Overflow用户
提问于 2020-07-21 16:34:54
回答 1查看 1.6K关注 0票数 0

尝试创建一个函数,返回所有可能的子网ID的列表,给定网络ID、子网掩码、默认掩码、感兴趣的八进制和神奇的数字。在函数内部,我觉得这个类子网掩码也必须使用,但似乎可以编写一个有用的过程。

代码语言:javascript
复制
def getAllSubnet(networkID, SubnetMask, classfulSubnetMask, octetInterest, magicNumber):
    classfulSubnetMask = classfulSubnetMask.split('.')
    SubnetMask = SubnetMask.split('.')
    allSubnet = []
    for _ in range(0, int(SubnetMask[octetInterest-1]), magicNumber):
        networkID = networkID.split('.')
        networkID[octetInterest-1] = str(int(networkID[octetInterest-1])+magicNumber)
        networkID = '.'.join(networkID)
        allSubnet.append(networkID)
    return allSubnet

networkID = '16.0.0.0'
subnetRequested = '500'
classfulSubnetMask = '255.0.0.0'
subnetMask = '255.255.128.0'
octetInterest = 3
magicNumber = 128

print(getAllSubnet(networkID, subnetMask, classfulSubnetMask, octetInterest, magicNumber))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-21 19:58:08

网络与主机ID的解释

通常有两种类型的IPv4寻址方法,classfulclassful。由于您的示例包含有关子网的信息,我将假设您希望计算出给定IPv4类和子网掩码的子网的可能数量。如果你在找别的东西,我可以根据需要编辑答案。

在处理IPv4地址时,有5个类(A、B、C、D、E)。每个类在IP地址的第一个八进制(前8位)中确定。

您可以在这里阅读有关确定IPv4类的更多信息:https://www.tutorialspoint.com/ipv4/ipv4_address_classes.htm

应该注意的是,在现实世界的场景中不再使用经典IP地址。

尽管如此,考虑到您提供的示例,这里是如何分解这些信息的。

首先是“类子网掩码”,它将用于确定IP地址的多少位构成类。用于该类的任何位都不能用于子网或主机ID(主机ID是网络上的实际单个节点)。

然后是“子网掩码”,它告诉您哪些位构成了您的子网ID与您的主机ID。

最后,您有您的“网络ID”,它显示了将用于所有子网和主机ID的实际前缀。如下:

类子网掩码: 255.0.0.0 (二进制Rep: 111111.00000000.00000000.00000000)

子网掩码: 255.255.128.0 (二进制记录:11111111111111.10000000.00000000)

网络ID: 16.0.0.0 (二进制请求:00010000.00000000.000000.000000.000000.00000000)

我们知道,由类子网掩码设置的位是为您的网络ID保留的(即不能由子网使用),我们还知道子网掩码没有设置的位是为主机保留的(子网掩码末尾的最后15位)。

这意味着我们要计算出子网掩码中的1s中有多少是子网掩码的唯一,而不包括在您的类掩码中。在我们的示例中,十进制表示为‘0.255.128.0’,二进制表示为‘00000000.1111111110000000.00000000’。

因此,我们有9位子网寻址空间,如果取2^9,则得到512个可能的子网ID。然后,根据我们的网络ID 16.0.0.0,我们的子网ID从16.0.0.0到16.255.128.0不等。我们还知道每个子网可以有32,768台主机。例如,如果您的网络id和子网id等于16.0.0.0,那么主机的范围可以是16.0.0.1到16.0.127.255。

使用Python "ipaddress“库实现解决方案

使用python中的“ipaddress”库,我们可以很容易地解决查找所有可能的子网的问题。我将张贴示例代码,然后解释如下。

代码语言:javascript
复制
import ipaddress

# Here I've left your variables exactly as they were in case this format is a requirement.
networkID = '16.0.0.0'
subnetRequested = '500'
classfulSubnetMask = '255.0.0.0'
subnetMask = '255.255.128.0'
octetInterest = 3
magicNumber = 128

# Calculate how many 1's are set in the binary forms of both net masks
subnetMaskBits = bin(int(ipaddress.IPv4Address(subnetMask))).count("1")
classfulMaskBits = bin(int(ipaddress.IPv4Address(classfulSubnetMask))).count("1")

# Create an ip_network object using our network address and in CIDR notation
fullAddress = ipaddress.ip_network(networkID + "/" + str(classfulMaskBits))

# Print out all possible subnets against our fulladdress with subnet mask
output = list(fullAddress.subnets(prefixlen_diff=(subnetMaskBits-classfulMaskBits)))

# Print the addresses (note there are going to be a LOT of them)
print (output)

代码相对来说是直截了当的,但是有一些事情可能需要解释。首先,我们计算了1的数目,在这两种网络掩码二进制形式。然后,我们创建一个ip_network对象( python库的一部分),并使用CIDR符号对其进行初始化。

CIDR代表无类域间路由,在现实世界中使用的是classful (我们在您的示例中使用的)。在这里,我们使用它只是因为它允许我们轻松地计算出子网ID。

CIDR表示法如下(16.0.0.0/8),其中“/8”表示掩码中1的数目。因此,对于完整地址,我们从类子网掩码中传递1的数目,即8。

这个python库有一个名为“子网”的函数,它将完成您的问题所要求的功能。这里唯一需要知道的是“prefixlen_diff”参数。这个参数基本上是说为子网is保留了多少位。这将等于我们从子网掩码中减去的一流掩码中的1的数目(如上面所解释的)。

要更清楚地总结这一点:

网络IP地址: 16.0.0.0

级面具: 255.0.0.0 (111111.00000000.000000.00000000)

经典面具1:8

网络IP CIDR符号: 16.0.0.0/8

然后用于子网的

子网掩码: 255.255.128.0 (11111111111111.10000000.00000000)

子网掩码中的1: 17

子网掩码特有的1:9 (00000000.11111111.10000000.00000000)

全部应用于这一行代码:

代码语言:javascript
复制
output = list(fullAddress.subnets(prefixlen_diff=(subnetMaskBits-classfulMaskBits)))

其中prefixlen_diff为9(17-8),fullAddress为"16.0.0.0/8“。

我们使用list调用子网方法来迭代所有可能的子网ID。实际上,我们根本不需要octetInterest或magicNumber变量。

希望我回答了您想问的问题,但是如果您想要的是另一种输出,我可以根据需要编辑它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63019003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档