IPv6地址范围

6

这篇文章之后,我对搜索IPv6地址范围感兴趣。

在IPv4下,我可以确定ISP提供的起始和结束IP地址,并使用这些整数值作为范围边界快速搜索数据库,以查看数据库中是否有任何条目落入该范围内。

IPv6会受到什么影响? ISP是否仍将拥有类似现在的IPv6地址范围?如果您将IPv6地址存储为SQL Server DB中的两个bigint,则如何有效地搜索这些范围?


以下线程是由@vinS建议作为您的IPv6问题的解决方案:https://dev59.com/qHVD5IYBdhLWcg3wNIvc - datv
2个回答

8
不正确的做法是使用IP地址范围(无论是IPv4还是IPv6)。将特定的IP地址“范围”分组的正确方法是使用前缀(CIDR表示法)或掩码(已过时,仅适用于IPv4,并且如果尝试使用非连续掩码会产生混乱)。
有时您会看到某些人(甚至是应用程序、家庭路由器等)使用IPv4范围,但那只是错误的做法。
使用无类域间路由(CIDR),您将拥有一个元组,其中Address是128位无符号整数,Prefix是一个小的(0..128)无符号整数。前缀告诉我们地址中最高有效位的数量,留下另外的128-Prefix个最低有效位代表该网络中的特定主机。
因此,例如,IPv6“范围”2620:0:860:2::/64(wikimedia.org)代表从2620:0:860:2::到2620:0:860:2:FFFF:FFFF:FFFF:FFFF的所有主机。

如果您想将这样的值存储在数据库中,不应该使用两个“bigint”,而应该使用任何本地表示在单个列中,除非您想让开发人员的生活变成一场噩梦。如果您的DBMS不支持如此大的整数,除了替换您的DBMS外,我建议使用一个固定大小的二进制数据列,长度为16字节。


4

使用支持IPv6地址的数据库管理系统并不是一个坏主意。以下是一个使用PostgreSQL 8.3的例子:

mydb=> CREATE TABLE Networks (name TEXT, prefix INET);
CREATE TABLE
mydb=> INSERT INTO Networks VALUES ('Documentation', '2001:DB8::/32');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('ULA', 'FC00::/7');
INSERT 0 1
mydb=> INSERT INTO Networks VALUES ('Orchid', '2001:10::/28');
INSERT 0 1

mydb=> SELECT * FROM Networks;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
 ULA           | fc00::/7
 Orchid        | 2001:10::/28
(3 rows)

mydb=> SELECT * FROM Networks WHERE '2001:DB8::dcaf:BAD' << prefix;
 name      |    prefix     
---------------+---------------
 Documentation | 2001:db8::/32
(1 row)

1
PostgreSQL真是个不错的选择。如果切换数据库管理系统能像鼓掌那样容易就好了 :) - Halil Özgür

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接