从 net.CIDRMask 获取 ipv6 子网掩码
Getting ipv6 subnet mask from net.CIDRMask
我正在编写代码,并尝试添加 ipv6 支持。以下代码在当前的 ipv4 支持代码库中。该代码采用 ipv4 ip 地址并获取 /32 上地址的子网掩码。
// string of ip address
networkInterface["ip_address"] = v.IpAddress[0]
m := net.CIDRMask(v.IpConfig.IpAddress[0].PrefixLength, 32)
subnetMask := net.IPv4(m[0], m[1], m[2], m[3])
networkInterface["subnet_mask"] = subnetMask.String()
我知道 net.CIDRMask
适用于 ipv6,但我不确定如何将它与 ipv6 地址一起使用。
我现在正在测试ip地址以确定地址是ipv4还是ipv6:
testInput := net.ParseIP(v.IpAddress[0])
if testInput.To4() != nil {
// find ipv4 subnet mask
}
if testInput.To16() != nil {
// do ipv6 subnet mask
}
net.CIDRMask
的单元测试在此处提供了使用 ipv6 的示例:https://golang.org/src/net/ip_test.go
但这超出了我的 golang 经验和 ipv6 知识。
在 RTFM 处理文档时 https://golang.org/pkg/net/#CIDRMask 提及:
func CIDRMask(ones, bits int) IPMask
CIDRMask returns an IPMask consisting of `ones' 1 bits followed by 0s
up to a total length of `bits' bits. For a mask of this form, CIDRMask
is the inverse of IPMask.Size.
那么我为 ones
和 bits
使用什么值?
这是从 api 返回的内容:
$ govc vm.info -json vcsa | jq .VirtualMachines[0].Guest.Net[0].IpConfig.IpAddress [ {
"IpAddress": "10.20.128.218",
"PrefixLength": 22,
"Origin": "",
"State": "preferred",
"Lifetime": null } ]
提前致谢!
我不确定 PrefixLength
是什么,它可能是在您的一个结构中定义的某个字段,但它似乎不是 net
包中任何内容的字段,或者实际上在标准库中的任何地方:https://golang.org/search?q=PrefixLength.
所以我不确定 PrefixLength
会给出什么,但是,我可以告诉你:
- IPv4 地址由 32 位数据组成(256 x 256 x 256 x 256 总 IP),因此在处理 IPv4 时,
net.CIDRMask
的 bits
参数的值应为 32 .
- IPv4 地址有 128 位数据,所以
bits
参数是 128。
- 对应于单个 IP 的 CIDR 范围的子网掩码将具有最大数量,因此
ones
值为 32 或 128,具体取决于您使用的是 IPv4 还是 IPv6。
因此,对于 IPv4,您应该调用 net.CIDRMask(32, 32)
,对于 IPv6,您应该调用 net.CIDRMask(128, 128)
。由于这些每次都是完全相同的计算,因此您可以选择简单地将这些值预先设置为代码中的常量。正确的值为:
我正在编写代码,并尝试添加 ipv6 支持。以下代码在当前的 ipv4 支持代码库中。该代码采用 ipv4 ip 地址并获取 /32 上地址的子网掩码。
// string of ip address
networkInterface["ip_address"] = v.IpAddress[0]
m := net.CIDRMask(v.IpConfig.IpAddress[0].PrefixLength, 32)
subnetMask := net.IPv4(m[0], m[1], m[2], m[3])
networkInterface["subnet_mask"] = subnetMask.String()
我知道 net.CIDRMask
适用于 ipv6,但我不确定如何将它与 ipv6 地址一起使用。
我现在正在测试ip地址以确定地址是ipv4还是ipv6:
testInput := net.ParseIP(v.IpAddress[0])
if testInput.To4() != nil {
// find ipv4 subnet mask
}
if testInput.To16() != nil {
// do ipv6 subnet mask
}
net.CIDRMask
的单元测试在此处提供了使用 ipv6 的示例:https://golang.org/src/net/ip_test.go
但这超出了我的 golang 经验和 ipv6 知识。
在 RTFM 处理文档时 https://golang.org/pkg/net/#CIDRMask 提及:
func CIDRMask(ones, bits int) IPMask
CIDRMask returns an IPMask consisting of `ones' 1 bits followed by 0s up to a total length of `bits' bits. For a mask of this form, CIDRMask is the inverse of IPMask.Size.
那么我为 ones
和 bits
使用什么值?
这是从 api 返回的内容:
$ govc vm.info -json vcsa | jq .VirtualMachines[0].Guest.Net[0].IpConfig.IpAddress [ {
"IpAddress": "10.20.128.218",
"PrefixLength": 22,
"Origin": "",
"State": "preferred",
"Lifetime": null } ]
提前致谢!
我不确定 PrefixLength
是什么,它可能是在您的一个结构中定义的某个字段,但它似乎不是 net
包中任何内容的字段,或者实际上在标准库中的任何地方:https://golang.org/search?q=PrefixLength.
所以我不确定 PrefixLength
会给出什么,但是,我可以告诉你:
- IPv4 地址由 32 位数据组成(256 x 256 x 256 x 256 总 IP),因此在处理 IPv4 时,
net.CIDRMask
的bits
参数的值应为 32 . - IPv4 地址有 128 位数据,所以
bits
参数是 128。 - 对应于单个 IP 的 CIDR 范围的子网掩码将具有最大数量,因此
ones
值为 32 或 128,具体取决于您使用的是 IPv4 还是 IPv6。
因此,对于 IPv4,您应该调用 net.CIDRMask(32, 32)
,对于 IPv6,您应该调用 net.CIDRMask(128, 128)
。由于这些每次都是完全相同的计算,因此您可以选择简单地将这些值预先设置为代码中的常量。正确的值为: