Postgres 中的 IPv6 子网划分

uns*_*age 3 postgresql

我使用的是 postgres 9.5,我想知道 postgres 是否允许对 IP 地址进行任何类型的子网划分或计算,特别是 IPv6。我知道他们有存储数据的cidr格式,如 IpV4 和 Ipv6 格式。但是,我可以做任何事情,例如找出存储在数据库中的子网中有多少个客户端 IP?

例如。如果我存储了 的 IPv6 地址2001:dd8::/64,我能否找出有多少主机 IP(根据某些计算器,为 18446744073709551616)。

我的猜测是答案是否定的,postgres 不支持这一点。

dez*_*zso 5

作为3manuek提到的,还有功能和运营商应对IP地址-无论是IPv4或IPv6。

我有点想知道你的号码是从哪里来的。您提供的地址范围转换为

2001:0dd8:0000:0000:0000:0000:0000:0000
Run Code Online (Sandbox Code Playgroud)

这是一个长度为 1 的地址范围。

如果您的意思是所有可能的地址都以 '2001:dd8:' 开头,那么该范围的正确名称应该是2001:dd8::/32,因为它是给出的前 32 位。根据计算器工具,结果范围如下:

Start Range: 2001:dd8:0:0:0:0:0:0
End Range: 2001:dd8:ffff:ffff:ffff:ffff:ffff:ffff
No. of host: 79228162514264337593543950336
Run Code Online (Sandbox Code Playgroud)

同时,如果您省略块大小 ( /32),您将获得一个地址(我在上面显示的地址)。

因此,有一种方法可以使用内置的 PostgreSQL 功能来获取计算器提供的数字。我们这里的朋友是masklen()

SELECT round(2 ^ (128 - masklen('2001:dd8::/32'::cidr))::numeric);

             round             
???????????????????????????????
 79228162514264337593543950336
Run Code Online (Sandbox Code Playgroud)

结果与计算器的形式相同。四舍五入是为了去除小数点和小数点后面的零,这是转换为 的结果numeric