首页 > 编程知识 正文

ipv6地址类型,ipv6地址格式

时间:2023-05-04 23:26:26 阅读:273745 作者:2665

IPv6介绍

IPV6的长度是128位,相比于ipv4的32位,极大的扩展了ip地址可用空间。ipv4地址现在被视为一种稀缺资源,而ipv6地址相当充足,在可以预见的未来是用不完的。这有一段描述:如果地球表面(含陆地和水面)都覆盖着计算机,那么IPv6允许每平方米拥有7*10^23个IP地址;如果地址分配的速率是每微秒100万个,那么需要10^19年才能将所有的地址分配完毕。

IPv6地址

IPv6的128位地址通常写成8组,每组为四个十六进制数的形式。比如:

AD80:0000:0000:0000:ABAA:0000:00C2:0002

是一个合法的IPv6地址。这个地址比较长,看起来不方便也不易于书写。零压缩法可以用来缩减其长度。如果几个连续段位的值都是0,那么这些0就可以简单的以::来表示,上述地址就可写成:

AD80::ABAA:0000:00C2:0002

这个简化只能用一次,在上例中的ABAA后面的0000就不能再次简化。当然也可以在ABAA后面使用::,这样的话前面的12个0就不能压缩了。这个限制的目的是为了能准确还原被压缩的0,不然就无法确定每个::代表了多少个0。例如,下面是一些合法的IPv6地址:

CDCD:910A:2222:5498:8475:1111:3900:2020

1030::C9B4:FF12:48AA:1A2B

2000:0:0:0:0:0:0:1

::0:0:0:0:0:0:1

2000:0:0:0:0::

校验代码:

import java.text.Normalizer;

import java.text.Normalizer.Form;

import java.util.regex.Matcher;

import java.util.regex.Pattern;

public class IPV6Test {

public static void main(String[] args) {

String ipv61 = "2001:db8:a583:64:c68c:d6df:600c:ee9a";

String ipv62 = "2001:db8:a583::9e42:be55:53a7";

String ipv63 = "2001:db8:a583:::9e42:be55:53a7";

String ipv64 = "1:2:3:4:5::";

String ipv65 = "CDCD:910A:2222:5498:8475:1111:3900:2020";

String ipv66 = "1030::C9B4:FF12:48AA:1A2B";

String ipv67 = "2000:0:0:0:0:0:0:1";

String ipv68 = "::0:0:0:0:0:0:1";

String ipv69 = "2000:0:0:0:0::";

System.out.println("check > " + ipv61 + " > " + isValidIpv6Addr(ipv61));

System.out.println("check > " + ipv62 + " > " + isValidIpv6Addr(ipv62));

System.out.println("check > " + ipv63 + " > " + isValidIpv6Addr(ipv63));

System.out.println("check > " + ipv64 + " > " + isValidIpv6Addr(ipv64));

System.out.println("check > " + ipv65 + " > " + isValidIpv6Addr(ipv65));

System.out.println("check > " + ipv66 + " > " + isValidIpv6Addr(ipv66));

System.out.println("check > " + ipv67 + " > " + isValidIpv6Addr(ipv67));

System.out.println("check > " + ipv68 + " > " + isValidIpv6Addr(ipv68));

System.out.println("check > " + ipv69 + " > " + isValidIpv6Addr(ipv69));

}

public static boolean isValidIpv6Addr(String ipAddr) {

String regex = "(^((([0-9A-Fa-f]{1,4}:){7}(([0-9A-Fa-f]{1,4}){1}|:))"

+ "|(([0-9A-Fa-f]{1,4}:){6}((:[0-9A-Fa-f]{1,4}){1}|"

+ "((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"

+ "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"

+ "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"

+ "(([0-9A-Fa-f]{1,4}:){5}((:[0-9A-Fa-f]{1,4}){1,2}|"

+ ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"

+ "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"

+ "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"

+ "(([0-9A-Fa-f]{1,4}:){4}((:[0-9A-Fa-f]{1,4}){1,3}"

+ "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"

+ "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|"

+ "([0-9]){1,2})){3})|:))|(([0-9A-Fa-f]{1,4}:){3}((:[0-9A-Fa-f]{1,4}){1,4}|"

+ ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"

+ "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"

+ "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"

+ "(([0-9A-Fa-f]{1,4}:){2}((:[0-9A-Fa-f]{1,4}){1,5}|"

+ ":((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"

+ "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"

+ "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))"

+ "|(([0-9A-Fa-f]{1,4}:){1}((:[0-9A-Fa-f]{1,4}){1,6}"

+ "|:((22[0-3]|2[0-1][0-9]|[0-1][0-9][0-9]|"

+ "([0-9]){1,2})([.](25[0-5]|2[0-4][0-9]|"

+ "[0-1][0-9][0-9]|([0-9]){1,2})){3})|:))|"

+ "(:((:[0-9A-Fa-f]{1,4}){1,7}|(:[fF]{4}){0,1}:((22[0-3]|2[0-1][0-9]|"

+ "[0-1][0-9][0-9]|([0-9]){1,2})"

+ "([.](25[0-5]|2[0-4][0-9]|[0-1][0-9][0-9]|([0-9]){1,2})){3})|:)))$)";

if (ipAddr == null) {

System.out.println("ipv6 addresss is null ");

return false;

}

ipAddr = Normalizer.normalize(ipAddr, Form.NFKC);

Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(ipAddr);

boolean match = matcher.matches();

if (!match) {

// System.out.println("invalid ipv6 addresss = " + ipAddr);

}

return match;

}

}

测试结果:

check > 2001:db8:a583:64:c68c:d6df:600c:ee9a > true

check > 2001:db8:a583::9e42:be55:53a7 > true

check > 2001:db8:a583:::9e42:be55:53a7 > false

check > 1:2:3:4:5:: > true

check > CDCD:910A:2222:5498:8475:1111:3900:2020 > true

check > 1030::C9B4:FF12:48AA:1A2B > true

check > 2000:0:0:0:0:0:0:1 > true

check > ::0:0:0:0:0:0:1 > true

check > 2000:0:0:0:0:: > true

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。