我有一个应用程序,允许管理员指定可以从中发出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位就足够了.
维基百科说:
由于主机中的所有链路本地地址都具有公共前缀,因此在将数据包发送到链路本地目标时,不能使用正常的路由过程来选择出接口.需要一个特殊的标识符,称为区域索引,以提供额外的路由信息; 在链路本地地址的情况下,区域索引对应于接口标识符.
以文本方式写入地址时,区域索引将附加到地址,以百分号"%"分隔.区域索引的实际语法取决于操作系统[...]
因此,这些后缀是区域指示符,它将地址与物理接口相关联.这也解释了为什么有线和无线接口之间的足够差异.
为了帮助回答这个问题,我不认为后缀应该包含在任何比较中.根据定义,IPv6地址是128位,后缀是严格的本地信息,在您自己的机器和它当前的操作系统之外没有意义.
比较128位就足够了.