当前位置:  开发笔记 > IOS > 正文

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

如何解决《如何确定两个IPv6地址之间的相等性?》经验,为你挑选了1个好方法。

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

但是,当我注意到IPv6地址稍微复杂一点时,我的网络无知开始出现.我注意到的一个问题是,如果我查看机器上的IP地址(正在查看VMWare控制台显示的IP地址)与Web请求中的IP地址(HttpContext.Current.Request.UserHostAddress在.NET中),我注意到其中一个结束于%10和%11中的另一个:

ipconfig显示:fe80:8179:5576:c6d0:8b16%11

UserHostAddress显示: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()
}

unwind.. 17

维基百科说:

由于主机中的所有链路本地地址都具有公共前缀,因此在将数据包发送到链路本地目标时,不能使用正常的路由过程来选择出接口.需要一个特殊的标识符,称为区域索引,以提供额外的路由信息​​; 在链路本地地址的情况下,区域索引对应于接口标识符.

以文本方式写入地址时,区域索引将附加到地址,以百分号"%"分隔.区域索引的实际语法取决于操作系统[...]

因此,这些后缀是区域指示符,它将地址与物理接口相关联.这也解释了为什么有线和无线接口之间的足够差异.

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

比较128位就足够了.



1> unwind..:

维基百科说:

由于主机中的所有链路本地地址都具有公共前缀,因此在将数据包发送到链路本地目标时,不能使用正常的路由过程来选择出接口.需要一个特殊的标识符,称为区域索引,以提供额外的路由信息​​; 在链路本地地址的情况下,区域索引对应于接口标识符.

以文本方式写入地址时,区域索引将附加到地址,以百分号"%"分隔.区域索引的实际语法取决于操作系统[...]

因此,这些后缀是区域指示符,它将地址与物理接口相关联.这也解释了为什么有线和无线接口之间的足够差异.

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

比较128位就足够了.


链路本地范围地址,即具有保留的fe80 ::/10前缀的地址,具有链路本地范围,无需使用EUI地址中的已知功能进行自动配置.因此,范围标识符在比较时很重要.
推荐阅读
coco2冰冰
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有