簡體   English   中英

如何在 python 中獲取網絡的所有可能子網 ID?

[英]How to get all possible subnet ID of a network in python?

嘗試創建一個 function,它返回所有可能的子網 ID 的列表,給定網絡 ID、子網掩碼、默認掩碼、感興趣的八位字節和幻數。 在function里面,感覺好像也需要用到分類子網掩碼,不過好像可以寫一個有用的程序。

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

網絡和主機 ID 說明

通常有兩種類型的 IPv4 尋址方法,有類無類 由於您的示例包含有關分類子網划分的信息,因此我假設您要計算給定 IPv4 class 和子網掩碼的可能子網數。 如果您正在尋找其他內容,我可以根據需要編輯答案。

處理 IPv4 地址時有 5 類(A、B、C、D、E)。 每個 class 在 IP 地址的第一個八位字節(前 8 位)中確定。

您可以在此處閱讀有關確定 IPv4 class 的更多信息: https://www.tutorialspoint.com/ipv4/ipv4_address_classes.htm

應該注意的是,在實際場景中不再使用有類 IP 尋址。

話雖如此,根據您提供的示例,您將如何分解這些信息。

首先是“分類子網掩碼”,用於確定 IP 地址的多少位構成 class。 用於 class 的任何位都不能用於您的子網或主機 ID(主機 ID 是網絡上實際的單個節點)。

然后你有你的“子網掩碼”,它告訴你哪些位構成了你的子網 ID 和你的主機 ID。

最后,您有您的“網絡 ID ”,它向我們展示了將用於所有子網和主機 ID 的實際前綴。 所以如下:

有類子網掩碼: 255.0.0.0(二進制代表:11111111.00000000.00000000.00000000)

子網掩碼: 255.255.128.0(二進制代表:11111111.11111111.10000000.00000000)

網絡 ID: 16.0.0.0(二進制代表:00010000.00000000.00000000.00000000)

我們知道有類子網掩碼設置的位是為您的網絡 ID 保留的(即不能被子網使用),我們也知道子網掩碼未設置的位是為主機保留的(最后的 15 個 0)子網掩碼)。

這意味着我們要計算子網掩碼中的 1 中有多少是子網掩碼唯一的,並且不包含在您的分類掩碼中。 在我們的示例中,十進制表示為“0.255.128.0”,二進制表示為“00000000.11111111.10000000.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)

代碼相對簡單,但有幾件事可能需要解釋。 首先,我們計算兩個網絡掩碼二進制 forms 中 1 的數量。 然后我們創建一個 ip_network object(python ipaddress 庫的一部分)並使用 CIDR 表示法對其進行初始化。

CIDR 代表無類域間路由,在現實世界中用於代替有類(我們在您的示例中使用的)。 在這里我們使用它只是因為它可以讓我們輕松計算出我們的子網 ID。

CIDR 符號看起來像這樣(16.0.0.0/8),其中“/8”表示掩碼中 1 的數量。 因此,對於完整地址,我們從有類子網掩碼中傳入 1 的個數,即 8。

這個 python 庫有一個名為“子網”的 function,它將完全按照您的問題進行操作。 您在這里唯一需要知道的是“prefixlen_diff”參數。 這個論點基本上是說為我們的子網 ID 保留了多少位。 這將等於從子網掩碼中減去分類掩碼中 1 的數量(如上所述)。

更清楚地總結一下:

網絡 IP 地址: 16.0.0.0

有類掩碼: 255.0.0.0 (11111111.00000000.00000000.00000000)

經典面具 1 個: 8

網絡 IP CIDR 表示法: 16.0.0.0/8

然后對於子網:

子網掩碼: 255.255.128.0 (11111111.11111111.10000000.00000000)

1 在子網掩碼中: 17

1 對子網掩碼的唯一性: 9 (00000000.11111111.10000000.00000000)

全部適用於這行代碼:

output = list(fullAddress.subnets(prefixlen_diff=(subnetMaskBits-classfulMaskBits)))

其中fullAddress是“ 16.0.0.0/8”,prefixlen_diff是 9 (17 - 8)。

我們用 list 調用 subnets 方法來迭代出所有可能的子網 ID。 我們實際上根本不需要 octetInterest 或 magicNumber 變量。

希望我回答了您試圖提出的問題,但如果您正在尋找不同類型的 output,我可以根據需要進行編輯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM