本文摘录自超详细DNS协议解析

DNS协议介绍

由于IP地址不方便记忆且不能显示组织的名称等缺点,人们设计除了域名,通过域名解析协议(DNS, Domain Name System)来将域名和IP地址互相映射。将域名映射成IP称为正向解析,将IP地址映射为域名称为反向解析。

DNS协议可以使用 UDP 或 TCP 进行传输,使用的端口号都是 53。大多数情况下都是用UDP进行传输。

域名层次结构

全世界域名的最高管理机构,是一个叫做 ICANN (Internet Corporation for Assigned Names and Numbers)的组织,总部在美国加州。ICANN 负责管理全世界域名系统的运作

域名具有一定层次结构(从上到下):

  1. 根域名(root domain)
  2. 顶级域名(top level domain, TLD)
  3. 二级域名(Second Level DOmain, SLD)
  4. 三级域名

domain-hierarchical-structure.png

顶级域名

简单来说,就是网址的最后一个部分,比如 www.baidu.com 的顶级域名是_.com_ICANN的一项主要工作就是,就是规定哪些字符串可以当作顶级域名。他们大致可以分为两类:

  • 通用顶级域名(gTLD), 比如.com, .net, .edu, .org 等等,共有700多个
  • 国家顶级域名(ccTLD),比如.cn(中国).io(英属印度洋领域)等,共有300多个

每个顶级域名都找一个托管商 ,该域名的所有事项都由托管商负责。.cn的托管商是中国互联网络信息中心(CNNIC),它决定了.cn域名的各种政策。

二级域名

二级域名在通用顶级域名国家顶级域名之下具有不同意义:

  • 通用顶级域名下:一般指域名注册人使用的网上名称,比如baidu.com
  • 国家顶级域名下:表示注册人类别和功能的标志。比如com.cn域名结构中,表示中国的商业性质组织。

三级域名是形式如www.baidu.com的域名,可以当作二级域名的子域名。三级域名是二级域名的附属物无需单独费用。甚至不能称为域名,一般称为域名下的“二级目录“

根域名

理论上,所有域名的查询都必须先查询根域名, 跟域名会告诉某个顶级域名由哪台服务器管理。

由于根域名列表很少变化,大多数DNS服务商都会提供它的缓存。

域名服务器

域名服务器是指管理域名的主机和相应的软件,它可以管理所在分层域的相关信息。一个域名服务器所负责管理的分层叫做区(ZONE)

域名的每层都有一个域名服务器:

  • 根域名服务器
  • 顶级域名服务器
  • 权限域名服务器

还有一种不再DNS层次结构中,但是很重要的DNS服务器,就是本地域名服务器

根域名服务器

ICANN维护着一张根域名表(DNS root zone), 保存DNS根区文件的服务器,就叫做DNS根域名服务器(root name server)。根域名服务器保存所有顶级域名服务器的地址。

由于早期的 DNS 查询结果是一个 512 字节的 UDP 数据包。这个包最多可以容纳 13 个服务器的地址,因此就规定全世界有 13 个根域名服务器,编号从 a.root-servers.net 一直到 m.root-servers.net。其中 10 台设置在美国,另外各有一台设置于荷兰、瑞典和日本。

顶级域名服务器

用来管理注册在该顶级域名下的所有二级域名,记录这些二级域名的IP地址。

权限域名服务器

与上面两级不同,如果一个二级域名或者三/四级域名对应一个域名服务器,则域名服务器数量会暴增,所以需要划分区的办法来解决这个问题。权限域名服务器就是负责管理这个“区“的域名服务器

区和域其实是不同的,区可以有多种不同的划分方法。以百度为例,我们假设有 fanyi.baidu.comai.baidu.comtieba.baidu.com 这三个三级域名。我们可以这样分区,fanyi.baidu.comtieba.baidu.com 放在 baidu.com 权限域名服务器,ai.baidu.com 放在 ai.baidu.com 权限域名服务器中。并且 baidu.com 权限域名服务器和 ai.baidu.com 权限域名服务器是同等地位的,而具体怎么分区是百度公司根据域名多少、访问多少等情况去自己规定的。

本地域名服务器

本地域名服务器是电脑解析时的默认域名服务器,即电脑中设置的首选DNS服务器和备选DNS服务器。

DNS查询方式

具体的DNS查询有两种方式:

  • 递归查询
  • 迭代查询

迭代查询:如果请求的接受者不知道所请求的内容,那么接受者将扮演请求者,发出相关请求,直到获得所需内容,返回给最初的请求者。

一般来说,域名服务器之间的查询使用迭代查询方式,以免根域名服务器的压力过大

域名缓存

使用缓存保存域名和IP地址的映射。

  1. 浏览器缓存: 浏览器在获取网站域名的实际IP地址后会对其进行缓存,建好网络请求的损耗。每种浏览器都有固定的DNS缓存时间,比如Chrome的过期时间是1分钟。
  2. 操作系统缓存: 操作系统的缓存其实是用户自己配置的hosts文件

Windows系统默认开启DNS缓存服务,服务名是DNSClient,可以缓存一些常用的域名。使用命令ipconfig/displaydns可以查看电脑中缓存的域名。

域名解析过程

1)首先搜索浏览器的 DNS 缓存,缓存中维护一张域名与 IP 地址的对应表;
2)若没有命中,则继续搜索操作系统的 DNS 缓存
3)若仍然没有命中,则操作系统将域名发送至本地域名服务器,本地域名服务器查询自己的 DNS 缓存,查找成功则返回结果(注意:主机和本地域名服务器之间的查询方式是递归查询);
4)若本地域名服务器的 DNS 缓存没有命中,则本地域名服务器向上级域名服务器进行查询,通过以下方式进行迭代查询(注意:本地域名服务器和其他域名服务器之间的查询方式是迭代查询,防止根域名服务器压力过大):

  • 首先本地域名服务器向根域名服务器发起请求,根域名服务器是最高层次的,它并不会直接指明这个域名对应的 IP 地址,而是返回顶级域名服务器的地址,也就是说给本地域名服务器指明一条道路,让他去这里寻找答案
  • 本地域名服务器拿到这个顶级域名服务器的地址后,就向其发起请求,获取权限域名服务器的地址
  • 本地域名服务器根据权限域名服务器的地址向其发起请求,最终得到该域名对应的 IP 地址

4)本地域名服务器将得到的 IP 地址返回给操作系统,同时自己将 IP 地址缓存起来
5)操作系统将 IP 地址返回给浏览器,同时自己也将 IP 地址缓存起来
6)至此,浏览器就得到了域名对应的 IP 地址,并将 IP 地址缓存起来