2010-07-19 92 views
2

我正在使用互聯網的BGP表(一個巨大的文件)。但是,路由彙總可能是一個問題。我的主要問題是,有時會公佈大塊的IPv4空間(即172.16.0.0/16),但也會公佈更具體和更小的路由(即172.16.64.0/18)。所以BGP表中有兩個冗餘項。C#如何知道一個子網是否是一個更大的網絡的一部分

我想找出一種方法來結束非冗餘IP地址列表,只是大塊。我正在考慮將它們全部進行比較並將它們存儲在列表中。 C#中是否有方法來知道IP地址是否是更廣泛的IP地址的一部分?如:

172.16.64.0/18是172.16.0.0/16部分//真正

非常感謝您的幫助!

alemangui

回答

3

使用簡單的數學。

IP地址是4個字節,是一個32位整數。子網掩碼完全相同。

鑑於此,您可以使用算術AND來確定它是否位於已定義網絡的內部或外部。

EG:

IP: 192.168.0.1  = C0 . A8 . 00 . 01 
Subnet: 192.168.0.0 = C0 . A8 . 00 . 00 

Is in subnet? 
Thus 0xC0A80001 & 0xC0A80000 == 0xC0A80000 => true 

要回答的另一個是否存在一個網絡工作的問題,你可以使用相同的方法,但正確的兩個數字與「最大」子網的規模轉移。

EG:

Net A: 172.16.64.0/18 -> AC 10 40 00 
Net B: 172.16.0.0/16 -> AC 10 00 00 

Thus right shift both with 16 and apply previous op. 

AC 10 & AC 10 == AC 10 -> true 
0

考慮位模式:

172.16.64.0 

10101100.00010000.01000000.00000000 

172.16.0.0 

10101100.00010000.00000000.00000000 

注意的是,在更具體的地址與位在更一般的地址設置位,再加上一些更。所以如果我們對這兩個地址執行按位AND,結果將等於更一般的。

這是否總是一個正確的測試?那麼,如果我們有兩個地址做而不是有一個包含關係,那麼對這些比特進行AND操作就會明顯給出一個結果,它至少有一個不同於提出的父項的位,所以這就是我們想要的測試。

如果你知道你的兩個地址中的哪一個是建議的父親,哪個是建議的孩子,那麼我們可以簡單地對這些位進行「與」運算,並與建議的父親進行比較。如果它們可以以任一順序排列,則將它們與兩個輸入分別進行比較。

要獲取實際的位,如果你已經有了一個IPAddress,使用GetAddressBytes得到byte[],使用BitConverter得到unit,那麼就使用&爲按位與。

相關問題