赞
踩
DNS,Domain Name System,域名系统
它是一个层次树状结构的联机分布式数据库系统
可以理解为电话簿或翻译器,将域名转化为IP地址
本文尽可能全面的归纳总结DNS的整个工作和一些细节
域名服务主要是基于UDP实现的,端口号为53
域名具有唯一性
域名采用了层次结构的命名方法:
例子:www.baidu.com
顶级域名有三种:国家顶级域名(nTLD)、通用顶级域名(gTLD)、基础结构域名(infrastructure domain)
资源记录(resourse record)就是域名服务器保存的记录,也是解析器请求的内容,资源记录会被存在zone文件中
每个区在区的开始处都包含了一个起始授权记录( Start of Authority Record) ,简称SOA记录
SOA定义了域的全局参数,进行整个域的管理设置,存储有关域的重要信息,如管理员的电子邮件地址、上次更新域的时间,以及服务器在刷新之间应等待的时间
每个区域文件只允许存在唯一的SOA记录
NS(Name Server)记录是域名服务器记录,也称为授权服务器,用来指定该域名由哪个DNS服务器来进行解析,每个区在区根处至少包含一个NS记录
将网站的NS记录指向到目标地址,在设置NS记录的同时还需要设置目标网站的指向,否则NS记录将无法正常解析
NS记录优先于A记录。即,如果一个主机地址同时存在NS记录和A记录,则A记录不生效。(CDN缓存会用到此记录)
例
A记录是将一个主机名(全称域名FQDN)和一个IP地址关联起来,如果是IPv6,就用AAAA记录
地址( A )资源记录把FQDN(Fully Qualified Domain Name)映射到IP地址,因为有此记录 ,所以DNS服务器能解析FQDN域名对应的IP地址
这也是大多数客户端程序默认的查询类型
例子
此处的“@”表示这是根域的记录,“14400”这个值是 TTL(生存时间),以秒为单位。A 记录的默认 TTL 是 14400 秒。这意味着,如果更新 A 记录,则需要 240 分钟(14400秒)后才会生效
PTR记录将一个IP地址对应到主机名(全称域名FQDN)
这些记录保存在in-addr.arpa域中
相对于A资源记录,指针( PTR )记录把IP地址映射到FQDN,用于反向查询 ,通过IP地址,找到域名
别名记录( CNAME )资源记录创建特定FQDN的别名,也称为规范名字(Canonical Name)
这种记录允许您将多个名字映射到同一台计算机,用户可以使用CNAME记录来隐藏用户网络的实现细节,使连接的客户机无法知道真正的域名
例: ping百度时,解析到了百度的别名服务器。百度有个cname=www.a.shifen.com.的别名
MX记录是邮件交换记录,它指向一个邮件服务器,用于电子邮件系统发邮件时根据收信人的地址后缀来定位邮件服务器
MX记录也叫做邮件路由记录,用户可以将该域名下的邮件服务器指向到自己的mail server上,然后即可自行操控所有的邮箱设置
当有多个MX记录(即有多个邮件服务器)时,则需要设置数值来确定其优先级。通过设置优先级数字来指明首选服务器,数字越小表示优先级越高
“服务”记录指定特定服务的主机和端口,例如 IP 语音 (VOIP)、即时消息等
例
在上面的示例中,“_sip”指示服务类型,“_tcp”指示协议,“8080”指示端口,而“example.com”是主机
域名需要由遍及全世界的域名服务器去解析
域名服务器实际上就是装有域名系统的主机
一个域名服务器所负责的范围,或者说有管理权限的范围,就称为“区”(zone),区<=域,一个例子如下:
域名是分层结构,域名服务器也是对应的层级结构:
最高层次的域名服务器,也是最重要的域名服务器
IPv4时代,全球共设有 13 个根域名服务器
所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP 地址
当其他的域名服务器无法解析域名时,会首先求助于根域名服务器,可将其视为指向不同书架的图书馆中的索引,一般其作为对其他更具体位置的引用
顶级域名服务器(top-level-domain) 负责管理在该顶级域名服务器上注册的所有二级域名,可被视为图书馆中的特定书架
当收到 DNS 查询请求时,就给出相应的回答
负责一个区的域名服务器,可视为书架上的字典,其中特定名称可被转换成其定义
权威性域名服务器是域名服务器查询中的最后一站,如果权威性域名服务器能够访问请求的记录,则其会将已请求主机名的 IP 地址返回到发出初始请求的 DNS 解析器(图书管理员)。当一个权限域名服务器没有给出最后的查询结果时,就会告诉发出查询请求的 DNS 客户,下一步应当查询哪一个权限域名服务器
本地域名服务器(local name server)并不属于上面的服务器层次结构,但是它在域名服务系统却发挥着至关重要的作用
当一台主机发出 DNS 查询请求时,这个查询请求报文就会发送给本地域名服务器。每一个互联网提供者,或者一个大学,甚至小到一个学院,都可以拥有一台本地域名服务器,这种域名服务器也被称为默认域名服务器。我们本地网络服务连接的域名服务器指的就是本地域名服务器。
DNS解析器(DNS resolver)是域名服务器的客户端,是DNS 查找的第一站,其负责与发出初始请求的客户端打交道。解析器启动查询序列,它负责向域名服务器发起一系列请求,然后成功解析域名
按我理解,这玩意儿有时候也被认为是本地域名服务器
域名解析过程如图所示:
典型 DNS 查找中会出现三种类型的查询。通过组合使用这些查询,优化的 DNS 解析过程可缩短传输距离。在理想情况下,可以使用缓存的记录数据,从而使 DNS 域名服务器能够返回非递归查询
本地域名服务器向根域名服务器的查询方式通常采取迭代查询(iterative query)
迭代查询有以下的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“我这里没有你要的查询结果,你需要向哪一台域名服务器进行查询”。然后本地域名服务器进行后续的查询(不替代本地域名服务器)。根域名服务器通常是把自己知道的顶级域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向顶级域名服务器查询。顶级域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机
通俗讲,迭代是我交给你一件事,你能办多少就告诉我你办了多少,然后剩下的事情就由我来办
主机向本地域名服务器的查询一般都采用递归查询(recursive query)
所谓的递归查询就是:如果主机所询问的本地域名服务器不知道被查出来的域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文(替代该主机继续查询),而不是主机自己进行下一步的查询。因此,递归查询返回的结果要么是所查询的 IP 地址,要么报错,表示无法查到所需要的 IP
通俗讲,递归是把一件事情交给别人,如果事情没有办完,哪怕已经办了很多,都不要把结果告诉我,我要的是你的最终结果,而不是中间结果;如果你没办完,请你找别人办完。
当 DNS 解析器客户端查询 DNS 服务器以获取其有权访问的记录时通常会进行此查询,因为其对该记录具有权威性,或者该记录存在于其缓存内
DNS 服务器通常会缓存 DNS 记录,以防止更多带宽消耗和上游服务器上的负载
通俗讲,就是你查的我有缓存或你查的就是我管的
针对上面两种方式,我们可以知道不管是递归查询还是迭代查询,都会发送 8 个 UDP 用户数据报的报文。为了提高 DNS 的查询效率,减轻根域名服务器的负荷和 DNS 数据报的查询数量,在域名服务器中广泛地使用了高速缓存。高速缓存用来存放最近查询过的域名以及从何处获得域名映射信息的记录。
假设我们要查询www.baidu.com/域名对应的 IP 地址,如果本地域名服务器上有该域名对应的 IP 地址,那么可以直接从本地域名服务器上获得对应的 IP 地址,而不需要到根域名服务器上进行查询。当本地域名服务器查询不到 IP 地址时,本地域名服务器也可以不向根域名服务器发送请求报文,而是直接向顶级域名服务器发送查询请求报文。
不仅在本地域名服务器中有高速缓存,在主机中也有。很多主机在启动的时候从本地域名服务器下载名字和地址的全部数据库,维护存放自己使用的域名的高速缓存,只有在缓存中找不到名字时才使用域名服务器。每个位置均将存储 DNS 记录并保存由生存时间(TTL)决定的一段时间。
现代 Web 浏览器设计为默认将 DNS 记录缓存一段时间。目的很明显;越靠近 Web 浏览器进行 DNS 缓存,为检查缓存并向 IP 地址发出正确请求而必须采取的处理步骤就越少。发出对 DNS 记录的请求时,浏览器缓存是针对所请求的记录而检查的第一个位置。
例:在 Chrome 浏览器中,您可以转到 chrome://net-internals/#dns
查看 DNS 缓存的状态。
操作系统级 DNS 解析器是 DNS 查询离开您计算机前的第二站,也是本地最后一站。操作系统内旨在处理此查询的过程通常称为“存根解析器”或 DNS 客户端。当存根解析器获取来自某个应用程序的请求时,其首先检查自己的缓存,以便查看是否有此记录。如果没有,则将本地网络外部的 DNS 查询(设置了递归标记)发送到 Internet 服务提供商(ISP)内部的 DNS 递归解析器。
与先前所有步骤一样,当 ISP 内的递归解析器收到 DNS 查询时,其还将查看所请求的主机到 IP 地址转换是否已经存储在其本地持久性层中。
根据其缓存中具有的记录类型,递归解析器还具有其他功能:
DNS 分为查询请求和查询响应,请求和响应的报文结构基本相同,如下:
首部共12字节:
其中,标志段如下:
Domain Name System (query)
Transaction ID: 0x9ad0 #事务ID
Flags: 0x0000 Standard query #报文中的标志字段
0... .... .... .... = Response: Message is a query
#QR字段, 值为0, 因为是一个请求包
.000 0... .... .... = Opcode: Standard query (0)
#Opcode字段, 值为0, 因为是标准查询
.... ..0. .... .... = Truncated: Message is not truncated
#TC字段
.... ...0 .... .... = Recursion desired: Don't do query recursively
#RD字段
.... .... .0.. .... = Z: reserved (0) #保留字段, 值为0
.... .... ...0 .... = Non-authenticated data: Unacceptable
#保留字段, 值为0
Questions: 1 #问题计数, 这里有1个问题
Answer RRs: 0 #回答资源记录数
Authority RRs: 0 #权威名称服务器计数
Additional RRs: 0 #附加资源记录数
该部分是用来显示 DNS 查询请求的问题,通常只有一个问题
该部分包含正在进行的查询信息,包含查询名(被查询主机名字)、查询类型、查询类:
例子
一个请求包
Domain Name System (query) #查询请求
Queries #问题部分
baidu.com: type A, class IN
Name: baidu.com #查询名字段, 这里请求域名baidu.com
[Name Length: 9]
[Label Count: 2]
Type: A (Host Address) (1) #查询类型字段, 这里为A类型
Class: IN (0x0001) #查询类字段, 这里为互联网地址
资源记录部分只有在 DNS 响应包中才会出现
例子
一个响应包
# 回答区域
Answers #“回答问题区域”字段
baidu.com: type A, class IN, addr 220.181.57.216 #资源记录部分
Name: baidu.com #域名字段, 这里请求的域名为baidu.com
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001) #类字段
Time to live: 5 #生存时间
Data length: 4 #数据长度
Address: 220.181.57.216 #资源数据, 这里为IP地址
baidu.com: type A, class IN, addr 123.125.115.110 #资源记录部分
Name: baidu.com
Type: A (Host Address) (1)
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 123.125.115.110
# 权威名称服务器区域
Authoritative nameservers #“权威名称服务器区域”字段
baidu.com: type NS, class IN, ns ns7.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2) #类型字段, 这里为NS类型
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns7.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns dns.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2) #类型字段, 这里为NS类型
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: dns.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns3.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns3.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns4.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns4.baidu.com #权威名称服务器
baidu.com: type NS, class IN, ns ns2.baidu.com #资源记录部分
Name: baidu.com
Type: NS (authoritative Name Server) (2)
Class: IN (0x0001)
Time to live: 5
Data length: 6
Name Server: ns2.baidu.com #权威名称服务器
# 附加信息区域字段的资源记录部分信息如下:
Additional records #“附加信息区域”字段
dns.baidu.com: type A, class IN, addr 202.108.22.220 #资源记录部分
Name: dns.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 202.108.22.220 #“权威名称服务器”的IP地址
ns2.baidu.com: type A, class IN, addr 61.135.165.235 #资源记录部分
Name: ns2.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 61.135.165.235 #“权威名称服务器”的IP地址
ns3.baidu.com: type A, class IN, addr 220.181.37.10 #资源记录部分
Name: ns3.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 220.181.37.10 #“权威名称服务器”的IP地址
ns4.baidu.com: type A, class IN, addr 220.181.38.10 #资源记录部分
Name: ns4.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 220.181.38.10 #“权威名称服务器”的IP地址
ns7.baidu.com: type A, class IN, addr 180.76.76.92 #资源记录部分
Name: ns7.baidu.com #“权威名称服务器”名称
Type: A (Host Address) (1) #类型字段, 这里为A类型
Class: IN (0x0001)
Time to live: 5
Data length: 4
Address: 180.76.76.92 #“权威名称服务器”的IP地址
dig math.stackexchange.com
dig +trace math.stackexchange.com # 显示整个分机查询过程
dig ns stackexchange.com # 查询NS记录
host github.com
host facebook.github.com
host 192.30.252.153 # 逆向
$ nslookup
> facebook.github.io
Server: 192.168.1.253
Address: 192.168.1.253#53
Non-authoritative answer:
facebook.github.io canonical name = github.map.fastly.net.
Name: github.map.fastly.net
Address: 103.245.222.133
whois github.com
1.1.1.1 是浏览 Internet 的一种快速且私密的方式
它是一种公共 DNS 解析器,但与大多数 DNS 解析器不同,1.1.1.1 不会向广告商出售用户数据
1.1.1.1 的实现使其成为目前最快的解析器
关键在于数据包大小带来的开销
归纳总结了DNS整个工作和细节
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。