在互联网中我们通信目标是对方的IP,但是由于IP不便于记忆所以引入了域名
域名和IP是一一对应的关系,需要注意的是域名和网址是不同的概念
比如:www.csdn.net
是域名,https://www.csdn.net/?spm=1001.2101.3001.4476
是网址
首先了解一下域名存储的层级关系,以.
划分,域名结构可以看作一个树状结构
- 根域名服务器
负责管理哪些字符串可以作为顶级域名,不直接管理顶级域名而是使用代理模式,存储顶级域名的IP和对应的字符串,域名后面都隐藏有一个.
比如www.baidu.com.
,全世界13个 - 顶级域名服务器
管理顶级域名及包含二级域名的IP,顶级域名分为通用顶级域名(如.com
)和国家顶级域名(如.cn
),一共一千来个 - 权限域名服务器
负责管理一个区的域名,比如:zh.baidu.com
和en.baidu.com
可以在baidu.com
权限域名服务器中,简单点说就是一个权限域名服务器负责管理一个区,对每个区内的域名由公司负责分配,归根结底域名服务器的最小单位是权限域名服务器。 - 本地域名服务器(权威域名服务器)
部署在本地网络中某个服务器或者路由器上,存储根域名服务器的IP及一些域名缓存,它的作用很好理解就是减少DNS请求量,windows下可以通过在cmd中输入ipconfig /all
来查看
我们请求域名的策略正是由本地域名服务器控制的,常见的查询策略有 - 递归查询,你问我:小红有对象吗,我去问小红:你有对象吗,她告诉我说:没有,我告诉你:没有,这样对我很不友好,正经点解释的话全球几十亿网民如果都要靠域名服务器之间传递消息的话根域名服务器不得累死吗?全球就13台
- 迭代查询,你问我:小红有对象吗,我给你小红的微信,然后你去问小红她有没有对象,这种对服务器显然是比较友好一点的根域名服务器只需要面向本地域名服务器传递消息,层级之间一般不交互除非下级要换IP
这样显然还是会产生大量的DNS请求,针对域名的缓存还是挺多的
- 浏览器DNS缓存,不同浏览器的缓存周期不同,但一般周期不长,且可以手动清理
- 操作系统DNS缓存,由协议栈管理,一般不能手动清除,周期更长,面向整个操作系统
- 本地域名服务器DNS缓存,面向整个局域网,周期更长些
域名解析过程
- 查询浏览器中是否有对应缓存
- 查询操作系统中是否有对应的缓存
- 查询本地域名服务器中是否有对应的缓存
- 本地域名服务器给根域名服务器发送UDP报文请求域名对应的顶级域名服务器IP
- 本地域名服务器给顶级域名服务器发送UDP报文请求域名对应的权限域名服务器IP
- 本地域名服务器给权限域名服务器发送UDP报文请求域名对应的IP
- 接收权限域名服务器的反馈结果,域名IP或者此域名不存在
域名解析请求一般使用UDP报文发送,如果对数据安全性要求高的话可以使用TCP,或者请求数据量大的时候也有可能自动转向TCP,整的来说使用UDP更加便捷但是不够安全可能产生DNS篡改/DNS劫持等情况