一、DNS介绍
域名(Domain Name)是一个标记主机或主机组的名称,相当于IP地址的别名。
域名系统(Domain Name Server)是将域名解析成IP地址的互联网基础服务,提供该服务的服务器成为域名解析服务器。
二、域名结构
域名系统是一个分布式系统,Internat采用树状结构命名,结构如下图所示:
三、DNS解析过程
1、DNS域名解析服务器分类
-
本地域名服务器(Local DNS)
如果通过DHCP配置,Local DNS由ISP提供
-
根域名服务器(Root DNS)
当Local DNS解析不到时,第一步向Root DNS查询,并获得顶级域名服务器的IP地址。Root DNS本身并不直接用于域名解析,仅用于返回可供查询的顶级域名服务器IP地址。
-
顶级域名服务器(Top Level DNS)
负责管理在该顶级域名服务器下注册的二级域名
-
权威域名服务器(Authoritative DNS)
在特定区域内具有唯一性,负责维护该区域内的域名和IP地址映射关系,在DNS应答报文中,标识为AA标识本次DNS记录是否来自于权威域名服务器,否则可能来自于缓存。
2、DNS域名解析中添加的各项解析记录
DNS服务器会把一个域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。域名解析时会添加解析记录,包括:A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发。
- A记录:将域名指向一个IPv4地址,需要增加A记录
- CNAME记录:如果将一个域名指向一个域名,实现与被指向域名相同的访问效果,需要增加CNAME记录。这个域名一般是主机服务提供商提供的一个域名。
- MX记录:建立电子邮箱服务,将指向电子邮箱服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写改记录。
- NS记录:域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录。
- AAAA记录:将主机名或域名指向一个IPv6地址,需要添加AAAA记录
- SRV记录:添加服务器记录服务器服务器记录时会添加此项,SRV记录了那台计算机提供了那哪个服务,格式为:服务的名字.协议的类型
- SOA记录:SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器
- DS记录:委托签发者,此记录用于鉴定DNSSEC已授权区域的签名密钥
- RRSIG记录:DNSSEC 证书,DNSSEC 安全记录集证书,与 SIG 记录使用相同的格式
- PTR记录:PTR记录是A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名
- 现实URL转发记录:将域名指向一个http(s)协议地址,访问域名时,直接跳转至目标地址。
- 隐士URL转发记录:将域名指向一个http(s)协议地址,访问域名时,直接跳转至目标地址,隐性转发会隐藏真实的目标地址(浏览器显示源域名)。
A记录是把域名解析到IP地址,二CNAME是把域名解析到另一个域名,而这个域名最终会指向一个A记录,在实现功能上A记录和CNAME没有区别。
CNAME记录在做IP变更时要比A记录方便。CNAME允许将多个域名映射到一台机器,当有多个域名需要指向同一服务器IP,此时可以将一个域名做A记录指向服务器IP,然后将其他的域名做别名(即:CNAME)到A记录的域名上。当服务器IP地址变更时,只需要更改A记录的那个域名到新IP上,其它做别名的域名会自动更改到新的IP地址上,而不必对每个域名做更改。
3、DNS解析流程
-
查询本地hosts文件映射
手动设置IP与域名的映射关系,保存在hosts文件中
- windows:C:WindowsSystem32driversetchosts
- linux:/etc/hosts
-
查询浏览器或本地DNS缓存
浏览器或本机都会对DNS进行缓存
-
委托LSP-DNS查询(递归查询)
本机向LDNS查询一般都是采用递归查询:如果本机所询问的本地域名服务器不知道查询的IP地址,那么本地域名服务器就以DNS客户的身份,想其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步查询。因此递归查询的结果或者是所要查询的IP,或者报错。
-
LSP-DNS做迭代查询
本地域名服务器向根域名服务器查询通常采用迭代查询:当跟服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出查询对应的IP地址,要么告诉本地域名服务器下一步应该向哪个域名服务器查询。
然后本地域名服务器进行后续查询,根域名服务器通常把自己知道的顶级域名服务器告诉本地域名服务器,本地域名服务器再去顶级域名服务器查询。
-
LSP-DNS将查询结果返回到本机
4、DNS解析步骤
- 首先检查DNS缓存,如果缓存过期或未命中,客户端需要向Local DNS发起查询请求报文
- 客户端向 Local DNS 发送查询报文 ,Local DNS 首先检查自身缓存,如果存在记录则直接返回结果,查询结束;如果缓存老化或未命中,则下一步
- Local DNS 向根域名服务器发送查询报文 ,返回 .com 顶级域名服务器的地址
- Local DNS 向 .com 顶级域名服务器发送查询报文 ,返回所在的权威域名服务器的地址
- Local DNS 向 baidu.com 权威域名服务器发送查询报文 ,得到 IP地址,存入自身缓存并返回给客户端
5、实时跟踪解析过程
- 查询域名对应的IP地址
- 追踪解析过程
事实上,返回CNAME的同一个包中,也返回了 对应的NS列表,之后的解析流程没有跟踪到。
- 本机向Local DNS请求查询
- Local DNS向根域名服务器Root-DNS请求查询,根域名服务器返回com.域的顶级域名服务器GTLS-DNS
- 向com.域GTLS-DNS请求查询,com. 域返回baidu.com域的服务器IP名称列表(通过NS的方式)
- 向baidu的权威域名解析服务器请求查询,返回A记录和CNAME
- 向Root-DNS请求
- 向com.域GTLS-DNS请求查询
- 向shifen.com域DNS查询
- 向a.shifen.com域查询
- 拿到的A记录
- Local DNS返回的CNAME以及的IP
6、DNS缓存
一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。为了改善时延,DNS 服务并不是每次请求都要去访问 DNS 服务器,而是访问过一次后将 DNS 记录缓存在本地。具体来说,DNS 服务是一个多级的缓存:
浏览器缓存 -> 操作系统缓存 -> 路由器缓存 -> Local DNS 缓存 -> DNS 查询
缓存并不是永久有效的,前面提到过 DNS 应答报文中的 TTL(Time to Live)值,它决定了 DNS 记录在缓存中的有效时间。需要注意的是,TTL 只是一个参考值,实际使用的缓存有效时间不一定等于该值,甚至是固定值。
四、DNS存在的问题
1、DNS查询时延
一次完整的 DNS 查询过程需要访问多台 DNS 服务器才能得到最终的结果,这肯定会带来一定的时延。从实践来看,这个时间还不容小觑。
2、缓存一致性
DNS 缓存的存在虽然减少了时延,却是以牺牲一致性(consistency)为代价的。具体来说:Local DNS 是分地区、分运营商的,在域名解析缓存的处理上,实现策略就不统一了。有时候 Local DNS 的解析结果可能不是最近、最优的节点,有的时候并不会遵从 TTL 的限制,而是设置一个固定时间。这就会导致域名指向新的 IP 地址后,一些客户端依然访问了缓存中 旧的 IP 地址。
3、DNS劫持
由于 DNS 缺乏加密、认证、完整性保护的安全机制,容易引发网络完全问题。最常见的域名劫持攻击是针对 DNS 报文首部的事务 ID进行欺骗,由于事务 ID 在查询报文和应答报文中是匹配的,因此伪装 DNS 服务器可以提前将事务 ID 相同的伪造报文发送到客户端,以实现域名劫持(前提是合法的报文还未到达),把目标网站域名解析到错误的 IP 地址。
4、调度不精确
由于存在缓存、转发、NAT 等问题,权威的 DNS 服务器可能会误判客户端所在的位置和运营商,从而导致解析出跨运营商访问的 IP 地址,用户的访问速度降低。
公众号:编程之蝉 专注后台开发、CDN、算法、大数据,欢迎关注,阅读最新更新
五、参考
-
DNS域名解析中各项记录的作用
- 以上就是本篇文章【DNS完整解析流程】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/news/6795.html 资讯 企业新闻 行情 企业黄页 同类资讯 首页 网站地图 返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多