代码之家  ›  专栏  ›  技术社区  ›  Kirk Liemohn

如何确定两个IPv6地址之间的相等性?

  •  15
  • Kirk Liemohn  · 技术社区  · 16 年前

    我有一个应用程序,它允许管理员指定有效的IP地址,从中可以发出Web服务请求。我只需获取配置的IP地址,并将它们与传入请求进行比较。比较两个IPv4地址很简单,我认为比较两个IPv6地址也可以。

    然而,当我注意到IPv6地址有点复杂时,我对网络的无知开始显现出来。我注意到的一个问题是,如果我查看计算机上的IP地址(查看的是VMware控制台显示的IP地址)与Web请求中的IP地址( HttpContext.Current.Request.UserHostAddress 在.NET中)我注意到其中一个以%10结尾,另一个以%11结尾:

    • ipconfig显示:fe80:8179:5576:c6d0:8b16%11
    • 用户主机地址显示:fe80::8179:5576:c6d0:8b16%10

    唯一的区别是%10和%11-什么给予?

    我还看到ipv6地址以“/”结尾,后跟2位数字。在进行比较时,我应该忽略最后3位数字(如果存在)吗?如果是这样,我需要寻找的有效的替代结尾是什么?

    -------编辑---------

    这是我的解决方案,基于提供的答案…

    我只需存储一个“已清除”的IP地址,并将其与“已清除”的IP地址进行比较。这里使用.NET是我清理IP地址的方法。从性能的角度来看不是最好的,但它确实有效。我宁愿做一个比较 GetAddressBytes() 但我正在使用 Dictionary 我决定反对创造我自己的 ByteComparer .

    IPAddress incomingIp = null;
    bool ipAddressParsePassed = IPAddress.TryParse(userHostAddress, out incomingIp);
    if (ipAddressParsePassed)
    {
        IPAddress scrubbedIp = new IPAddress(incomingIp.GetAddressBytes());
        string scrubbedIpStr = scrubbedIp.ToString()
    }
    
    4 回复  |  直到 11 年前
        1
  •  16
  •   unwind    16 年前

    Wikipedia states :

    因为所有链接本地地址 主机有一个共同前缀,正常 路由过程不能用于 选择传出接口的时间 将数据包发送到本地链接 目的地。特殊标识符, 称为区域索引,需要 提供附加路由 信息;对于本地链接 地址、区域索引与 接口标识符。

    当一个地址以文本形式书写时, 区域索引附加到 地址,用百分号分隔 “%”。区域索引的实际语法 取决于操作系统[…]

    因此,这些后缀是区域指示器,将地址与物理接口关联起来。这也解释了为什么有线和无线接口之间的充分性不同。

    为了帮助回答这个问题,我认为在任何比较中都不应该包含后缀。根据定义,ipv6地址为128位,后缀是严格意义上的本地信息,在您自己的机器和当前操作系统之外没有意义。

    比较128位就足够了。

        2
  •  3
  •   Steve-o    16 年前

    唯一的区别是%10和%11 -给什么?

    这些是IPv6 zone identifiers ,链接本地地址,即fe80前缀,仅保证在本地链接上是唯一的。这意味着地址fe80:8179:5576:c6d0:8b16%11和fe80::8179:5576:c6d0:8b16%10可能指不同的机器,一个必须通过接口10访问,另一个必须通过接口11访问。

    请看一下 sockaddr_in6 ,

    struct sockaddr_in6 {
      short sin6_family;
      u_short sin6_port;
      u_long sin6_flowinfo;
      struct in6_addr sin6_addr;
      u_long sin6_scope_id;
    };
    

    您需要比较家庭、地址和范围ID字段以获得完全匹配。

        3
  •  1
  •   blank    16 年前

    最后带有/和数字的地址使用无类域间路由(CIDR)表示法。它们可以表示实际地址或网络。如果在/之前有一个零或::,那么它就是一个网络。

    CIDR notation

        4
  •  0
  •   Suroot    16 年前

    ipv6在ipv4中仅为128位,而在ipv4中仅为32位;您应该能够进行逐字节比较。