目录

DNS解析过程

域名解析(获取域名对应的IP的过程)

域名

维基百科解释:
在互联网上,域名是一个字符串,用于标识行政自治、权威或控制的领域。域名通常用于标识通过互联网提供的服务,例如网站、电子邮件服务等。一般来说,域名标识网络域或Internet协议(IP)资源,例如用于访问互联网的个人计算机或服务器计算机。

域名由多个部分组成,每个部分之间用点号(.)分隔。例如,www.example.com这个域名包含了三个部分:www、example和com。其中,com被称为顶级域名(TLD),example被称为二级域名(SLD),而www则是指向该域名下面的具体网络资源(通常是Web服务器)的主机名或子域名。

域名服务器

DNS服务器通常由网络服务提供商或其他组织管理,并分层次结构组织。根域(root domain)是DNS层次结构中的最高级别,下面分布着多个顶级域名(top-level domains,TLD),例如.com、.org、.net等。每个顶级域名下又有二级域名(second-level domain),例如example.com、google.com等。

  • 根域名服务器

指互联网命名系统中的最高层级的DNS服务器,其作用是指向顶级域名服务器,以便查找下一级域名服务器。根域名服务器管理所有顶级域名,如.com、.org、.net等,它们是全球统一的13个根域名服务器,分布在世界各地,并通过Anycast技术提供服务。

  • 顶级域名服务器

是DNS系统中的下一级别,包括国家顶级域名服务器和通用顶级域名服务器。国家顶级域名服务器负责解析该国家的顶级域名,如.cn、.us等;通用顶级域名服务器则负责解析通用顶级域名,例如.com、.org、.net等。每个顶级域名服务器都存储着与其相关的授权域名服务器地址信息。

  • 授权域名服务器(权限域名服务器)

负责一个区的域名服务器,用来保存该区中的所有主机的域名到IP地址的映射。

  • 本地域名服务器

是指用户所在的ISP提供的域名服务器,也称ISP域名服务器。一般默认设置情况下本地DNS为DHCP分配到的运营商的服务器地址。当用户设备发起DNS查询请求时,本地域名服务器负责查询这些请求,并从缓存中返回已缓存的结果,如果没有相关记录,将依次向根域名服务器发送请求,得到初步答案后接着向顶级域名服务器发送另一个请求,然后向权限域名服务器发送最后一个请求,最终得到IP地址作为响应返回给客户端。本地域名服务器通常会缓存最近的DNS查询结果,以便快速响应未来的查询请求。

解析过程

  • 首先,浏览器会检查自己的缓存中是否已经存在URL对应的IP地址。如果有,则跳过后续步骤并直接使用缓存中的 IP 地址。
  • 如果没有缓存,则浏览器会调用域名解析函数库对域名进行解析,以得到此域名对应的IP地址,如果有,则使用查到的IP,否则进入下一步。

Windows 下就是gethostbyname。 在Linux上,除非已安装并运行诸如systemd-resolved,dnsmasq或nscd之类的缓存服务,否则没有操作系统级DNS缓存。

  • 如果系统缓存中也没有,则会查找路由器缓存的DNS记录,没有进入下一步。
  • 如果路由器缓存中也没有该DNS记录,就会检查本地DNS服务器的缓存中是否有该记录,没有接着下一步查询。
  • 如果本地DNS缓存服务器无法找到所需的IP地址,它将根据设置(是否设置转发器)进行查询,最终将解析结果依次返回本地DNS服务器。
    • 如果未使用转发模式(迭代),本地DNS服务器将向“根DNS服务器”发送请求。收到请求后,“根DNS服务器”将确定该域名(.com)的授权管理者,并返回一个负责该顶级域名服务器的IP地址。本地DNS服务器获得IP信息后,将联系该负责域(.com)的服务器。如果该负责域(.com)的服务器无法解析,它将查找管理该域(.com)下一级DNS服务器的地址(baidu.com),并将其传递给本地DNS服务器。本地DNS服务器接收到该地址后,将查找该域(baidu.com)的服务器,重复上述过程,直至找到www.baidu.com主机对应ip。
    • 如果使用转发模式(递归),此DNS服务器将请求转发到上一级DNS服务器,由上一级服务器进行解析。如果上一级服务器无法解析,则会向根DNS发送请求,或把请求转至上上级,以此类推。

DNS查询有两种方式:递归和迭代。DNS客户端设置使用的DNS服务器一般都是递归服务器,它负责全权处理客户端的DNS查询请求,直到返回最终结果。而DNS服务器之间一般采用迭代查询方式。

  • 一旦本地DNS缓存服务器获得了URL对应的IP地址,它会将该信息保存在其缓存中,并将该IP地址返回给用户所使用的浏览器。
  • 浏览器使用该IP地址建立与Web服务器的连接。