DNS解析过程

DNS解析过程

DNS(Domain name server):域名系统,我们通常有两种方式来识别主机,域名(面向用户)和IP地址(面向计算机),使用域名是为了便于我们记忆(32位二进制数字组成的IP很难记住),但机器需要通过IP地址来识别,这时候就需要一整套从域名映射到IP的系统(DNS)

域名结构

DNS采用分布式的解析方案,整个DNS架构是一种层次树状结构,这种结构称为DNS域名空间

域名服务器的层次结构

域名具有层次结构,域名需要服务器进行管理,也有相应的层次结构,上一级域名服务器知道下一级域名服务器的IP地址

分类(由高到低) 作用
根域名服务器 最高层次的域名服务器,本地域名服务解析不了会向其求助
顶级域名服务器 负责管理该顶级域名服务器下注册的二级域名
权限域名服务器 负责一个区(管理权限的范围)的域名解析工作
本地域名服务器 当一个主机发出DNS查询请求时,会首先发给本地域名服务器

DNS解析过程

以用户在浏览器中输入www.baidu.com为例,讲一下DNS解析的流程:

  1. 浏览器检查自身缓存是否解析过此域名的IP地址,如果存在则解析结束
  2. 当浏览器缓存中没有,会检查操作系统缓存中是否解析过此域名,即系统的hosts文件,如果用户在此文件中配置了域名-IP的映射关系,则解析结束
  3. 当系统hosts文件中没有,则会去请求本地域名服务器(递归查询)解析此域名,如果存在则解析结束(大部分DNS解析在此完成)
  4. 如果本地域名服务器没有,本地域名服务器会向根域名服务器发起请求(迭代查询),根域名服务器会告诉本地域名服务器,下一步应该查询的顶级域名服务器的IP地址
  5. 本地域名服务器得到IP地址后,向对应IP的顶级域名服务器发起请求进行查询,顶级域名服务器会告诉本地域名服务器,下一步应该查询的权限域名服务器的IP地址
  6. 本地域名服务器得到IP地址后,相对应IP的权限域名服务器发起请求进行查询,权限服务器告诉本地域名服务器所查询的主机的IP地址
  7. 本地域名服务器得到主机IP地址后,把查询结果反馈给主机

linux系统可以使用dig命令对DNS解析进行追踪

递归查询与迭代查询

主机查询本地域名服务器采用递归查询,本地域名服务器查询其他域名服务器采用迭代查询

  • 递归查询:主机向本地域名服务器发起请求,等待返回结果,如果本地域名服务器没有解析,会以DNS客户机身份向其他域名服务器进行查询,此时主机只需要等待结果,中间查询过程并不关心
  • 迭代查询:本地域名服务器向根域名服务器发起查询请求,根据根域名服务器告知的顶级域名服务器IP去进行查询,每次都是自身去查询

DNS的传输层协议

DNS使用了TCP与UDP两种协议

当客户端向DNS服务器发起域名解析请求时,一般返回的内容不会超过UDP报文的最大长度,并且UDP传输不需要经过TCP三次握手过程,大大提高了响应速度,因此采用UDP作为DNS的传输层协议。

当进行区域传送会使用TCP,辅域名服务器会定时向主域名服务器进行查询,检查是否有数据变动,如有变动则会执行一次区域传送,进行数据同步,由于数据同步的数据量比一次请求和应答的数据量要大的多,使用TCP更加可靠。

linux系统中的配置文件

resolv.conf

该文件是DNS域名解析配置文件,文件路径:/etc/resolv.conf

配置参数
nameserver : 定义DNS服务器的IP地址
domain :定义本地域名
search :定义域名的搜索列表
sortlist :对返回的域名进行排序

比如虚拟机的配置文件,DNS服务器的IP地址对应路由器的IP

hosts

用于保存常用的网址域名与其IP的映射关系,文件路径:/etc/hosts

配置参数
IP 域名
例如:
修改hosts文件
127.0.0.1 www.a.com
使用ping命令的结果
[root@localhost ~]# ping www.a.com
PING www.a.com (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.021 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.088 ms

windows系统也有hosts文件在C:\Windows\System32\drivers\etc\hosts路径下

主要目的是加快域名解析(主机可以直接从hosts找到对应IP,无需向本地域名服务器请求查询)

常见问题解答

1.springboot项目启动很慢,报warn日志如下,应如何解决?

[WARN][main] org.springframework.boot.StartupInfoLogger.appendOn:116 InetAddress.getLocalHost().getHostName() took 35024 milliseconds to respond.Please verify your network configuration

对应的代码

可以看到当调用InetAddress.getLocalHost().getHostName()方法时间过长时就会出现此日志
InetAddress.getLocalHost().getHostName():会通过DNS反向解析来找到对应的主机名
由此说明是DNS反向解析时间过长导致的,通过配置hosts文件来避免这种情况

解决方法:

在linux环境下用host命令查看主机名之后ping主机名查看具体的地址

vi /etc/hosts 编辑hosts文件 添加具体地址与域名

也可以直接在localhost后面添加

参考网址

https://blog.csdn.net/weixin_57023347/article/details/120819772

https://blog.csdn.net/weixin_50426379/article/details/124346735

posted @ 2022-11-26 15:57  柯南。道尔  阅读(283)  评论(0编辑  收藏  举报