一、通过Linux命令实现


ping www.baidu.com
nslookup www.baidu.com
nslookup 14.215.177.166

为什么这个命令会有一个192.168.1.1呢?

192.168.1.1是默认的DNS服务器。

二、DNS的理解

DNS的解析流程:

1.客户端访问www.baidu.com,检查浏览器是否有缓存,若无,往下走

2.操作系统检查host文件,有无对应关系,若无,往下走

3.在系统DNS缓存中找,若有返回域名对应的IP,若无,往下走

4.找事先设置好的DNS服务器(主&备)去请求,若在DNS服务器的解析库中找不到,往下走

5.向根发送请求,根看到要请求的是com,就将com所在的ns服务器告诉我们的DNS

6.我们的DNS去请求com所在的ns服务器

7.请求到达ns服务器,ns服务器看域名是baidu这个域下的,就把baidu所在的ns服务器地址告诉我们的DNS

8.我们的DNS去请求baidu所在的ns服务器

9.baidu的ns服务器看要访问www,就找到www对应的A记录的IP,将其返回给我们的DNS

10.我们的DNS再把最终解析到的IP返回给客户端,客户端直接去访问。

三、Java实现通过IP获取域名

引入依赖


<!-- https://mvnrepository.com/artifact/dnsjava/dnsjava -->
<dependency>
<groupId>dnsjava</groupId>
<artifactId>dnsjava</artifactId>
<version>2.1.1</version>
</dependency>

代码实现


public class GetHostName { public static void main(String[] args) { try {
String hostName = Address.getHostName(InetAddress.getByName("14.215.177.166"));
System.out.println(hostName);
} catch (UnknownHostException e) {
e.printStackTrace();
} }
}

执行结果(要去掉最后的点,最后面的点是根的意思。www.baidu.com.的意思就是根下的com下的baidu)

三、Java实现通过域名获取IP

代码


public class GetIp { public static void main(String[] args) { try {
String name = "www.baidu.com";
InetAddress[] addresses = InetAddress.getAllByName(name);
for (int i = 0; i < addresses.length; i++) {
System.out.println(name + "[" + i + "]: "
+ addresses[i].getHostAddress());
}
} catch (UnknownHostException uhe) {
System.err.println("Unable to find: " + args[0]);
}
}
}

参考文档

[1]: DNS深度理解 [ 一 ]

[2]: java通过ip拿不到域名的坑

[3]: 大规模爬虫为什么要管理DNS缓存

最新文章

  1. [转]C#常用开源类库收集
  2. vue.common.js?e881:433 TypeError: Cannot read property &#39;nodeName&#39; of undefined
  3. RTTI
  4. Swap Nodes &amp; Reverse Nodes in k-Group
  5. c# 使用正则表达式 提取章节小说正文全本篇
  6. SQLServer: 无法修改表
  7. &lt;四&gt; SQL存储过程
  8. php 5.3起弃用session_register
  9. checkbox 实现单选效果(html)
  10. android CheckBox RadioButton 照片和文字的间距问题
  11. Android性能测试工具Emmagee
  12. 【Unity3D技术文档翻译】第1.4篇 AssetBundle 依赖关系
  13. vmware安装centOs操作系统配置网络的一系列问题
  14. 解析JavaScript中的sort()排序方法以及原理
  15. hibernate框架学习之多表查询helloworld
  16. 最小标示法模板 poj1509
  17. Sockets使用
  18. 配置Sublime Text2的python运行环境(Sublime Text 3也类似)
  19. wx.setStorageSync(KEY,DATA)
  20. 【xsy1061】排列 树状数组

热门文章

  1. 四、eureka服务端同步注册操作
  2. ext TreePanel树节点操作
  3. JDBCUtils工具类配置文件的读取方式
  4. Android NDK 同时编译多个模块
  5. MyEclipse修改运行内存
  6. evpp return index.html
  7. Spring如何给静态变量注入值
  8. 利用matplot简单显示图片
  9. nodeJs修改镜像源
  10. python 正则表达式特殊字符