这是我参与8月更文挑战的第13天,活动详情查看:8月更文挑战
这世上本没有DNS,后来网站多了,也就有了DNS。
DNS协议
DNS——Domain Name System 域名系统,在网络世界充当“指针”的角色。它的功能很直接:从域名查询到IP地址。
在互联网刚出现的时候,还没有DNS一说,有专人把网址的IP地址记录到txt文本,供使用者去搜索。后来网站越来越多,TXT登记和查询的效率都太低了,没法维护了,才出现了DNS的雏形。
DNS是通过各个散落世界各地的Name Server域名服务器按照DNS protocol进行工作的。下图是DNS的协议栈:
- 一般认为DNS协议位于应用层;
- DNS查询消息,信息量小,格式固定,所以在传输层优先使用UDP协议进行发送,这样做的好处是传输速率更快!只有在无响应情况下才会使用TCP;
- DNS服务器默认端口是53,客户端端口随机;
- DNS协议采用的是和HTTP类似的C/S模式下的请求-应答模型,即客户端向服务器发起查询请求,服务器进行应答
来看一个真实的DNS请求-应答消息:
- 客户端向DNS服务器的53端口发送请求,查询"activity.windows.com”的A地址(IPV4地址),可以看到使用的是UDP传输
- 服务器响应,同样使用UDP传输,客户都会对收到的信息进行校验;
- 消息还有2个answers,一个是告诉客户端,"activity.windows.com”实际指向的是另一个域名"activity-geo.trafficmanager.net"(CName);另一个是把真实域名的IP地址返回给了客户端,完成响应;
- 关于消息中的type A, type CName,是DNS的记录类型(record type),我在下文会详细说明
DNS分级
要说清楚DNS是如何工作的,让我们先来解析一个网址:
-
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如下图所示:
-
根域名: 其实我们的网址最后都有一个句号".",这就是根域名,因为根域名对所有域名都一样,所以都被省略了。根域名有专门的根DNS服务器进行管理,这个我们后面在讲anycast时会专门介绍。
-
DNS的等级:既然域名有等级,那么登记和管理域名的DNS也有了相应的等级
查询方式
DNS的分级机制是为了应对越来越多的域名与查询请求,那么我们在查询一个域名时,为了加快查询效率并降低DNS服务器压力,也需要遵循两个原则:
- 分级查询
- 就是从根域名开始,依次查询每一级域名的DNS记录,直到查到最终的IP地址;
- 每一级的域名服务器都知道它下一级的域名记录,比如.com域名服务器知道google.com的域名服务器地址,由此类推,最终查到host的IP地址;
- 就近原则:
- 客户端首先向本地DNS(resolver)发送查询请求,如果本地DNS有对应的缓存,则直接应答;
- 如果本地DNS没有对应结果,则通过resolver向距离最近的根节点发送查询请求,并进行递归查询,直到返回最终结果;
基于此,DNS一般支持两种查询方式:递归查询recursive与迭代查询iterative;
两者的区别在于执行查询的主体:如果是由本地Name Server执行查询并返回给客户端,则为递归查询;如果是由客户端直接向不同级别的Name Server执行查询,则为迭代查询;
一般来说,都采用递归查询方式,因为两个原因:
- 本地name server性能更强,查询速度更快;
- 查询到结果后,可以缓存,缓存结果可以供本地所有客户端使用,效率更高;
递归查询
我们分步讲解一下:
-
客户端浏览器输入一个网址之后,会先向本机的DNS缓存和host文件发起查询,如果有相应记录,则马上返回对应IP地址,查询结束。
- 需要注意一点,这个返回结果不是权威的(non-authoritative),可能会导向错误的IP地址
- 这里应用到的是浏览器和系统自带的DNS服务,可以用 ipconfig/displaydns来查看本地的缓存,并用ipconfig/flushdns 命令来清楚本地缓存;
-
如果本地缓存没有结果,则客户端会按照“就近原则”,向ISP指定的本地Name server,也就是我们上一节说的LDNS发起查询,如果LDNS有结果则返回,查询结束;如果没有结果,则LDNS会按照“分级查询”原则,向根域名服务器发起查询
-
根域名会返回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