当我们在浏览器输入一个URL的时候,域名系统(Domain Name System)就开始工作。域名系统是将互联网资源和地址关联起来的一个分布式数据库。
DNS和统一资源定位符,域名系统本质就是定位资源,互联网中的各种资源,比如视频、图片、文件、网页。。。。
下面就是一个URL的示例:
https://www.example.com:8080/test?id=1000#Good
【https】Scheme部分是协议,不仅只有https,还有ftp、ssh等,不同的协议代表着不同类型的应用在提供资源。
【www.example.com】Host部分代表站点,DNS主要作用就是根据Host查找IP地址。
【8080】Port是端口号,代表提供服务的应用
【test】是路径,代表资源在服务中的路径
【id=1000】是查询条件,代表需要的是资源中的某个部分。
【Good】是二级查询条件,通常不在服务端响应,而是用于前端展示定位内容。
总的来说,URL是一个树状的设计,Host代表主机(对应的IP地址由DNS服务提供)Port代表提供服务的应用,Path代表资源在应用中的路径,Query代表对资源的查询条件。
域名系统,DNS(Domain Name System域名系统)是一个将域名和IP地址互相映射的分布式服务。DNS本身是一个分布式架构。
位于最顶层的是根域名服务器(Root Name Server),根域名服务器存储的不是域名和IP的映射关系,而是一个目录,因为流量、防止单点故障、平衡地理分布等问题,根域名服务器只是一个目录,并不提供具体的数据。
DNS域名解析过程
如上图所示,DNS的存储设计是一个树状结构,叶子节点中才存放真实的映射关系,中间节点存的都是目录。存储分为3层:
顶部是根DNS存储,存储的是顶级域名的目录,被称作根DNS服务器
第二级是顶级域存储,存储的是二级域名的目录,被称作顶级域DNS服务器。
最后一级是叶子节点,存储的是具体的DNS记录,被称作权威DNS服务器。
域名分级和数据分区
域名分级包括,根域名(.)、顶级域名(com、cn、net)、二级域名(baidu)、三级域名(www),域名分级主要是为了建立目录和索引,并对数据存储进行分区。
DNS域名解析过程
DNS查询过程
当用户在浏览器中输入一个网址,就会触发DNS查询。这个时候在上述的3个层级中,还要加一个本地DNS服务器层级,本地DNS服务器包括用户自己路由器中的DNS缓存、小区的DNS服务器、ISP的DNS服务器,具体过程如下。
DNS域名解析过程
根据上图,详细DNS查询结果如下:
1、用户输入网址,先查询本地DNS,本地DNS是一系列DNS的集合,比如ISP提供的DNS、公司网络提供的DNS。本地DNS是一个代理,将DNS请求转发到DNS网络中。如果本地DNS已经存在需要的记录,也就是本地DNS缓存中找到了对应的DNS条目,就会直接返回,而跳过之后的步骤。
2、如果本地DNS服务器中没有对应的记录,那么请求会被转发到根DNS服务器。根DNS服务器只解析顶级域,例如“www.baidu.com”,根DNS服务器只查看com部分。
3、根DNS服务器返回顶级DNS服务器的IP
4、顶级域DNS服务器中存放的是二级域名的目录
5、顶级DNS服务器返回权威DNS服务器的IP
6、在权威DNS服务器中存放具体的DNS记录,
7、权威DNS服务器返回DNS记录到本地DNS服务器
8、本地DNS服务器返回具体的DNS记录给客户端。
关于缓存
上面的每一个步骤,其实都存在缓存的设计,浏览器会缓存DNS,此外,操作系统、路由器、本地DNS服务器也会缓存,所以大部分情况,请求不会到达根DNS服务器。
以百度为例,如果在某个时刻,同一个区域内有一个用户触发了1-8的过程,另一个同区域的用户就可以在本地DNS服务器中获取DNS记录,而不需要再走到根DNS服务器,这种称为分级缓存策略。
分级缓存策略,每一层都会进行缓存,经过一层层的缓存,最终命中根DNS服务、顶级DNS服务器,权威DNS服务器的请求少之又少。
DNS记录
DNS记录例子
定义www.example.com的ip地址
www.example.com. IN A 139.18.28.5;
这个就是一条DNS记录,纯文本。IN代表记录用于互联网,是Intenet的缩写。A是记录的类型,A记录代表着这是一条解析IPv4地址的记录,代表域名和IPv4地址的映射关系。从这条记录可知 www.example.com.的IP地址是 139.18.28.5。
CNAME是用于定义域名的别名的,例如下面这条DNS记录
; 定义www.example.com的别名
a.example.com. IN CNAME b.example.com.
这条DNS记录定义了a.example.com 是 b.example.com 的别名。在浏览器中输入a.example.com 时候,通过 DNS 查询会知道 a.example.com 是 b.example.com 的别名,因此需要实际 IP 的时候,会去拿 b.example.com 的 A 记录。主要作用是将一个域名映射到另一个域名。域名解析的时候,如果看到CNAME记录,则会从映射目标重新开始查询。