首先粗略过一下DNS的解析过程:
下图,客户端访问www.163.com,依次会经历:
本地host文件—>本地DNS缓存—>本地DNS服务器—>根DNS服务器或上级DNS服务器(根据是否设有转发器)—>…直到获得该域名对应的 IP 地址
名词解释:
递归查询与迭代查询
一、主机向本地域名服务器的查询一般都是采用递归查询。
所谓递归查询就是:如果主机所询问的本地域名服务器不知道被查询的域名的IP地址,那么本地域名服务器就以DNS客户的身份,
向其它根域名服务器继续发出查询请求报文(即替主机继续查询),而不是让主机自己进行下一步查询。
因此,递归查询返回的查询结果或者是所要查询的IP地址,或者是报错,表示无法查询到所需的IP地址。
二、本地域名服务器向根域名服务器的查询的迭代查询。
迭代查询的特点:当根域名服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出所要查询的IP地址,要么告诉本地服务器:“你下一步应当向哪一个域名服务器进行查询”。
然后让本地服务器进行后续的查询。根域名服务器通常是把自己知道的*域名服务器的IP地址告诉本地域名服务器,让本地域名服务器再向*域名服务器查询。
*域名服务器在收到本地域名服务器的查询请求后,要么给出所要查询的IP地址,要么告诉本地服务器下一步应当向哪一个权限域名服务器进行查询。
最后,知道了所要解析的IP地址或报错,然后把这个结果返回给发起查询的主机
递归查询 VS 迭代查询
客户端-本地dns服务端:这部分属于递归查询。
本地dns服务端—外网:这部分属于迭代查询。
递归查询时,返回的结果只有两种:查询成功或查询失败。
迭代查询,又称作重指引,返回的是最佳的查询点或者主机地址。
权威性
我们去本地DNS服务器时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
用命令:nslookup www.163.com 可以试一试。
DNS常见的坑
1.缓存问题
考虑到DNS服务器查询的效率和负担问题,一般DNS服务器在下发解析的时候是带有缓存时间的(10min或者是1h,主要由DNS服务器决定),而且这个缓存是下发到用户终端。客户端会先查本地host文件,然后是看缓存是否有这个解析记录。
在内网环境:DNS缓存时间我们是可控的,比如我们部署为1h缓存时间,提供服务的机器ip要更换了,又想要做到快速切换,那我们需要在修改指向关系的1小时前把这个域名的缓存时间改成1min或者30s,那么1小时后可保证等所有用户的缓存时间都过了再做域名指向关系的修改,那就能达到快速切换的效果。
在外网环境:因为DNS缓存是下发给运营商下发的,即使我们改了缓存时间为30s,用户那里还是1小时,这就尴尬了!
2. UDP报文长度
UDP报文的最大长度为512字节,而TCP则允许报文长度超过512字节。当DNS查询超过512字节时,协议的TC标志出现删除标志,这时则使用TCP发送。通常传统的UDP报文一般不会大于512字节。 但有时候域名对应的IP很多会使UDP长度大于512字节,而网络里禁掉了TCP 53,这是会影响DNS解析。(这个坑被博主亲自踩过!)
CNAME 以及CDN加速
CNAME 记录 也叫别名记录
www.qq123.com —> www.qq.com —> 1.1.1.1 把别名www.qq123.com指向了www.qq.com,通过A记录www.qq.com指向了1.1.1.1,这样访问域名www.qq.123.com 就可以解析到IP1.1.1.1 了。
当www.qq.com 有多个别名时:
www.qq456.com —> www.qq.com —> 1.1.1.1
www.qq789.com —> www.qq.com —> 1.1.1.1
如果www.qq.com 的IP 要更换,只需要改A记录。域名 www.qq.com —> 1.1.1.2,CNAME不需要一一更改。
利用CNAME CDN加速
当终端用户向mianzu.cn 下的某一资源发起请求时:
1. 向本地LDNS发起域名解析请求(本地运营商提供的DNS服务器,会缓存大部分域名解析);
2. 当LDNS解析mianzu.cn时没有发现本地缓存资源,于是将请求转发到网站授权的DNS;
3. 授权DNS发现mianzu.cn已经配置了CNAME:mianzu.cdn.cn,返回mianzu.cdn.cn;
4. LDNS将mianzu.cdn.cn的解析请求发到CDN服务商的DNS调度服务器;
5. DNS调度服务器根据终端用户的源IP,返回最近的节点IP1.1.1.1给LDNS;
6. LDNS返回1.1.1.1给终端用户;
7. 终端用户向1.1.1.1发起资源请求。(分两种情况:如果静态请求,改IP缓存了改资源,则将数据返回给终端用户,若没有缓存则向源站请求并缓存该资源然后返回给终端用户;如果动态请求则转给后端源站处理。)
8.返回内容