首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >IPv6地址范围

IPv6地址范围
EN

Stack Overflow用户
提问于 2009-04-21 22:38:57
回答 2查看 11K关注 0票数 6

this post开始,我对搜索IPv6地址范围很感兴趣。

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

这将如何受到IPv6的影响?互联网服务提供商的IPv6地址还会像现在一样在范围内吗?如果在SQL Server DB中将IPv6地址存储为两个大整数,如何有效地搜索这些范围?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2009-04-21 23:14:18

在范围中使用IP地址(既不是IPv4,也不是IPv6)是不正确的。对特定“范围”的IP地址进行分组的正确方法是使用前缀(CIDR表示法)或掩码(已过时,仅对IPv4有效,如果您尝试使用不连续的掩码,则会导致混乱)。

有时您会看到有人(有时甚至是应用程序、家庭路由器等)使用IPv4范围,但这是错误的做法。

使用Classless Inter-Domain Routing (CIDR),您将拥有一个元组< Address,Prefix>,其中Address是一个128位的无符号整数,Prefix是一个极小的(0..128)无符号整数。前缀表示地址的多少个最高有效位代表网络地址,剩下的128个前缀最低有效位代表该网络中的特定主机。

例如,IPv6“范围”2620:0:860:2::/64 (wikimedia.org)表示从2620:0:860:2::到2620:0:860:2:FFFF:FFFF的所有主机。

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

票数 8
EN

Stack Overflow用户

发布于 2009-04-22 20:25:29

使用具有对IPv6地址的适当支持的数据库管理系统将不是一个坏主意。下面是8.3版PostgreSQL的一个示例:

代码语言:javascript
运行
复制
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)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/774976

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档