DNS域名系统
学习自:DNS原理
1、简介
本质
DNS实质上是域名和IP相互映射的联机分布式数据库系统。
一般过程
1、输入并访问域名www.xxx.com;
2、通过DNS查询得到其IP地址为20X.189.105.112;
3、根据该IP地址访问。
具体说明
域名到IP的解析是由分布在互联网上的许多域名服务器共同完成的。解析过程:
(1)当某一个应用进程需要把域名解析为IP地址时,该应用进程就调用解析程序(resolver),并成为DNS的一个客户,把待解析的域名放在DNS请求报文中,以UDP用户数据报方式(减少开销)发给本地域名服务器。
(2)本地服务器在查找到域名后,把对应的IP地址放在回答报文中返回。应用进程获得目的主机的IP地址后即可进行通信。
(3)若本地域名服务器不能回答该请求,则此域名服务器就暂时成为DNS中的另一名客户,并向其他域名服务器发出查询请求。这种过程直至找到能够回答该请求的域名服务器为止。
2、域名分层结构
因特网采用树状结构的域名命名方法。这样可以防止名称冲突。
现实中的DNS都是分布式存储的。
域名等级从左到右依次增高,例如www.chinaz.com中,www为三级域名,chinaz为二级域名,com为顶级域名。
3、域名服务器
域名到IP的解析是由分布在因特网上的多个域名服务器共同完成的,现在根据域名服务器等级由高到低分为4类:
根域名服务器→顶级域名服务器(TLD)→权限域名服务器→本地域名服务器
1)根域名服务器:最高也是最重要的域名服务器。每个根域名服务器都知道所有顶级域名服务器的域名和IP地址。
本地域名服务器将 域名转换为IP地址 的过程中,只要自己无法转换,就要首先求助于根域名服务器。假定所有的根域名服务器都挂了,那么整个互联网中的DNS系统就都挂了。
根域名服务器并不直接把待查询的域名直接转换成IP地址(根域名服务器也没有这种信息),而是告诉本地域名服务器下一步应当找哪一个顶级域名服务器进行查询。
2)顶级域名服务器(TLD)
负责管理在该顶级域名服务器注册的所有二级域名。当收到DNS查询请求时,就给出相应的回答(可能是最后结果,也可能是下一步应当找的域名服务器的IP地址)。
3)权限域名服务器
一个服务器所负责管辖的(或有权限的)范围叫做区。各单位根据自己情况来划分区的范围,每个区设置相应的 权限域名服务器,用来保存该区中所有主机的域名到IP地址的映射。
4)本地域名服务器
当一个主机发出DNS查询请求时,这个查询请求报文就发给本地域名服务器。每个互联网提供商ISP,或一个大学,甚至一个大学里的系,都可以拥有本地域名服务器。本地域名服务器离用户较近,一般不超过几个路由器的距离。当所要查询的主机也属于同一个本地ISP时,该本地域名服务器立即就能将所查询的主机名转换为IP地址,而不需要再访问其他域名服务器。
4、DNS解析流程
1、递归查询与迭代查询
递归查询
a. 主机向本地域名服务器的查询一般都是采用递归查询(recursive query)。如果主机所询问的本地域名服务器不知道被查询域名的IP地址时,本地域名服务器就以DNS客户的身份向其他根域名服务器继续发送查询请求报文(即替该主机继续查询),而不是让该主机自己进行下一步的查询。
迭代查询
b. 本地域名服务器向根域名服务器的查询通常是采用迭代查询(iterative query)。当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地域名服务器下一步应当向哪一个域名服务器进行查询,然后让本地域名服务器进行后续的查询。逐步按照域树的路径向下走直到叶节点,得到了所要解析的域名的IP地址,然后把这个结果返回给发起查询的主机。当然本地域名服务器也可以采用递归查询,这取决于最初的查询请求报文的设置是要使用哪一种查询方式。
2、解析流程
假如客户端在浏览器的URL中输入y.abc.com,即想要解析获取y.abc.com的IP地址。(客户是第一次访问y.abc.com)
如果 本地域名服务器 采用迭代查询:(图a)
(1)客户端向 本地域名服务器(递归查询) 发出解析y.abc.com域名的请求。
本地域名服务器 查看本地缓存,是否有缓存过y.abc.com域名,如果有直接返回给客户端;如果没有执行下一步;
(2)本地域名服务器 采用迭代查询。它先向一个 根域名服务器 查询。
(3)根域名服务器 告诉 本地域名服务器,下一次应查询的 顶级域名服务器dns.com的IP地址。
(4)本地域名服务器 向 顶级域名服务器dns.com 进行查询。
(5)顶级域名服务器dns.com 告诉 本地域名服务器,下一步应查询的 权限服务器dns.abc.com 的IP地址。
(6)本地域名服务器 向 权限域名服务器dns.abc.com 进行查询。
(7)权限域名服务器dns.abc.com 告诉 本地域名服务器,所查询的主机的IP地址。
(8)本地域名服务器 最后把查询结果告诉m.xyz.com。
注:整个查询过程共用到了8个UDP报文。
如果 本地服务器采用 递归查询:(图b)
这里,本地域名服务器 只需要向 根域名服务器查询一次,后面的查询都是在其他几个域名服务器之间进行的(步骤3~6)。只是在第7步,本地域名服务器 从 根域名服务器 得到了所需的IP地址。最后在步骤8,本地域名服务器 把查询得到的IP 告诉了客户端。整个查询过程也是使用了8个UDP报文。
3、高速缓存
提高效率、降低负荷
为了提高DNS查询效率,并减轻服务器的负荷和减少因特网上的DNS查询报文数量,在域名服务器中广泛使用了高速缓存,用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
例如,在上面的查询过程中,如果在m.xyz.com的主机上不久前已经有用户查询过y.abc.com的IP地址,那么本地域名服务器就不必向根域名服务器重新查询y.abc.com的IP地址,而是直接把高速缓存中存放的上次查询结果返回(即y.abc.com的IP地址)给用户。
假定本地域名服务器的缓存中并没有y.abc.com的IP地址,而是存放着顶级域名服务器dns.com的IP地址,那么本地域名服务器也可以不向根域名服务器进行查询,而是直接向com顶级域名服务器 发送查询请求报文。这样能大大减轻根域名服务器的负荷。
由于名字到地址的绑定并不经常改变,为保持告诉缓存中的内容正确,域名服务器应为每项内容设置计时器并删除超过合理时间的项(例如每个项目两天)。当域名服务器已从缓存中删去某项信息后又被请求查询该项信息,就必须重新到授权管理该项的域名服务器绑定信息。当权限服务器回答一个查询请求时,在响应中都指明绑定有效存在的时间值。增加此时间值可减少网络开销,而减少此时间值可提高域名解析的正确性。
不仅在本地域名服务器中需要高速缓存,在主机中也需要。许多主机在启动时从本地服务器下载名字和地址的全部数据库,维护存放自己最近使用的域名的高速缓存,并且只在从缓存中找不到名字时才使用域名服务器。维护本地域名服务器数据库的主机应当定期地检查域名服务器以获取新的映射信息,而且主机必须从缓存中删除无效的项。由于域名改动并不频繁,大多数网点不需花精力就能维护数据库的一致性。
4、加上主机缓存后的DNS 解析流程
如果还用上面的例子,且加上主机中的缓存,客户端在浏览器的URL中输入y.abc.com,即想要解析获取y.abc.com的IP地址。会发生以下动作:
(1)浏览器 会首先搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳1000条缓存),看自身的缓存中是否有y.abc.com 对应的条目,而且没有过期,如果有且没有过期则解析到此结束。
(2)如果浏览器自身的缓存里面没有找到对应的条目,那么浏览器会搜索操作系统自身的DNS缓存,如果找到且没有过期则停止搜索解析到此结束。
(3)如果在操作系统(eg:Windows系统)的DNS缓存中也没有找到,那么尝试读取hosts文件(位于C:\Windows\System32\drivers\etc),看看这里面有没有该域名对应的IP地址,如果有则解析成功。
(4)如果在hosts文件中也没有找到对应的条目,浏览器就会发起一个DNS的系统调用,就会向 本地域名服务器 发起域名解析请求
(5)之后的操作就一样了,同上面 本地域名服务器 递归查询或迭代查询 的过程。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
2022-07-05 gitee:使用教程
2022-07-05 Springboot:项目部署、停止与删除
2021-07-05 Qt:QMutex
2021-07-05 Qt:QNetworkReply
2021-07-05 Qt:QNetworkAccessManager
2021-07-05 Qt:QNetworkRequest