DNS域名系统(Domain Name System)应用层
DNS协议简介
DNS(域名系统)是一种能够完成从名称到地址或从地址到名称的映射系统。使用DNS,计算机用户可以间接的通过域名来完成通信。Internet中的DNS被设计成为一个联机分布式数据库系统,采用客户服务器方式工作。分布式的机构使DNS具有很强的容错性DNS使用TCP和UDP,端口号都是53,但它主要使用UDP,服务器之间备份使用TCP,全球只有13台根服务器,一个主根服务器在美国,其他12台位辅根服务器,DNS服务器依据角色可以分为:主DNS,从DNS,缓存DNS服务器,DNS转发器。
1、正向解析:根据主机名称(域名)查找对应的IP地址
2、反向解析:根据IP地址查找对应的主机域名
DNS系统类型:
1、缓存域名服务器:
也称为高速缓存服务器
通过向其他域名服务器查询获得域名→IP地址记录
将域名查询结果缓存到本地,提高重复查询时的速度
2、主域名服务器:
特定DNS区域的官方服务,具有唯一性
负责维护该区域内所有域名→IP地址的映射记录
3、从域名服务器:
也称为辅助域名服务器
其维护的域名→IP地址记录来源于主域名服务器
DNS报文格式
DNS报文由12字节长的首部和4个长度可变的字段组成,如图所示:标识字段。占两个字节,由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。
标志字段。16bit的标志字段被划分为若干子字段,如图所示:
QR-查询报文;1:响应报文(使用UDP时,当应答的总长度超过512字节时,只返回前512字节)
opcode-0:标准查询;1:反向查询;2:服务器状态请求。
AA-权威应答域只在响应中有效。如果设置的话,该位表示响应的名称服务器是问题名称域中定义的域名的权威服务器。
TC-该位通常只在响应中出现。它表示响应被切割,因为响应过大而无法适用于数据包的数据部分。例如,如果响应包含大量名称服务器,数据包可能会超过允许的MTU。在这种情况下,数据包被切割,并且将TC域位设置为1。
RD-如果目标名称服务器不包含所请求的信息,该域表示客户机请求递归查询。
RA-该域在响应中有效,它表示响应名称服务器是否提供递归查询。
rcode-该域长度为4位,用于DNS响应中,表示是否出现错误。
问题数。占两个字节,查询问题部分包含的条目数量。
资源记录数。占两个字节,表示回答部分包含的RR数量。
授权资源记录数。占两个字节,表示授权记录部分包括的名称服务器RR的数量。
额外资源记录数。占两个字节,表示包含的其他RR的数量。
查询问题
DNS查询或响应报文中会有查询部分。查询部分中每个问题的格式如图所示:
查询名—表示要查找的名字,它是一个或多个标识符序列。
查询类型—表示查询问题时的类型。最长用的查询类型是A类型,表示期望获得查询名的IP地址;而一个PTR查询则请求获得一个IP地址对应的域名。
查询类—表示查询的类别。其值通常是1,表示Internet类型。
回答
DNS响应报文中会有回答部分。回答部分包括从服务器到客户(解析程序)的回答。其资源记录的格式如图所示:
域名—表示记录中资源数据对应的名字。它的格式和查询名字字段格式相同。
类型—表示资源记录的类型。它的值和查询类型的值是一样的。
类—表示资源记录的类别。它的值和查询类的值是一样的。
生存时间—表示客户程序保留该资源记录的秒数。
资源数据长度—表示资源数据的数量。该数据的格式依赖于类型字段的值。
资源数据—表示该源数据的内容。
授权
DNS响应报文中会有授权部分。授权部分为该查询给出关于一个或多个授权服务器的信息(域名)。其资源记录的格式如图所示:
域名—表示记录中资源数据对应的名字。它的格式和查询名字字段格式相同。
类型—表示资源记录的类型。它的值和查询类型的值是一样的。
类—表示资源记录的类别。它的值和查询类的值是一样的。
生存时间—表示客户程序保留该资源记录的秒数。
资源数据长度—表示资源数据的数量。该数据的格式依赖于类型字段的值。
资源数据—表示该源数据的内容。
附加信息
DNS响应报文中会有附加信息部分。附加信息部分提供有助于解析程序的附加信息。其资源记录的格式如图所示:
域名—表示记录中资源数据对应的名字。它的格式和查询名字字段格式相同。
类型—表示资源记录的类型。它的值和查询类型的值是一样的。
类—表示资源记录的类别。它的值和查询类的值是一样的。
生存时间—表示客户程序保留该资源记录的秒数。
资源数据长度—表示资源数据的数量。该数据的格式依赖于类型字段的值。
资源数据—表示该源数据的内容。
域名空间
所谓域名空间就是一种具有层次结构的命名空间。它采用这样的设计方式:所有的名称由倒置的树结构定义,根节点位于顶部。 树只有128级:0级(根节点)~127级。整棵树汇聚到根节点,树的每一层定义了一种层次级别。如下图所示:树中的每一个节点有一个标号(label)。标号是一个最多包含63个字符的字符串。根节点的标号是空字符串(空串)。DNS要求 每一个节点的子节点(同一节点的分枝节点)有不同的标号,这样能确保域名的唯一性。
树中的每一个节点构成一个域名。一个完整的域名是用符号“.”分隔的标号序列。域名总是从节点向上读取到根节点。 最后一个标号是根节点的标号(为空)。
因特网中的DNS
DNS是一种可以用于不同平台的协议。在因特网中,域名空间(树)分为三个不同部分:通用域、国家域、反向域。如上图所示:通用域:最初的7个三字符域标号和新增的7个域标号,如图所示:
通用域标号
标号 | 描述 |
---|---|
com | 商业机构 |
edu | 教育机构 |
gov | 政府机构 |
int | 国际机构 |
mil | 军事机构 |
net | 网络支持中心 |
org | 非盈利性组织 |
新增域标号
标号 | 描述 |
---|---|
aero | 航空航天公司 |
biz | 商业或者公司 |
coop | 协作商业组织 |
info | 信息服务提供商 |
museum | 博物馆和其他非盈利性组织 |
name | 私人名称 |
pro | 专业个人组织 |
国家域:国家域部分采用与通用域相同的格式,但是在第一级采用两字符的国家英文名缩写(例如 us 代表美国)取代长度为三字符的组织机构标号缩写。第二级标号可以是组织机构,或者更具体一些,由自己国家自己指定。例如,美国使用的州的缩写做为国家域的子域划分(例如 va.us.)。如上图所示:
反向域:反向域用于将地址映射为名称。这里要用到指针(PTR)查询。要处理一项指针查询,反向域需要加入到域名空间中,并且第一级节点称为arpa(由于历史原因)。第二级仍然是单节点,称为in-addr(用于逆向地址)。域的其他部分用于定义IP地址。处理反向域的服务器也是层次结构的。这意味着地址的网络号部分所处的层次要高于主机号部分所处理的层次。同样道理,为整个网站服务的服务器应该比为子网服务的服务器处于更高的层次。这种配置方法使得反向域与通用域或者国家域相比,看起来是倒置的。按照由下向上读取标号的约定,一个IP地址如140.252.13.33(一个B类地址,网络号是140.252)会读取为33.13.252.140.in-addr.arpa。如上图所示:
地址解析
名称映射为地址或者地址映射为名称,称为名称—地址解析(name-address resolution)。解析器:DNS是设计为客户/服务器结构的应用程序。将地址映射为名称或者将名称映射为地址时,主机主要是调用的DNS客户端为解析器(resolver)。 解析器会访问最近的DNS服务器,发送映射请求。如果服务器含有这种信息,它会满足解析器的请求;否则,它会将解析器指向其他服务器,或者请求其他服务器提供这种信息。当解析器接收到映射时,它解析这一响应,以确定是一个真正的解析还是一个错误,最后将结果传递给发出这一请求的进程。
名称到地址的映射:多数情况下,解析器会向服务器提交域名,请求对应的地址。这种情况下,服务器检查通用域或者国家域以查找响应的映射。如果域名来自通用域部分,解析器则会接收到一个域名,如chal.atc.fhda.edu.。查询会由解析器发送到本地DNS服务器寻求解析。 如果本地服务器不能解析这一查询,它要么把解析器指向其他服务器,要么直接请求其他服务器解析。如果域名来自于国家域,则解析器会接收类似于cnri.reston.va.us.形式的域名。处理过程是相同的。
地址到名称的映射:客户端向服务器发送IP地址,请求映射为域名。如前所述,这称为一个PTR查询。要回复这种查询,DNS使用反向查找域。然而,在这种请求中,IP地址是反序的,并且将in-addr和arpa两个标号附加在最后,以创建能够被反向查找域部分接受的域。例如, 如果解析器接收到IP地址140.252.13.33,那么解析器会首先将地址反序,然后在发送请求之前附加两个标号。发送的域名是33.13.252.140.in-addr.arpa.,本地DNS会接受这一地址,并进行解析。
两种解析方式
递归解析
递归解析:客户端(解析器)可以从名称服务器中请求递归应答。这意味着解析器期望服务器提供最终答案。如果服务器是这一域名的授权者,它会检查它的数据库并做出响应。如果服务器不是授权者,它会把请求发送给其他服务器(通常是父服务器),并等待响应。如果父服务器是授权者,它就做出响应。否则它仍把查询发送给其他服务器。 当查询最终得到解析后,响应就回溯知道最终到达发出请求的客户端。这就是递归解析(recursive resolution)。迭代解析
迭代解析:如果客户端没有请求递归查询,则映射以迭代的形式完成。如果服务器是名称的授权者,则它发送应答; 反之,它会返回一个它认为能够解析该查询的服务器的IP地址(给客户端),由客户端负责向第二台服务器重复发送请求。如果新的地址解析服务器能够解析这一问题, 那么就用IP地址响应这一请求。否则,它再向客户端返回新的地址解析服务器的IP地址。这时,客户端必须向第三台服务器重复该请求。 这一过程称为迭代解析(iterative resolution)。
高速缓存
服务器每次接收到不属于自己域的名称请求时,它需要搜索自己的数据库以查找一台服务器的IP地址。缩短这一查询时间能提高效率。DNS使用一种称为高速缓存(caching)的机制处理这一问题。 当服务器向其他服务器请求映射并得到回应时,它首先将这一信息存储在高速缓存中,然后再发送给客户端。如果同一客户端或者其他客户请求同一映射,它会检查本地高速缓存解析这一请求。 然而,要通知客户这一响应来自于高速缓存而不是来源于授权服务器,服务器会将这一响应标志为“非授权性的(unauthoritative)”。高速缓存能够提高解析速度,但也存在问题。如果一台服务器长时间缓存一种映射,可能会发送给客户端一个过期的映射。为了防止这种情况,使用了两种技术。第一种,授权服务器始终给映射增加称为生存时间(time-to-live,TTL)的信息。 TTL以秒为单位定义接收服务器可以缓存这一信息的持续时间。超过这一时间,映射变为无效,并且任何请求必须再次发送到授权服务器。第二种技术,DNS需要每一台服务器为它缓存的每一个映射保持一个TTL计数器。高速缓存会定期检查,清除掉TTL已经经过的映射。