尝试创建一个函数,返回所有可能的子网ID的列表,给定网络ID、子网掩码、默认掩码、感兴趣的八进制和神奇的数字。在函数内部,我觉得这个类子网掩码也必须使用,但似乎可以编写一个有用的过程。
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))发布于 2020-07-21 19:58:08
网络与主机ID的解释
通常有两种类型的IPv4寻址方法,classful和classful。由于您的示例包含有关类子网的信息,我将假设您希望计算出给定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”库,我们可以很容易地解决查找所有可能的子网的问题。我将张贴示例代码,然后解释如下。
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)
全部应用于这一行代码:
output = list(fullAddress.subnets(prefixlen_diff=(subnetMaskBits-classfulMaskBits)))其中prefixlen_diff为9(17-8),fullAddress为"16.0.0.0/8“。
我们使用list调用子网方法来迭代所有可能的子网ID。实际上,我们根本不需要octetInterest或magicNumber变量。
希望我回答了您想问的问题,但是如果您想要的是另一种输出,我可以根据需要编辑它。
https://stackoverflow.com/questions/63019003
复制相似问题