Closed. This question is off-topic。它当前不接受答案。
想改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。
已关闭8年。
Improve this question
从this post开始,我对搜索IPv6地址范围感兴趣。
在IPv4下,我将能够确定ISP提供的起始IP地址和结束IP地址,并使用这些整数值作为范围边界来快速搜索数据库,以查看数据库中是否有任何条目属于该范围。
IPv6将如何影响这一点? ISP仍会像现在一样在范围内保留IPv6地址吗?如果将IPv6地址作为两个bigint存储在SQL Server DB中,又将如何有效地搜索这些范围?
想改善这个问题吗? Update the question,所以它是用于堆栈溢出的on-topic。
已关闭8年。
Improve this question
从this post开始,我对搜索IPv6地址范围感兴趣。
在IPv4下,我将能够确定ISP提供的起始IP地址和结束IP地址,并使用这些整数值作为范围边界来快速搜索数据库,以查看数据库中是否有任何条目属于该范围。
IPv6将如何影响这一点? ISP仍会像现在一样在范围内保留IPv6地址吗?如果将IPv6地址作为两个bigint存储在SQL Server DB中,又将如何有效地搜索这些范围?
最佳答案
在范围内使用IP地址(既不是IPv4,也不是IPv6)是不正确的。对IP地址的特定“范围”进行分组的正确方法是使用前缀(CIDR表示法)或掩码(已过时,仅对IPv4有效,如果尝试使用不连续的掩码,则会引起困惑)。
有时您会看到有人在使用IPv4范围(有时甚至是应用程序,家用路由器等),但这只是错误的方法。
使用Classless Inter-Domain Routing (CIDR),您将具有一个元组,其中Address是一个128位无符号整数,而Prefix是一个很小的(0..128)无符号整数。前缀告诉地址中有多少个最高有效位代表网络地址,其余的128个前缀最低有效位代表该网络中的特定主机。
因此,例如,IPv6“范围”为2620:0:860:2:://64(wikimedia.org)表示从2620:0:860:2::到2620:0:860:2的所有主机: FFFF:FFFF:FFFF:FFFF。
您不应使用两个“bigint”将这样的值存储在数据库中,而应在单个列中使用任何 native 表示形式,除非您想让开发人员的生活变成一场噩梦。如果您的DBMS不支持这么大的整数,则除了替换您的DBMS之外,我建议使用16字节长的固定大小的二进制数据列。
关于ipv6 - IPv6地址范围,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/774976/