我正在使用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
答案 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。