我要测试“IPv4映射地址”是否匹配某些ipv6网络前缀,如2001:db8 :: / 32。
我已阅读related link 1和related link 2,我了解如何测试地址是否位于子网中。
我不知道这些链接是否与我的上下文相关。根据我的理解,我们可以使用“映射”地址的有线格式创建128位IPv6地址,并将其传输到IPv6数据包标头中。但是,Java的InetAddress创建方法似乎坚持“映射”地址的原始意图:所有“映射”地址都返回Inet4Address对象。
如果我想像这样运行isInSubnet测试:
boolean inSubnet = (ip ^ subnet) & netmask == 0;
对于这种测试,我要将ip,subnet和netmask转换为整数或长整数。但是,如果子网和网络掩码表示为IPV6值且ip被强制为Inet4Address值,此测试是否会起作用?
答案 0 :(得分:0)
如果您有这样的奢侈,我建议您使用谷歌inetaddresses课程。它提供了一些很好的功能,可以用来强制使用IPv4,而不是。
答案 1 :(得分:0)
给定ipv4地址1.2.3.4,ipv4映射地址是:: ffff:1.2.3.4,它总是有前缀0 :: ffff:0:0/96
在任何情况下,通常用于测试ipv6地址是否在给定的子网中,您可以使用open-source IPAddress Java library进行IP地址操作,例如转换为/从ipv4 / ipv6和子网检查免责声明:我是项目经理。
示例代码:
String ipv6 = "2001:db8:57AB:0000:0000:0000:0000:0001";
String ipv6subnet = "2001:db8::/32";
String ipv4 = "1.2.3.4";
try {
IPAddressString ipv6addrstr = new IPAddressString(ipv6);
IPAddressString ipv6addrsubnetstr = new IPAddressString(ipv6subnet);
IPAddressString ipv4addrstr = new IPAddressString(ipv4);
IPAddress ipv6addr = ipv6addrstr.toAddress();
IPAddress ipv6addrsubnet = ipv6addrsubnetstr.toAddress();
IPAddress ipv4mappedaddr = ipv4addrstr.toAddress().toIPv6();
System.out.println(ipv6addrsubnet + " contains " + ipv6addr + " is " + ipv6addrsubnet.contains(ipv6addr)); //
System.out.println(ipv6addrsubnet + " contains " + ipv4mappedaddr + " is " + ipv6addrsubnet.contains(ipv4mappedaddr)); //
} catch(AddressStringException e) {
//e.getMessage has validation error
}
输出:
2001:db8:0:0:0:0:0:0/32 contains 2001:db8:57ab:0:0:0:0:1 is true
2001:db8:0:0:0:0:0:0/32 contains 0:0:0:0:0:ffff:102:304 is false