本文对初步接触到ipv6时,常遇到的三个疑问(ipv6的表示、ipv6与ipv4之间的转换、ipv6地址大小判定)进行了简单介绍。
ipv6的表示
关于单个ipv6地址的基本表示有:标准表示、压缩表示、ipv4内嵌表示,网段的表示常见的有:地址前缀表示(类似于ipv4的掩码形式)
-----------------------------
第二个使用全 址的实例是未指定地址,用来标识一个还未确定的实际,它与缺省地址的书写方式是有区别的/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的排序中。