DNS解析过程
DNS解析过程
DNS(Domain name server):域名系统,我们通常有两种方式来识别主机,
域名(面向用户)和IP地址(面向计算机)
,使用域名是为了便于我们记忆(32位二进制数字组成的IP很难记住),但机器需要通过IP地址来识别,这时候就需要一整套从域名映射到IP的系统(DNS)
域名结构
DNS采用分布式的解析方案,整个DNS架构是一种层次树状结构,这种结构称为DNS域名空间
域名服务器的层次结构
域名具有层次结构,域名需要服务器进行管理,也有相应的层次结构,上一级域名服务器知道下一级域名服务器的IP地址
分类(由高到低) | 作用 |
---|---|
根域名服务器 | 最高层次的域名服务器,本地域名服务解析不了会向其求助 |
顶级域名服务器 | 负责管理该顶级域名服务器下注册的二级域名 |
权限域名服务器 | 负责一个区(管理权限的范围)的域名解析工作 |
本地域名服务器 | 当一个主机发出DNS查询请求时,会首先发给本地域名服务器 |
DNS解析过程
以用户在浏览器中输入www.baidu.com为例,讲一下DNS解析的流程:
- 浏览器检查自身缓存是否解析过此域名的IP地址,如果存在则解析结束
- 当浏览器缓存中没有,会检查操作系统缓存中是否解析过此域名,即系统的hosts文件,如果用户在此文件中配置了域名-IP的映射关系,则解析结束
- 当系统hosts文件中没有,则会去请求本地域名服务器(递归查询)解析此域名,如果存在则解析结束(大部分DNS解析在此完成)
- 如果本地域名服务器没有,本地域名服务器会向根域名服务器发起请求(迭代查询),根域名服务器会告诉本地域名服务器,下一步应该查询的顶级域名服务器的IP地址
- 本地域名服务器得到IP地址后,向对应IP的顶级域名服务器发起请求进行查询,顶级域名服务器会告诉本地域名服务器,下一步应该查询的权限域名服务器的IP地址
- 本地域名服务器得到IP地址后,相对应IP的权限域名服务器发起请求进行查询,权限服务器告诉本地域名服务器所查询的主机的IP地址
- 本地域名服务器得到主机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