DNS详解(应用层)
DNS(Domain Name System)域名管理系统是为了解决 IP 地址和域名的映射问题:
在我们访问一个网站时,其实我们就是通过 IP 地址找到服务器的地址,然后向该服务器发送 HTTP 请求,服务器接收到请求后在返回结果给我们。例如,我们访问:www.baidu.com
是在向百度服务器发送请求,但是其实他是通过将该域名转化为对应的 IP 地址后再将请求发送到该 IP 地址的服务器上。
其实,我们有一种情况是不需要运用 DNS 就能获取 IP 地址和域名的映射关系的。就是,我们每台计算机下都维护着一张 host 表,他记录了 IP 地址和域名的映射关系。如果我们的计算机通过该表就能获得 IP 地址的话,那么我们就无需动用 DNS 服务了。但是当无法获得时,那么 DNS 就派上用场了。
现在的 DNS 架构是分布式、层次数据库结构,DNS 是应用层协议,基于 UDP 协议之上,端口为 53 。
DNS 服务器自底向上可以依次分为以下几个层级(所有 DNS 服务器都属于以下四个类别之一):
- 根 DNS 服务器。根 DNS 服务器提供 TLD 服务器的 IP 地址。目前世界上只有 13 组根服务器,我国境内目前仍没有根服务器。
- 顶级域 DNS 服务器(TLD 服务器)。顶级域是指域名的后缀,如
com
、org
、net
和edu
等。国家也有自己的顶级域,如uk
、fr
和ca
。TLD 服务器提供了权威 DNS 服务器的 IP 地址。- 权威 DNS 服务器。在因特网上具有公共可访问主机的每个组织机构必须提供公共可访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。
- 本地 DNS 服务器。每个 ISP(互联网服务提供商)都有一个自己的本地 DNS 服务器。当主机发出 DNS 请求时,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 层次结构中。严格说来,不属于 DNS 层级结构
1.DNS 工作流程
DNS 查询解析流程一般分为两种:
- 迭代
- 递归
一般常见的场景就是一开始向本地 DNS 服务器的查询是递归的,其他都是迭代的
依照上面的例子:我们假设有一台请求的源主机为:cis.poly.edu
想向gain.cs.umass.edu
发送请求,但是不知道 IP 地址,于是通过 DNS 服务查询 IP 地址。假设主机cis.poly.edu
的本地 DNS 服务器为dns.poly.edu
,并且gaia.cs.umass.edu
的权威 DNS 服务器为dns.cs.umass.edu
,接下来就是 DNS 协议的执行流程:
1.cis.poly.edu
的主机先查看自身的 host 表,发现并没有目标主机的 IP 地址,于是就向本地 DNS 服务器发送 DNS 请求,该请求报文就包含了目标域名:gain.cs.umass.edu
2.本地 DNS 服务器在接收到 DNS 请求后对报文进行解析后,检查本地缓存后,发现并无记录。所以又向根服务器发送 DNS 请求。
3.根服务器在检查报文后发现域名中包含edu
的顶级域,于是告诉本地的 DNS 服务器dns.poly.edu
,它可以去找edu
TLD 的 DNS 服务器问问。
TLE(Top-Level Domain)顶级域名,顶级域名(TLD)是域名的最右部分位于最后一个点(至于为什么域名最后会有一个点可以看:为什么有时候域名的末尾有个点?)之后。TLD也称为域扩展,用于识别网站的某些元素,例如网站的用途,所有者或地理区域。例如,.edu顶级域允许用户立即将该站点标识为高等教育机构。
4.本地 DNS 服务器就像 edu
的 TLD DNS 发送 DNS 请求,询问 IP 地址
5.服务器接收到请求后,发现自己也不知道目标域名的 IP 位置,但是他注意到了域名有umass.edu
前缀,于是,就告诉本地 DNS 服务器,让他去找 umass.edu
的 DNS 权威服务器问问
6.这一次,本地 DNS 将请求发送给权威 DNS 服务器dns.cs.umass.edu
。
7.终于,由于gaia.cs.umass.edu
向权威 DNS 服务器备案过,在这里有它的 IP 地址记录,权威 DNS 成功地将 IP 地址返回给本地 DNS。
8.最后,本地 DNS 获取到了目标域名的 IP 地址,将其返回给请求主机。
还有一种递归式查找方法,只不过查找顺序不同:
另外,DNS 的缓存位于本地 DNS 服务器。由于全世界的根服务器甚少,只有 400 多台,分为 13 组,且顶级域的数量也在一个可数的范围内,因此本地 DNS 通常已经缓存了很多 TLD DNS 服务器,所以在实际查找过程中,无需访问根服务器。根服务器通常是被跳过的,不请求的。
2.DNS 报文格式
DNS 的报文格式如下图所示:
DNS 报文分为查询和回答报文,两种形式的报文结构相同。
- 标识符。16 比特,用于标识该查询。这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接收到的回答。
- 标志。1 比特的”查询/回答“标识位,
0
表示查询报文,1
表示回答报文;1 比特的”权威的“标志位(当某 DNS 服务器是所请求名字的权威 DNS 服务器时,且是回答报文,使用”权威的“标志);1 比特的”希望递归“标志位,显式地要求执行递归查询;1 比特的”递归可用“标志位,用于回答报文中,表示 DNS 服务器支持递归查询。- 问题数、回答 RR 数、权威 RR 数、附加 RR 数。分别指示了后面 4 类数据区域出现的数量。
- 问题区域。包含正在被查询的主机名字,以及正被询问的问题类型。
- 回答区域。包含了对最初请求的名字的资源记录。在回答报文的回答区域中可以包含多条 RR,因此一个主机名能够有多个 IP 地址。
- 权威区域。包含了其他权威服务器的记录。
- 附加区域。包含了其他有帮助的记录。
3.DNS 记录
在 DNS 查询响应分组时,需要查询自己的数据库,这个数据库的每个条目被称为资源记录(Resource Record,RR)。RR 提供了主机名到 IP 地址的映射。
RR 是一个包含了Name
, Value
, Type
, TTL
四个字段的四元组
TTL
是该记录的生存时间,它决定了资源记录应当从缓存中删除的时间。Name
和
Value字段的取值取决于
Type
- 如果
Type=A
,则Name
是主机名信息,Value
是该主机名对应的 IP 地址。这样的 RR 记录了一条主机名到 IP 地址的映射。- 如果
Type=AAAA
(与A
记录非常相似),唯一的区别是 A 记录使用的是 IPv4,而AAAA
记录使用的是 IPv6。- 如果
Type=CNAME
(Canonical Name Record,真实名称记录) ,则Value
是别名为Name
的主机对应的规范主机名。Value
值才是规范主机名。CNAME
记录将一个主机名映射到另一个主机名。CNAME
记录用于为现有的A
记录创建别名。下文有示例。- 如果
Type=NS
,则Name
是个域,而Value
是个知道如何获得该域中主机 IP 地址的权威 DNS 服务器的主机名。通常这样的 RR 是由 TLD 服务器发布的。- 如果
Type=MX
,则Value
是个别名为Name
的邮件服务器的规范主机名。既然有了MX
记录,那么邮件服务器可以和其他服务器使用相同的别名。为了获得邮件服务器的规范主机名,需要请求MX
记录;为了获得其他服务器的规范主机名,需要请求CNAME
记录。NAME TYPE VALUE -------------------------------------------------- bar.example.com. CNAME foo.example.com. foo.example.com. A 192.0.2.23
当用户查询
bar.example.com
的时候,DNS Server 实际返回的是foo.example.com
的 IP 地址,即:192.0.2.23