先得聊聊什么是域名
域名是什么?我会连域名都不知道?别着急,先看看嘛。
我们以www.fanyi.baidu.com为例。域名结构划分为根域名、顶级域名、二级域名、三级域名等。做过开发的都知道,在创建项目时,一般是com.xxx.xxx,这就是域名的正确顺序,按com→baidu→fanyi的顺序。com是顶级域名,baidu是二级域名,fanyi是三级域名。还有一个被隐藏了的根域名,完成的域名应该是 www.fanyi.baidu.com. 。
什么是域名服务器
域名服务器正如其名,是存放域名的服务器。域名服务器可以划分为四种:根域名服务器、顶级域名服务器、权限域名服务器、本地域名服务器。
本地域名服务器
又被称为权威域名服务器,是电脑解析时的默认域名服务器,即电脑中设置的首选DNS服务器和备选DNS服务器。常见的有电信、联通、谷歌、阿里等的本地DNS服务。
如果没有指定DNS服务器则会自动获取,如果两个同属一个本地DNS服务器管理的域名互相访问时可以直接在本地域名服务器获得ip(解析过程下面细说)
根域名服务器
全球只有13套根域名服务器装置,大部分分布在北美。根域名服务器中存储着各个顶级域名服务器的ip地址。
顶级域名服务器
负责管理在该顶级域名服务器注册的所有二级域名,记录这些二级域名的IP或者这些域名用于管理它的三级域名的服务器IP地址(如baidu.com的服务器存储着管理fanyi.baidu.com、ai.baidu.com的服务器。
权限域名服务器
负责一个区的域名管理的服务器。当一个权限域名服务器不能给出最后的查询回答时,就会告诉发出查询请求的DNS客户,下一步应当找其他的哪一个权限域名服务器
那什么是区了?
为什么划分区?
如果一个二级域名或者一个三级域名对应一个域名服务器,则域名服务器数量会很多,使用划分区的办法来解决这个问题。
什么是区?
一个服务器所负责管辖(或有权限)的域名范围叫做区,各单位根据情况来划分自己管辖范围的区。
如何划分区
同样以百度为例,我们假设有fanyi.baidu.com、ai.baidu.com、tieba.baidu.com。我们可以这样分区,fanyi.baidu.com和tieba.baidu.com放在baidu.com权限域名服务器,ai.baidu.com放在ai.baidu.com权限域名服务器中。baidu.com权限域名服务器和ai.baidu.com权限域名服务器是同等地位的,而具体怎么分区是百度根据域名多少、访问多少等情况去自己规定的。
域名解析过程
首先我们要知道域名解析有两种方式:迭代解析:本地域名服务器向根域名服务器请求采取的方式,请求后根域名服务器中没有找到IP则返回给本地域名服务器下一步查找哪个服务器(它的IP)可以找到域名对应的IP。二、递归解析:主机向本地域名服务器请求采取的方式,请求后本地域名服务器如果没有找到域名对应的IP,则交给本地域名服务器去获取到IP再由本地域名服务器返回给主机。
以m.xy.com为例的完整解析步骤:
1.本机m.xyz.com向本地域名服务器dns.xyz.com(如8.8.8.8)进行递归查询
2.本地域名服务器采用迭代查询。它先向一个根域名服务器查询
3.根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器dns.com的IP地址
4.本地域名服务器向顶级域名服务器dns.com进行查询
5.顶级域名服务器dns.com告诉本地域名服务器,下一次应查询的权限域名服务器dns.abc.com的IP地址
6.本地域名服务器向权限域名服务器dns.abc.com进行查询
7.权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址
8.本地域名服务器最后把查询结果告诉主机m.xyz.com
域名缓存
每个时刻无数网民要上网,那每次都访问本地域名服务器去获取IP?这显然是不实际的,先不说本地域名服务器会受到多大的压力,就每次输入个baidu.com还得跑去另一个服务器去找它的IP这个过程就是在磨洋工。
那怎么解决了?
使用缓存保存域名和IP地址的映射。
计算机中DNS记录在本地有两种缓存方式:浏览器缓存和操作系统(OS)缓存。在浏览器中访问的时候,会优先访问浏览器缓存,如果未命中则访问OS缓存,最后再访问本地DNS服务器,然后本地DNS服务器会递归的查找域名记录,然后返回结果。那么浏览器DNS缓存和操作系统DNS缓存又是怎样的呢?
浏览器DNS缓存
浏览器在获取网站域名的实际IP地址后会对其IP进行缓存,减少网络请求的损耗。每种浏览器都有一个固定的DNS缓存时间,如Chrome的过期时间是1分钟,在这个期限内不会重新请求DNS。在Chrome地址栏中输入chrome://net-internals/#dns 就可以看各域名的DNS 缓存时间
操作系统DNS缓存
用户自己配置的host文件,如windows10下配置如下
Windows系统默认开启DNS缓存服务,叫做DNSClient,可以缓存一些常用的域名。使用ipconfig/displaydns 可以查看电脑中缓存的域名。
Linux系统的nscd服务可以实现DNS缓存的功能。不同版本会有不同的配置。
更多DNS缓存知识参考:浅谈DNS缓存机制--浏览器和OS篇
DNS服务器DNS缓存
在本地DNS服务器中也会缓存一些不归这些本地DNS服务器管理的域名。
加入缓存后的完整DNS解析步骤
1.浏览器将会检查缓存中有没有这个域名对应的解析过的IP地址,如果有该解析过程将会结束
2.如果用户的浏览器中缓存中没有,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个IP地址映射,完成域名解析。
3.如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
4.本机m.xyz.com向本地域名服务器dns.xyz.com(如8.8.8.8)进行查询(会经过本地DNS服务器区域解析和本地DNS服务器的缓存)
5.本地域名服务器采用迭代查询。它先向一个根域名服务器查询
6.根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器dns.com的IP地址
7.本地域名服务器向顶级域名服务器dns.com进行查询
8.顶级域名服务器dns.com告诉本地域名服务器,下一次应查询的权限域名服务器dns.abc.com的IP地址
9.本地域名服务器向权限域名服务器dns.abc.com进行查询
10.权限域名服务器dns.abc.com告诉本地域名服务器,所查询的主机的IP地址
11.本地域名服务器最后把查询结果告诉主机m.xyz.com
见代码
通过 DNS 查询 IP 地址的操作称为域名解析,负责执行解析这一操作的就叫解析器。 解析器实际上是一段程序,它包含在操作系统的 Socket 库中 (Socket 库可以让其他的应用程序调用操作系统的网络功能 )。 解析器的用法非常简单,编写应用程序(这里也就是指浏览器)时,如下图写上解析器的程序名称(gethostbyname)以及web服务的域名(http://www.lab.glasscom.com/)进行调用就可以了,这样就完成了对解析器的调用。
应用程序调用解析器图:
整个解析器的工作流程图:
参考文章:
网络是怎样连接的——户根勤 计算机网络(第七版)——谢希仁 浅谈DNS缓存机制--浏览器和OS篇