IPv6协议文档是RFC4291,128bit(16个字节),以冒号分隔,允许用双冒号"::"来压缩表示一串连续的0,但"::"只能使用一次。
- "0:0:0:0:0:ffff:0:0" -- "0:0:0:0:0:ffff:255.255.255.255" 用于将IPv4映射到IPv6
- "0:0:0:0:0:0:0.0.0.0"--"0:0:0:0:0:0:255.255.255.255" 能兼容IPv4的IPv6 (这个概念已废弃)
相关文章:《Go语言:整形数字字符串转换为IPv6地址字符串》
解析与转换示例:
package main
import (
"errors"
"fmt"
"math/big"
"net"
)
func Ipv6ToInt(ip net.IP) (*big.Int, error) {
if ip == nil {
return nil, errors.New("invalid ipv6")
}
IPv6Int := big.NewInt(0)
IPv6Int.SetBytes(ip)
return IPv6Int, nil
}
func convert(ipv6 string) {
ip := net.ParseIP(ipv6)
bi, err := Ipv6ToInt(ip)
if err != nil {
fmt.Printf("ip=%v err=%v\n", ipv6, err)
return
}
fmt.Printf("parsed=%v number=%v\n", ip, bi)
}
func main() {
fmt.Printf("\n---- IPv6常见例子 ----\n")
convert("2c0f:ffa1:0:0:0:0:0:0")
convert("2801:0137:ffff:ffff:ffff:ffff:ffff:ffff")
convert("2801:0137::ffff:ffff:ffff")
convert("::")
convert("2801::")
convert("::ffff")
fmt.Printf("\n---- 非法IPv6 ----\n")
//多个"::"
convert("2801:0137::ffff:ffff::ffff")
//取值超限
convert("2801:0137::ffff:ffff::ffffa1")
//少于16个字节
convert("2801:0137:ffff:ffff:ffff")
/*
2.5.5.1. IPv4-Compatible IPv6 Address
| 80 bits | 16 | 32 bits |
+--------------------------------------+--------------------------+
|0000..............................0000|0000| IPv4 address |
+--------------------------------------+----+---------------------+
The "IPv4-Compatible IPv6 address" is now deprecated because the
current IPv6 transition mechanisms no longer use these addresses.
New or updated implementations are not required to support this
address type.
*/
fmt.Printf("\n---- 能兼容IPv4的IPv6 (这个概念已废弃) ----\n")
convert("0:0:0:0:0:0:0.0.0.0")
convert("0:0:0:0:0:0:255.255.255.255")
convert("0:0:0:0:0:0:10.2.3.45")
convert("0:0:0:0:0:0:a02:32d")
convert("::10.2.3.45")
convert("::a02:32d")
/*
2.5.5.2. IPv4-Mapped IPv6 Address
| 80 bits | 16 | 32 bits |
+--------------------------------------+--------------------------+
|0000..............................0000|FFFF| IPv4 address |
+--------------------------------------+----+---------------------+
*/
fmt.Printf("\n---- IPv4映射成IPv6 ----\n")
convert("0:0:0:0:0:ffff:0:0")
convert("0:0:0:0:0:ffff:255.255.255.255")
convert("10.2.3.45")
convert("0000:0000:0000:0000:0000:ffff:10.2.3.45")
convert("0000:0000:0000:0000:0000:ffff:a02:32d")
convert("0:0:0:0:0:ffff:10.2.3.45")
convert("0:0:0:0:0:ffff:a02:32d")
convert("::ffff:10.2.3.45")
convert("::ffff:a02:32d")
}
输出:
---- IPv6常见例子 ----
parsed=2c0f:ffa1:: number=58569101037597416794711927206927400960
parsed=2801:137:ffff:ffff:ffff:ffff:ffff:ffff number=53174336847441874194254142093255507967
parsed=2801:137::ffff:ffff:ffff number=53174336768213711679990085974688268287
parsed=:: number=0
parsed=2801:: number=53174312128255169743780812907543003136
parsed=::ffff number=65535
---- 非法IPv6 ----
ip=2801:0137::ffff:ffff::ffff err=invalid ipv6
ip=2801:0137::ffff:ffff::ffffa1 err=invalid ipv6
ip=2801:0137:ffff:ffff:ffff err=invalid ipv6
---- 能兼容IPv4的IPv6 (这个概念已废弃) ----
parsed=:: number=0
parsed=::ffff:ffff number=4294967295
parsed=::a02:32d number=167904045
parsed=::a02:32d number=167904045
parsed=::a02:32d number=167904045
parsed=::a02:32d number=167904045
---- IPv4映射成IPv6 ----
parsed=0.0.0.0 number=281470681743360
parsed=255.255.255.255 number=281474976710655
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405
parsed=10.2.3.45 number=281470849647405