域名查找ip(程序员必会IPv6属性preferIPv4Stack)

背景说明公众号之前详细写过KAFKA ON IPV6相关的三篇系列文章。最近有朋友翻出来,私信关于如何开启、禁用IPV6相关内容。详细全面内容可以阅读:https://docs.oracle.com/javase/8/docs/technotes/guides/net/ipv6_guide/index.html考虑到有朋友不想看英文文档,这里转载部分别人已经写过的中文博客。http://xxgblog.com/2019/02/17/java-ipv6-system-properties/Java对IPv6的支持在Networking IPv6 User Guide文档中,介绍了Java对IPv6的支持情况:IPv6 in Java is transparent and automatic. Porting is not necessary; there is no need to recompile source files.Java中对IPv6的支持是透明的且自动化的,无需移植,也无需重新编译源码。相对于其他语言而言(例如C++),Java很好封装了IPv4和IPv6两种版本的不同,Java一般不需要在编写代码时关注IPv6如何支持,一个原本运行在IPv4环境的代码放到支持IPv6环境中一般也可以直接使用。Java IPv6相关系统属性由于Java封装了IPv4和IPv6的差异,在代码层面上不需要关注、也无法设置使用IPv4还是IPv6,Java提供了java.net.preferIPv4Stack、java.net.preferIPv6Addresses两个系统属性,用于设置协议栈和地址族的选择。这两个系统参数既可以在Java代码中设置:System.setProperty("java.net.preferIPv4Stack", "true");

System.setProperty("java.net.preferIPv6Addresses", "true");也可以在启动时通过JVM参数设置:-Djava.net.preferIPv4Stack=true

-Djava.net.preferIPv6Addresses=truejava.net.preferIPv4Stack(默认值false)官方文档解释:If IPv6 is available on the operating system, the underlying native socket will be an IPv6 socket. This allows Java applications to connect to, and accept connections from, both IPv4 and IPv6 hosts.java.net.preferIPv4Stack=false:在支持IPv6的双栈系统上,使用JavaSocket会默认通过底层native方法创建一个IPv6 Socket,这个IPv6 Socket可以同时支持和IPv4或IPv6主机通信。java.net.preferIPv4Stack=true,Java程序将无法使用IPv6进行网络通信,即仅支持IPv4。例如,当TCP客户端java.net.preferIPv4Stack设置为true时,创建一个host为IPv6的Socket,会抛出异常:java.net.SocketException: Protocol family unavailable当TCP服务器java.net.preferIPv4Stack设置为true时,通过IPv6访问会异常。System.setProperty("java.net.preferIPv4Stack", "true");
Socket socket = new Socket("::1", 80);
// 访问IPv6地址::1(相当于IPv4的127.0.0.1)的80端口会抛出异常在正常情况下,Tomcat或者Jetty等Java服务器启动后,可以使用浏览器通过IPv4地址http://127.0.0.1:8080或IPv6地址http://[::1]:8080两种方式访问,此时通过lsof -i:8080命令可以看到对应进程的Type为IPv6:如果加上JVM参数-Djava.net.preferIPv4Stack=true启动,此时通过lsof -i:8080命令可以看到对应进程的Type为IPv4:此时通过IPv6地址http://[::1]:8080将无法访问,仅可通过IPv4地址http://127.0.0.1:8080访问。java.net.preferIPv6Addresses(默认值false)官方文档解释:By default, IPv4 addresses are preferred over IPv6 addresses, for example, when querying the name service (for instance, DNS service), IPv4 addresses would be returned ahead of IPv6 addresses.java.net.preferIPv6Addresses=false:IPv4地址会优先使用。例如在DNS通过域名查询ip地址时,会优先使用IPv4地址,反之设为true,则会优先使用IPv6地址。Google目前支持IPv4和IPv6,可以host命令查看域名www.google.comDNS解析的IPv4和IPv6地址:host www.google.com
> www.google.com has address 66.220.146.94
> www.google.com has IPv6 address 2404:6800:4008:803::2004默认情况下会优先使用IPv4地址:System.out.println(InetAddress.getByName("www.google.com"));
输出:
www.google.com/66.220.146.94java.net.preferIPv6Addresses=true:优先使用IPv6地址:System.setProperty("java.net.preferIPv6Addresses", "true");
System.out.println(InetAddress.getByName("www.google.com"));
输出:
www.google.com/2404:6800:4008:803:0:0:0:2004另外,通过InetAddress.getLocalHost()方法返回本机IP地址,最终返回的是IPv4还是IPv6地址,也会由java.net.preferIPv6Addresses的值来决定。

本文出自快速备案,转载时请注明出处及相应链接。

本文永久链接: https://www.175ku.com/27511.html