DNS的秘密(1) 工做原理

这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战html

这世上本没有DNS,后来网站多了,也就有了DNS。windows

DNS协议

DNS——Domain Name System 域名系统,在网络世界充当“指针”的角色。它的功能很直接:从域名查询到IP地址。浏览器

在互联网刚出现的时候,尚未DNS一说,有专人把网址的IP地址记录到txt文本,供使用者去搜索。后来网站愈来愈多,TXT登记和查询的效率都过低了,无法维护了,才出现了DNS的雏形。缓存

DNS是经过各个散落世界各地的Name Server域名服务器按照DNS protocol进行工做的。下图是DNS的协议栈:安全

image.png

  1. 通常认为DNS协议位于应用层;
  2. DNS查询消息,信息量小,格式固定,因此在传输层优先使用UDP协议进行发送,这样作的好处是传输速率更快!只有在无响应状况下才会使用TCP;
  3. DNS服务器默认端口是53,客户端端口随机;
  4. DNS协议采用的是和HTTP相似的C/S模式下的请求-应答模型,即客户端向服务器发起查询请求,服务器进行应答

来看一个真实的DNS请求-应答消息:服务器

image.png

  • 客户端向DNS服务器的53端口发送请求,查询"activity.windows.com”的A地址(IPV4地址),能够看到使用的是UDP传输

image.png

  • 服务器响应,一样使用UDP传输,客户都会对收到的信息进行校验;
  • 消息还有2个answers,一个是告诉客户端,"activity.windows.com”实际指向的是另外一个域名"activity-geo.trafficmanager.net"(CName);另外一个是把真实域名的IP地址返回给了客户端,完成响应;
  • 关于消息中的type A, type CName,是DNS的记录类型(record type),我在下文会详细说明

DNS分级

要说清楚DNS是如何工做的,让咱们先来解析一个网址:微信

image.png

  • URL:上图是咱们平时输入的网址,它其实是一个URL(Uniform Resouce Locator),统一资源定位符,是用来标识互联网上的资源位置。咱们知道网页其实就是一个HTML文件,因此打开这个网址,就是打开这个地址对应的HTML文件。markdown

  • data-flair.training :就是咱们向域名注册商申请的域名。它包含两个部分,TLD(顶级域名)和SLD(次级域名)。“.training"是顶级域TLD(top level domain),是咱们注册域名时选择的,常见的顶级域名还包括国家码/com/net/org等;"data-flair",又称为次级域名(second-level domain,SLD),是咱们私有的,从属于选择的顶级域(TLD);网络

  • www: 这是咱们的subdomain(子域名),子域名对应具体的host, 这个子域名不须要向域名注册商申请,能够由咱们自行指定。dom

  • 域名的等级:从顶级域到子域,咱们能看出域名是有层级的。即主机名(host).次级域名(SLD,也就是咱们所说的域名).顶级域名(TLD).根域名(root) # 即host.sld.tld.root以下图所示:

image.png

  • 根域名: 其实咱们的网址最后都有一个句号".",这就是根域名,由于根域名对全部域名都同样,因此都被省略了。根域名有专门的根DNS服务器进行管理,这个咱们后面在讲anycast时会专门介绍。

  • DNS的等级:既然域名有等级,那么登记和管理域名的DNS也有了相应的等级

image.png

查询方式

DNS的分级机制是为了应对愈来愈多的域名与查询请求,那么咱们在查询一个域名时,为了加快查询效率并下降DNS服务器压力,也须要遵循两个原则:

  1. 分级查询
    • 就是从根域名开始,依次查询每一级域名的DNS记录,直到查到最终的IP地址;
    • 每一级的域名服务器都知道它下一级的域名记录,好比.com域名服务器知道google.com的域名服务器地址,由此类推,最终查到host的IP地址;

image.png

  1. 就近原则:
    • 客户端首先向本地DNS(resolver)发送查询请求,若是本地DNS有对应的缓存,则直接应答;
    • 若是本地DNS没有对应结果,则经过resolver向距离最近的根节点发送查询请求,并进行递归查询,直到返回最终结果;

基于此,DNS通常支持两种查询方式:递归查询recursive与迭代查询iterative;

二者的区别在于执行查询的主体:若是是由本地Name Server执行查询并返回给客户端,则为递归查询;若是是由客户端直接向不一样级别的Name Server执行查询,则为迭代查询;

通常来讲,都采用递归查询方式,由于两个缘由:

  1. 本地name server性能更强,查询速度更快;
  2. 查询到结果后,能够缓存,缓存结果能够供本地全部客户端使用,效率更高;

递归查询

image.png

咱们分步讲解一下:

  1. 客户端浏览器输入一个网址以后,会先向本机的DNS缓存和host文件发起查询,若是有相应记录,则立刻返回对应IP地址,查询结束。
    • 须要注意一点,这个返回结果不是权威的(non-authoritative),可能会导向错误的IP地址
    • 这里应用到的是浏览器和系统自带的DNS服务,能够用 ipconfig/displaydns来查看本地的缓存,并用ipconfig/flushdns 命令来清楚本地缓存;

image.png

  1. 若是本地缓存没有结果,则客户端会按照“就近原则”,向ISP指定的本地Name server,也就是咱们上一节说的LDNS发起查询,若是LDNS有结果则返回,查询结束;若是没有结果,则LDNS会按照“分级查询”原则,向根域名服务器发起查询

  2. 根域名会返回TLD域名的记录和IP,而后LDNS会向TLD服务器发起查询,依次类推,最终得到目标host的IP地址,并返回给客户端,同时讲结果保存在LDNS本地,保存时间为TTL(timee to live)

以上就是DNS协议的关键内容和工做原理,咱们下一篇来详细看一下DNS的查询过程。

感谢阅读,若有不许确和错误之处请留言指正,我会当即修正,感谢!




总结不易,请勿私自转载,不然别怪老大爷不客气

欢迎喜欢技术的小伙伴和我交流,微信1296386616

参考资料:

《How to Choose a Perfect Domain Name – SEO Best Practices》 Data Flair data-flair.training/blogs/seo-d…

《云解析 DNS》 阿里云 help.aliyun.com/document_de…

《DNS解析的工做原理及递归与迭代的区别》 WytheOnly blog.csdn.net/wytheonly/a…

《DNS 安全问题研究》 郭巨侠 zhuanlan.zhihu.com/p/345791057

相关文章
相关标签/搜索