DNS的秘密(1) 工作原理

952 阅读6分钟

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

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

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文件。

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

  • www: 这是我们的subdomain(子域名),子域名对应具体的host, 这个子域名不需要向域名注册商申请,可以由我们自行指定。

  • 域名的等级:从顶级域到子域,我们能看出域名是有层级的。即主机名(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
  2. 如果本地缓存没有结果,则客户端会按照“就近原则”,向ISP指定的本地Name server,也就是我们上一节说的LDNS发起查询,如果LDNS有结果则返回,查询结束;如果没有结果,则LDNS会按照“分级查询”原则,向根域名服务器发起查询

  3. 根域名会返回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