IPV6 到国家

Posted

技术标签:

【中文标题】IPV6 到国家【英文标题】:IPV6 to country 【发布时间】:2012-05-06 07:39:59 【问题描述】:

IP 版本 6 有一个简单的 IP 到国家/地区数据库 http://www.ip2location.com/free/ipv6

CREATE TABLE `ip2location_ipv6`(
    `ip_from` DOUBLE,
    `ip_to` DOUBLE,
    `ipv6_from` VARCHAR(40),
    `ipv6_to` VARCHAR(40),
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

此数据库的示例行值:

"42540528726795050063891204319802818560", "42540528806023212578155541913346768895", "2001:200::", "2001:200:ffff:ffff:ffff:ffff:ffff:ffff", "JP", "Japan"

现在我想获取 IP 地址的国家/地区名称。这是我的 SQL:

SQL = "SELECT country_code FROM ip2location_ipv6 WHERE " & IPNumber & " BETWEEN ip_from AND ip_to"

在这个sql中有一个参数叫做IPNumber。在 IPV4 中,我可以轻松计算 IPNumber。

IPV4: a.b.c.d  => IPNumber = a*(256*256*256) + b*(256*256) + C*(256) + d

或者我可以做到

IPNumber = (long)(uint)IPAddress.NetworkToHostOrder((int)IPAddress.Parse("IP_address_Version_4").Address);

但我在 C# 中没有针对 IPV6 的任何解决方案。例如它想在这个数据库中找到这个IP的国家名称“2001:DB8::dcaf:BAD”

【问题讨论】:

您没有指明数据库的品牌。一些 DBMS(如 PostgreSQL)多年来一直拥有本地 IP 地址 - v4 和 v6。 【参考方案1】:

从二进制转换为标准 IPv6 表示法:

IPAddress 类与public IPAddress(byte[] address) constructor 结合使用。

在构造函数中传入 IPv6 地址的字节数组,然后使用.ToString() 方法传递给print it in standard notation。


从标准 IPv6 表示法转换为二进制:

创建一个新的IPAddress 对象,并使用IPAddress.TryParse(string standardNotation) 将标准符号字符串转换为二进制值。

【讨论】:

数据库中的 ip_from 和 ip_to 列是双的。 IPAddress.TryParse(string standardNotation) 将 ip 转换为二进制。我想在这个查询中使用这个值 "SELECT country_code FROM ip2location_ipv6 WHERE " & IPNumber & " BETWEEN ip_from AND ip_to" 所以从 double 中获取字节并将它们传递进去。无论如何它们不能是 double,因为 double 只是 64 位,而 IPv6 地址是 128。 好点,双精度只有 15 位有效数字。这个数据库很糟糕。 我没有检查更改历史记录,但截至今天,DB 行包含用于 IPv4 值的 DOUBLE 和用于 IPv6 值的 VARCHAR(40)。 C# .NET 4.0 的示例代码可将 IPv6 地址字符串转换为 BigInteger。 ip2location.com/free/ipv6【参考方案2】:

您可以使用最新版本的 mysql 5.6 它已经支持 IPv6 和命令 INET6_ATON()、INET6_NTOA()。

您的餐桌将是 -

CREATE TABLE `ip2location_ipv6`(
    `ip_from` int(11) unsigned,
    `ip_to` int(11) unsigned,
    `ipv6_from` varbinary(16),
    `ipv6_to` varbinary(16),
    `country_code` CHAR(2),
    `country_name` VARCHAR(64),
    INDEX `idx_ip_from` (`ip_from`),
    INDEX `idx_ip_to` (`ip_to`),
    INDEX `idx_ip_from_to` (`ip_from`, `ip_to`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

【讨论】:

以上是关于IPV6 到国家的主要内容,如果未能解决你的问题,请参考以下文章

IPv6转换难点分析之一:国家监测指标(中科三方)

全球的IPv6部署急剧增加,但中国几乎没有一个地方部署?

腾讯云如何快速从IPv4向IPv6演进?

ipv6申请

使用 GeoIP 数据库的最佳方式

中科三方——IPv6升级改造安全策略之多段式防护