C#如何知道子网是否是更大网络的一部分

时间:2010-07-19 09:03:57

标签: c# networking ip

我正在使用Internet的一个BGP表(一个巨大的文件)。但是,路由汇总可能是个问题。我的主要问题是,有时会宣布大块的IPv4空间(即172.16.0.0/16),但也会公布更具体和更小的路由(即172.16.64.0/18)。因此BGP表中有两个冗余条目。

我想找到一种方法来结束非冗余IP地址列表,只是大块。我想也许比较所有这些并将它们存储在列表中。 C#中是否有方法知道IP地址是否是更广泛IP地址的一部分?如:

172.16.64.0/18是172.16.0.0/16 // true的一部分

非常感谢你的帮助!

alemangui

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

考虑位模式:

172.16.64.0

10101100.00010000.01000000.00000000

172.16.0.0

10101100.00010000.00000000.00000000

请注意,更具体地址中的设置位是更一般地址中的设置位,再加上更多。因此,如果我们对两个地址执行按位AND,则结果将等于更一般的。

这总是一个正确的测试吗?好吧,如果我们有两个地址 not 有一个包含关系,那么这些位的AND值会明显给出一个至少与建议的父级有一点不同的结果,所以这就是我们想要的测试。

如果您知道您的两个地址中的哪一个是建议的父级,哪个是建议的子级,那么我们可以简单地对这些位进行比较并与建议的父级进行比较。如果它们可以按任意顺序排列,并将它们分别与两个输入进行比较。

要获得实际位,如果您已有IPAddress,请使用GetAddressBytes获取byte[],使用BitConverter获取unit ,然后只使用&进行按位AND。