我正在使用互联网的 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
非常感谢您的帮助!
阿莱曼吉
最佳答案
使用简单的数学。
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
关于C# 如何知道子网是否是更大网络的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3279664/