【问题标题】:C# How to know if a subnet is part of a bigger networkC#如何知道子网是否是更大网络的一部分
【发布时间】:2010-07-19 09:03:57
【问题描述】:

我正在处理 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

非常感谢您的帮助!

阿勒曼吉

【问题讨论】:

    标签: c# networking ip


    【解决方案1】:

    使用简单的数学。

    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
    

    【讨论】:

      【解决方案2】:

      考虑位模式:

      172.16.64.0
      
      10101100.00010000.01000000.00000000
      
      172.16.0.0
      
      10101100.00010000.00000000.00000000
      

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

      这总是正确的测试吗?好吧,如果我们有两个地址有包含关系,对这些位进行“与”运算显然会得到一个结果,该结果与提议的父级至少有一位不同,所以这就是我们想要的测试。

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

      要获得实际位,如果您已经有IPAddress,请使用GetAddressBytes 获得byte[],使用BitConverter 获得unit,然后只需使用& 进行位运算和。

      【讨论】:

        猜你喜欢
        • 2012-03-23
        • 1970-01-01
        • 1970-01-01
        • 2018-11-16
        • 1970-01-01
        • 2013-04-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多