本文对初步接触到ipv6时,常遇到的三个疑问(ipv6的表示、ipv6与ipv4之间的转换、ipv6地址大小判定)进行了简单介绍。
ipv6的表示
关于单个ipv6地址的基本表示有:标准表示、压缩表示、ipv4内嵌表示,网段的表示常见的有:地址前缀表示(类似于ipv4的掩码形式)
-----------------------------
IPV6地 示32位的 址被分割为,其中每个,并且每个 来分开128位的16位段来表示0x0000~0xFFFF之间的十六进制的数宇表示 ∶:
0100
∶
00bc
∶
,
当然书写这些地址也不是一件令人愉快的事情
。
幸运地是有两条规则可以用来简化
:
任何一个
;
任何一个
,
就认为忽略书写的数字是起始的
3
、
6
和
,
该
1944
∶
0
∶
d0b
。
这里要注意的是
;
末
,
因为这样做会使
0
是在所写的数字之前还是在其之后。
另外
5
个分段全部是
,
有
址中具有—长串的
ff02
∶
0000
∶
0000
∶
ff02
∶
0
∶
0
∶
:
任何由全
16
位段的单个连续的字符串
,
上面例子中的地址可以表示成如下格式
,
这条规则强调的是仅仅对于单个连续不间断的全
,
在一个
:
0000
∶
0000
∶
,
以
为它们都只使用了
2001
∶
0
∶
2001
∶
0
∶
,
请读者注意
,
因
2001
∶
95
之所以认为上面这个缩写方式是错误的
0
字符串的长度是含混不清的
址
0d02
∶
0014
∶
0095
0000
∶
0014
∶
2001
∶
0014:0000
∶
0095
不像
)
可以通过点分十进制或十六进制地址掩码标识
,IPv6
协议的前缀始终通过位计数的方式来标识。更确切地说
/
”
IPv6
地址的起始位有多少位是前缀位
。举一个例子
:3ffe
∶
a
∷
d0b/64
。
当读者需要书写一个
IP
叫地址一样的书写方式将所有的主机位设置为
3ffe
∶
a
∷
成的
在本书中
第—个实例就是缺省地址
中讨论
形式
/0
第二个使用全 址的实例是未指定地址,用来标识一个还未确定的实际,它与缺省地址的书写方式是有区别的/128。
-----------------------------
除上述形式外,在实际应用中还可能遇到一种情况,如下所示:
短格式地址段表示为:”2001:d02::14:0:0:95-25f4:55ed”(单个ipv6基本表示-不包含::的单个ipv6后半部分表示)
长格式地址段表示为:”2001:d02::14:0:0:95-::25f4:55ed”(单个ipv6基本表示-单个ipv6基本表示)
所表示的是一组ipv6地址范围,此范围以第一个ipv6地址为起点至第二个ipv6地址或者补全的ipv6地址为终点。
ipv6与ipv4之间的转换
由于ipv4到ipv6之间有一个漫长的过渡过程,因此,需要将ipv6兼容ipv4或者映射为ipv4。
在兼容情况下:如果ipv4表示为“X.X.X.X”,那么对应的ipv6即为“::X.X.X.X”(高位补零)
在映射情况下:如果ipv6表示为“::FFFF:X.X.X.X”(33-128位为::FFFF),这类情况下的ipv6将会被映射为ipv4,使用java.net.InetAddress包中的InetAddress.getByName(str)方法将自动实现映射。
ipv6地址大小判定思路
在实际处理ipv6的过程中常常会需要对ipv6的大小进行判定,用于排序、判断区间等应用。但是,直接按照字符串进行比较会出现判定不正确的问题,比如,2001:d02::14:0:0:95会比2001:1d02::14:0:0:95大,而实际是更小。因此,在ipv6排序的时候需要对ipv6字符串进行处理。
1.首先,将ipv6转换为字符串(java下,使用getHostAddress()方法);
2.将所有形式的ipv6地址字符串转换为完整形式的ipv6字符串(XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX),即,将压缩掉的0全部补全;
3.对字符串进行字符串比较即可。
ps:同样的思路可应用于ipv4的排序中。