目录
初识DNS协议
什么是DNS协议?
DNS(Domain Name System)域名系统:DNS 协议是应用层的协议,用于将用户提供的主机名(域名)解析为 IP 地址。
域名和IP地址的关系?
类似电话簿中的姓名和电话号码,通过姓名可以拨打的电话,通过域名也可以访问IP地址。
多个域名可以指向同一个IP地址。
详解DNS查询
DNS如何获得域名对应的IP地址?
DNS 的核心系统是一个三层的树状、分布式服务,基本对应域名的结构。
三层服务器分别是:
根域名服务器(Root DNS Server):管理顶级域名服务器,如“com”“net”“cn”等顶级域名服务器的 IP 地址。
顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器。
权威域名服务器(Authoritative DNS Server):管理各自域名下主机的 IP 地址。
域名查询工作会根据这三类服务器依次查询,查询方式为迭代查询,减少根服务器负担。
DNS的缓存机制
因为查询IP的系统是树形结构,如果同一时间访问量过大,会导致根服务器负载过大,影响交互速度,甚至服务器崩溃。DNS使用优秀的缓存机制来解决这个问题。
DNS有三层缓存机制,分别是:
浏览器缓存:浏览器在获取某一网站域名的实际 IP 地址后,进行缓存,之后遇到同一域名,则查询之前的缓存结果即可,有效减少网络请求的损耗。
操作系统缓存:操作系统中有一个特殊的“主机映射”文件,通常是一个可编辑的文本,文件名为“hosts”。该文件是DNS的发展中的重要里程碑。如果操作系统未在缓存中找到域名对应的IP地址,则会查找该文件中的地址映射。
本地域名服务器缓存:通常由运行商或大公司运行,代替一定范围内的用户访问核心 DNS 系统,并记录地址映射关系。如果用户访问的域名在记录中已经存在,则返回记录的地址即可。
域名查询工作依次通过这三层缓存进行查询,查询方式为递归查询。
DNS完整查询过程
首先通过三层缓存查找:
搜索浏览器的DNS缓存,缓存中维护一张域名与IP地址的对应表。
如果没有命中,则继续搜索操作系统的DNS缓存。
如果依然没有命中,则操作系统将域名发送至 本地域名服务器,本地域名服务器查询自己的DNS缓存,查找成功则返回结果。
然后通过三层服务器查找:
若本地域名服务器的DNS缓存没有命中,则本地域名服务器向根域名服务器发起请求。
根域名服务器返回顶级域名服务器的地址。
本地域名服务器接收顶级域名服务器地址后,向顶级域名服务器发起请求。
顶级域名服务器返回权限域名服务器的地址。
本地域名服务器接收权限域名服务器地址后,向权限域名服务器发起请求。
权限域名服务器返回最终IP地址。
最终得到该域名对应的IP地址。
从浏览器键入URL,到网页显示的过程
DNS查询 => 服务器返回最终的IP地址。
浏览器向IP地址发送请求 => 服务器处理请求,并返回HTML页面。
浏览器开始渲染HTML,并发送异步请求,如AJAX => 服务器处理请求并返回相应数据。
浏览器接受数据并渲染具体页面。
为什么选择基于UDP协议发起DNS查询,而不是TCP?
DNS查询发出的请求是基于UDP协议的,通常使用 53 号端口。
TCP是可靠传输协议,TCP建立连接和传输数据会带来额外开销,如数据的传输量(带宽)、建立连接的时间等。
由于存在不同层级的协议的MTU限制,数据在传输的过程中可能被截断。而使用UDP属于不可靠传输,当UDP被截断时,传输失败的概率也会大大上升。因此当DNS使用UDP访问失败时,也会尝试使用TCP进行访问。