0x01 DNS空间结构
域名空间
域名空间由一个树形数据结构组成。树中的每个节点或树叶都有一个标签和零个或多个资源记录(RR resource records ),这些资源记录与域名相关的信息。域名本身由标签组成的,可能与其右侧父节点的名称连接,用点分隔。所述的树被细分为区域一从根区域开始细分。一个DNS区域可以由只有一个域,或者可以由多个域和子域组成,这取决于区域管理的选择。DNS也可以根据类进行分区; 单独的类可以被认为是一个平行命名空间树的数组。
互联网类的分级域名系统,由域组成,每个区域由域名服务器提供服务
任何区域的行政责任可以通过创建额外的区域来划分。新区的权限被委托给指定的域名服务器。父区不再是新区的权威。
域名语法
RFC 1035,RFC 1123和RFC 2181中对域名形成规则进行了明确描述。一个域名由一个或多个部分组成,技术上称为标签,并且由点连接在一起,例如example.com。
最右边的标签表示顶级域名 ; 例如,域名www.example.com属于顶级域com。
域的层次结构从右到左递减;左边的每个标签指定了右侧域或右侧域的子域。例如:标签示例指定com域的子域,而www是example.com的子域。这个细分树可能有127层。
标签可能包含0到63个字符。长度为零的空标签被保留用于根区域。完整的域名在其文本表示中不得超过253个字符。在DNS的内部二进制表示中,*最大长度需要255个八位字节的存储空间*,因为它也存储名称的长度。
尽管域名在理论上可以由任何可以在八位字节中表示的字符组成,但主机名使用首选的格式和字符集。其标签中允许的字符是ASCII字符集的一个子集,由字符a到z,A到Z,数字0到9以及连字符组成。这个规则被称为LDH规则(字母letters,数字digits,连字符hyphen)。
域名是以与个案无关的方式解释的。
标签不能以连字符开头或结尾。
另外一个规则要求顶级域名不应该是全数字。
国际化的域名
DNS中只允许使用的有限的ASCII字符集阻止了以本地字母或脚本表示多种语言的名称和单词。为了做到这一点,ICANN批准了应用程序国际化域名(IDNA)系统,用户应用程序(如Web浏览器)使用Punycode将Unicode字符串映射到有效的DNS字符集中。2009年,ICANN批准国际化域名的安装采用国家代码顶级域名(ccTLD)。另外,许多登记现有的顶级域名(TLDs)都采用了IDNA系统。
域名服务器
域名系统由分布式数据库系统维护,该系统使用C/S模型。这个数据库的节点是域名服务器。每个域至少有一个权威DNS服务器,用于发布有关该域的信息以及从属域的域名服务器。层次结构的顶部由根名称服务器提供服务,服务器在查找(解析)TLD(顶级域名) 时进行查询。
权威域名服务器
权威域名服务器是一个配置为通过对包含原始源数据的DNS查询给出答案的 域名服务器,例如,域管理员或由动态DNS方法,而相比之下,通过查询获得的另一个域名服务器应答只维护一个数据缓存,而权威服务器是最原始的响应域名服务器。
权威名称服务器可以是主服务器或从服务器。主服务器是存储所有区域记录的原始(主)副本的服务器。从服务器在与主服务器通信时使用DNS协议中的特殊自动更新机制来维护主记录的相同副本。
每个DNS区域都必须分配一组权威的名称服务器。这组服务器存储在具有域名服务器(NS:name server)记录的父域区域中。
一个权威的服务器通过设置一个协议标志(在其响应中称为“ 授权应答Authoritative Answer ”(AA)位)来指示其提供权威性答案的状态,从而确定权威域名服务器是具有权威性的。这个标志通常会在DNS管理查询工具的输出(如dig)中显着复制,以表明响应的域名服务器是相关域名的权威。
域名系统并不像电话号码通讯录那么简单,通讯录主要是单个个体在使用,同一个名字出现在不同个体的通讯录里并不会出现问题,但域名是群体中所有人都在用的,必须要保持唯一性。为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法。每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成,标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label),每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。级别最低的域名写在左边,级别最高的域名写在右边。域名服务主要是基于UDP实现的,服务器的端口号为53。
比如:本网站的域名jocent.me
,由点号分割成了两个域名jocent
和me
,其中me
是顶级域名(TLD,Top-Level Domain),jocent
是二级域名(SLD,Second Level Domain)。关于域名的层次结构,请看下面的示意图。
注意:最开始的域名最后都是带了点号的,比如jocent.me
搁以前的话应该是jocent.me.
,最后面的点号表示根域名服务器,后来发现所有的网址都要加上最后的点,就简化了写法,干脆所有的都不加,但是你在网址后面加上点号也是可以正常解析的。
1.2. 域名服务器
有域名结构还不行,还需要有一个东西去解析域名,手机通讯录是由通讯录软件解析的,域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。由高向低进行层次划分,可分为以下几大类:
- 根域名服务器:最高层次的域名服务器,也是最重要的域名服务器,本地域名服务器如果解析不了域名就会向根域名服务器求助。全球共有13个不同IP地址的根域名服务器,它们的名称用一个英文字母命名,从a一直到m。这些服务器由各种组织控制,并由 ICANN(互联网名称和数字地址分配公司)授权,由于每分钟都要解析的名称数量多得令人难以置信,所以实际上每个根服务器都有镜像服务器,
每个根服务器与它的镜像服务器共享同一个 IP 地址,
中国大陆地区内只有6组根服务器镜像(F,I(3台),J,L)。当你对某个根服务器发出请求时,请求会被路由到该根服务器离你最近的镜像服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和地址,如果向根服务器发出对
“jocent.me”
的请求,则根服务器是不能在它的记录文件中找到与“jocent.me”
匹配的记录。但是它会找到“me”
的顶级域名记录,并把负责“me”
地址的顶级域名服务器的地址发回给请求者。 - 顶级域名服务器:负责管理在该顶级域名服务器下注册的二级域名。当根域名服务器告诉查询者顶级域名服务器地址时,查询者紧接着就会到顶级域名服务器进行查询。比如还是查询
"jocent.me"
,根域名服务器已经告诉了查询者“me”
顶级域名服务器的地址,“me”
顶级域名服务器会找到“jocent.me”
的域名服务器的记录,域名服务器检查其区域文件,并发现它有与“jocent.me”
相关联的区域文件。在此文件的内部,有该主机的记录。此记录说明此主机所在的 IP 地址,并向请求者返回最终答案。 - 权限域名服务器:负责一个区的域名解析工作
- 本地域名服务器:当一个主机发出DNS查询请求的时候,这个查询请求首先就是发给本地域名服务器的。
1.3. 域名解析过程
域名解析总体可分为两大步骤,第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址。从下面对jocent.me
进行域名解析的报文中可明显看出这两大步骤。注意:第二大步骤中采用的是迭代查询,其实是包含了很多小步骤的,详情见下面的流程分析。
其具体的流程可描述如下:
- 主机10.74.36.90先向本地域名服务器10.74.1.11进行递归查询
- 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
- 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器
dns.me
的IP地址 - 本地域名服务器向顶级域名服务器
dns.me
进行查询 - 顶级域名服务器
me
告诉本地域名服务器,下一步查询权限服务器dns.jocent.me
的IP地址 - 本地域名服务器向权限服务器
dns.jocent.me
进行查询 - 权限服务器
dns.jocent.me
告诉本地域名服务器所查询的主机的IP地址 - 本地域名服务器最后把查询结果告诉 10.74.36.90
其中有两个概念递归查询和迭代查询,其实在整个描述的过程中已经体现的很明显,这里再说明一下:
- 递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
- 迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询