1、什么是DNS?
域名系统(Domain Name System缩写DNS,Domain Name被译为域名)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。
D N S的一个基本特性是使用超高速缓存。即当一个名字服务器收到有关映射的信息(主
机名字到 I P地址)时,它会将该信息存放在高速缓存中。这样若以后遇到相同的映射请求,
就能直接使用缓存中的结果而无需通过其他服务器查询。
2、DNS顶级域
顶级域名被分为三个部分:
1) arpa是一个用作地址到名字转换的特殊域 。
2) 7个3字符长的普通域。有些书也将这些域称为组织域。
3) 所有2字符长的域均是基于ISO3166中定义的国家代码,这些域被称为国家域,或地理域
顶级域名(Top level domain,简称TLD)由美国的ICANN机构管理
域 | 描述 |
com | 商业组织 |
edu | 教育机构 |
gov | 其他美国政府部门 |
int | 国际组织 |
mil | 美国军事网点 |
net | 网络 |
org | 其他组织 |
3、DNS查询过程
由于 ICANN 管理着所有的顶级域名,所以它是最高一级的域名节点,被称为根域名(root domain)。在有些场合,www.example.com 被写成www.example.com. ,即最后还会多出一个点。这个点就是根域名。
理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。事实上也确实如此,ICANN 维护着一张列表,里面记载着顶级域名和对应的托管商。
比如,我要访问www.example.com ,就必须先询问 ICANN 的根域名列表,它会告诉我.com域名由 Verisign 托管,我必须去找 Verisign,它会告诉我example.com服务器在哪里。
由于根域名列表很少变化,大多数 DNS 服务商都会提供它的缓存,所以根域名的查询事实上不是那么频繁。
保存 DNS 根区文件的服务器,就叫做 DNS 根域名服务器(root name server)。
递归查询:客户端向本地 DNS 服务器(即首选DNS服务器)发出请求后,一直处于等待状态,直到本地名称服务器返回查询结果。当客户端向本地 DNS 服务器发出请求后,本地 DNS 服务器查询本机缓存,如果有记录,则直接返回;如果没有,则本地 DNS 服务器以客户端的身份将查询请求发给根域名服务器,这个过程是递归查询过程。如果递归查询未查出结果,则开始进行迭代查询。
迭代查询:本地 DNS 服务器以客户端的身份将查询请求发给根域名服务器后,根域名服务器通过查询返回给本地 DNS 服务器 .com 顶级名称服务器的IP地址;本地DNS服务器收到 .com 顶级名称服务器的IP地址后继续向.com顶级名称服务器发出请求,顶级名称服务器收到请求后查询缓存,如果有记录则直接返回本地DNS服务器,如果没有,则返回baidu.com二级名称服务器的IP地址;本地名称服务器继续发出请求,二级名称服务器同样查找缓存返回www.baidu.com的IP地址。(最多127级域)。本地 DNS 服务器向根服务器的查询就是迭代查询。
一次完整的查询请求经过的流程: Client -->hosts文件 -->DNS Service Local Cache --> DNS Server (recursion) --> Server Cache --> iteration(迭代) --> 根--> 顶级域名DNS-->二级域名DNS…
1、
标识 | 标志 |
问题数 | 资源记录数 |
授权资源记录数 | 附加资源记录数 |
查询问题 | |
回答(资源记录数可变) | |
授权(资源记录数可变) | |
附加信息(资源记录数可变) |
这个报文由12个字节的首部和4个可变的字段组成。
标识字段:由客户程序设置并由服务器返回结果。客户程序通过它来确定响应与查询是否匹配。
标志字段:16 bit的标志字段被划分为若干子字段
QR(1 bit) | 0表示查询报文, 1表示响应报文 |
opcode(4 bit) | 0表示标准查询,1表示反向查询,2表示服务器状态请求 |
AA(1 bit) | 授权回答 (authoritative answer) |
TC (1 bit) | 可截断的 (truncated),使用UDP时,它表示当应答的总长度超过512字节时,只返回前512个字节 |
RD(1 bit) | 期望递归( recursion desired)。在一个查询中设置,并在响应中返回。这个标志告诉域名服务器必须处理这个查询,也称为一个递归查询。如果该位为 0,且被请求的名字服务器没有一个授权回答,它就返回一个能解答该查询的其他名字服务器列表,这称为迭代查询。 |
RA(1 bit) | 可用递归。如果域名服务器支持递归查询,则在响应中将该比特设置为 1。大多数域名服务器都提供递归查询,除了某些根服务器。 |
zero(3 bit) | 必须为0 |
rcode(4 bit) | 0(没有差错)、3(名字差错)2(服务器错误) 名字差错只有从一个授权名字服务器上返回,它表示在查询中制定的域名不存在。 |
随后的 4个16 bit 字段说明最后 4个变长字段中包含的条目数。对于查询报文,问题( question )数通常是 1,而其他3项则均为0。类似地,对于应答报文,回答数至少是 1,剩下的两项可以是0或非0。
2、DNS查询报文中的问题部分
查询名 | |
查询类型 | 查询类 |
查询名:即要请求的域名,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为 0结束,长度为0的标识符是根标识符。如下图报文06表示了teredo长度,04表示ipv6的长度,以此类推,最后以00结束。计数字节的值必须是 0 ~ 63的数,对于每一级域名长度的限制是63个字符,域名总长度则不能超过253个字符。
最常用的查询类型是 A类型,表示期望获得查询名的 I P地址。一个P T R查询则请求获得一个I P地址对应的域名。
查询类通常是1(IN),指互联网地址
3、DNS响应报文中的资源记录部分
DNS报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR( Resource Record)的相同格式。
域名(可变长度) | |
类型 | 类 |
生存时间 | |
资源数据长度 | 资源数据(可变长度) |
资源数据(可变长度) |
如下图抓包展示的回答字段的值
域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同。
类型说明RR的类型码。它的值和前面介绍的查询类型值是一样的。类通常为internet数据。
生存时间字段是客户程序保留该资源记录的秒数。
资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于类型 1( A记录)资源数据是4字节的I P地址。
我们已经见到了一些不同类型的资源记录(RR):IP地址查询为A类型,指针查询为类型PTR。也已看到了由名字服务器返回的资源记录:回答RR、授权RR和附加信息RR。现有大约20种不同类型的资源记录,下面将介绍其中的一些。
类型 | 数值 | 描述 |
A | 1 | 域名的IPv4地址 |
AAAA | 34 | 域名的IPv6地址 |
CNAME | 5 | 域名的别名,可以理解为域名的重定向,主要方便IP地址的变更 |
NS | 2 | 指定哪个域名服务器可以解析该域名的子域名 |
SOA | 6 | 授权机构记录,记录ns中哪个是主服务器。 |
PTR | 12 | 根据IP反向查找域名 |
HINFO | 13 | 主机信息:包括说明主机CPU和操作系统的两个字符串。并非所有的站点均提供它们系统的HINFO记录 |
MX | 15 | mtp邮箱域名的IP地址。给client端指明某个域名的邮件服务器地址 |
AXFR | 252 | 对区域转换的请求 |
ANY | 255 | 对所有记录的请求 |
DNS-nslookup与dig的使用,这是发送DNS请求两个常用的工具
https://mp.csdn.net/console/editor/html/106328924
https://mp.csdn.net/console/editor/html/106329674
备注:
RFC 1034 [Mockapetris 1987a] 说明了D N S的概念和功能, RFC 1035 [Mockapetris 1987b]详细说明了DNS 的规范和实现。