基础知识
IP 地址
IP地址是由IP使用的32位或128位无符号数字,IP是一种较低级别的协议,UDP和TCP等协议都是在此基础上构建的。
IP地址体系结构由RFC 790:分配号、RFC 1918:私有internet的地址分配、RFC 2365:管理作用域的IP组播和RFC 2373: IP版本6寻址体系结构定义。
InetAddress的实例由IP地址和相应的主机名组成(取决于它是使用主机名构造的,还是已经执行了反向主机名解析)。
地址类型
单播
单个接口的标识符。
发送到单播地址的包被发送到由该地址标识的接口。
未指定的地址——也称为任何本地或通配符地址。它决不能分配给任何节点。它表示没有地址。
它的一个使用示例是bind的目标,它允许服务器在任何接口上接受客户机连接,以防服务器主机有多个接口。
未指定的地址不能用作IP包的目标地址。
环回地址——这是分配给环回接口的地址。任何发送到这个IP地址的内容都会循环出现,并成为本地主机上的IP输入。这个地址通常在测试客户端时使用。
多播
多播一组接口的标识符(通常属于不同的节点)。
发送到多播地址的包被发送到由该地址标识的所有接口。
IP地址范围
链接本地地址被设计成用于在单个链路上寻址,用于诸如自动地址配置、邻居发现或不存在路由器等目的。
站点本地地址设计用于在不需要全局前缀的情况下在站点内部寻址。
全球地址在互联网上是唯一的。
IP地址的文本表示
IP地址的文本表示是特定于地址族的。
IPv4地址格式请参考 Inet4Address#格式;
IPv6地址格式,请参考 Inet6Address#format。
有两个系统属性影响IPv4和IPv6地址的使用。
主机名称解析
主机名到ip地址的解析是通过结合使用本地机器配置信息和网络命名服务(如域名系统(DNS)和网络信息服务(NIS))来完成的。
使用的特定命名服务默认情况下是本地机器配置的服务。对于任何主机名,都会返回其对应的IP地址。
反向名称解析意味着对于任何IP地址,都会返回与该IP地址关联的主机。
InetAddress类提供了将主机名解析为IP地址的方法,反之亦然。
InetAddress缓存
InetAddress类有一个缓存,用于存储成功和失败的主机名解析。
默认情况下,在安装安全管理器时,为了防止DNS欺骗攻击,将永远缓存主机名解析为正数的结果。
如果没有安装安全管理器,默认行为是在有限的(依赖于实现的)时间内缓存条目。不成功的主机名解析的结果会缓存很短的时间(10秒),以提高性能。
如果不需要默认行为,则可以将Java安全属性设置为不同的实时时间(TTL)值,以进行积极的缓存。同样,系统管理员可以在需要时配置不同的负缓存TTL值。
两个Java安全属性控制用于正负主机名解析缓存的TTL值:
- networkaddress.cache.ttl
指示从名称服务成功查找名称的缓存策略。该值指定为整数,以指示缓存成功查找所需的秒数。
默认设置是缓存特定于某个实现的时间段。值-1表示“永久缓存”。
- networkaddress.cache.negative。ttl(默认值:10)
指示从名称服务查找未成功名称的缓存策略。该值指定为整数,以指示为未成功查找缓存失败的秒数。
值为0表示“从不缓存”。值-1表示“永久缓存”。
代码示例
根据名字获取
- getByNameTest
@Test
public void getByNameTest() throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName("baidu.com");
InetAddress inetAddress1 = InetAddress.getByName("220.181.57.216");
System.out.println(inetAddress);
System.out.println(inetAddress1);
}
- 日志
baidu.com/220.181.57.216
/220.181.57.216
获取所有信息
- getAllByNameTest
@Test
public void getAllByNameTest() throws UnknownHostException {
InetAddress[] inetAddress = InetAddress.getAllByName("baidu.com");
System.out.println(Arrays.toString(inetAddress));
}
- 日志信息
[baidu.com/220.181.57.216, baidu.com/123.125.115.110]
获取本地地址
- getLocalHostTest
@Test
public void getLocalHostTest() throws UnknownHostException {
InetAddress localHost = InetAddress.getLocalHost();
System.out.println(localHost);
}
- 日志
houbinbindeMacBook-Pro.local/192.168.1.103
参考资料
https://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html
https://blog.csdn.net/chenzheng_java/article/details/6248053
http://zzqrj.iteye.com/blog/544784
http://blog.51cto.com/androidguy/214818
https://openhome.cc/Gossip/JavaGossip-V2/InetAddress.htm