dns域名解析服务器协议流程动态域名解析软件排名


dns域名解析服务器协议流程动态域名解析软件排名

域名系统(DomainNameServer)是将域名解析成IP地址的互联网基础服务,提供该服务的服务器成为域名解析服务器。

当LocalDNS解析不到时,第一步向RootDNS查询,并获得顶级域名服务器的IP地址。RootDNS本身并不直接用于域名解析,仅用于返回可供查询的顶级域名服务器IP地址。

在特定区域内具有唯一性,负责维护该区域内的域名和IP地址映射关系,在DNS应答报文中,标识为AA标识本次DNS记录是否来自于权威域名服务器,否则可能来自于缓存。

​DNS服务器会把一个域名解析到一个IP地址,然后在此IP地址的主机上将一个子目录与域名绑定。域名解析时会添加解析记录,包括:A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发。

​A记录是把域名解析到IP地址,二CNAME是把域名解析到另一个域名,而这个域名最终会指向一个A记录,在实现功能上A记录和CNAME没有区别。

​CNAME记录在做IP变更时要比A记录方便。CNAME允许将多个域名映射到一台机器,当有多个域名需要指向同一服务器IP,此时可以将一个域名做A记录指向服务器IP,然后将其他的域名做别名(即:CNAME)到A记录的域名上。当服务器IP地址变更时,只需要更改A记录的那个域名到新IP上,其它做别名的域名会自动更改到新的IP地址上,而不必对每个域名做更改。

本机向LDNS查询一般都是采用递归查询:如果本机所询问的本地域名服务器不知道查询的IP地址,那么本地域名服务器就以DNS客户的身份,想其他根域名服务器继续发出查询请求报文,而不是让该主机自己进行下一步查询。因此递归查询的结果或者是所要查询的IP,或者报错。

本地域名服务器向根域名服务器查询通常采用迭代查询:当跟服务器收到本地域名服务器发出的迭代查询请求报文时,要么给出查询对应的IP地址,要么告诉本地域名服务器下一步应该向哪个域名服务器查询。

然后本地域名服务器进行后续查询,根域名服务器通常把自己知道的顶级域名服务器告诉本地域名服务器,本地域名服务器再去顶级域名服务器查询。

​事实上,返回CNAME的同一个包中,也返回了.对应的NS列表,之后.的解析流程没有跟踪到。

​一次完整的DNS查询过程需要访问多台DNS服务器才能得到最终的结果,这肯定会带来一定的时延。为了改善时延,DNS服务并不是每次请求都要去访问DNS服务器,而是访问过一次后将DNS记录缓存在本地。具体来说,DNS服务是一个多级的缓存:

​缓存并不是永久有效的,前面提到过DNS应答报文中的TTL(TimetoLive)值,它决定了DNS记录在缓存中的有效时间。需要注意的是,TTL只是一个参考值,实际使用的缓存有效时间不一定等于该值,甚至是固定值。

​一次完整的DNS查询过程需要访问多台DNS服务器才能得到最终的结果,这肯定会带来一定的时延。从实践来看,这个时间还不容小觑。

​DNS缓存的存在虽然减少了时延,却是以牺牲一致性(consistency)为代价的。具体来说:LocalDNS是分地区、分运营商的,在域名解析缓存的处理上,实现策略就不统一了。有时候LocalDNS的解析结果可能不是最近、最优的节点,有的时候并不会遵从TTL的限制,而是设置一个固定时间。这就会导致域名指向新的IP地址后,一些客户端依然访问了缓存中旧的IP地址。

​由于DNS缺乏加密、认证、完整性保护的安全机制,容易引发网络完全问题。最常见的域名劫持攻击是针对DNS报文首部的事务ID进行欺骗,由于事务ID在查询报文和应答报文中是匹配的,因此伪装DNS服务器可以提前将事务ID相同的伪造报文发送到客户端,以实现域名劫持(前提是合法的报文还未到达),把目标网站域名解析到错误的IP地址。

​由于存在缓存、转发、NAT等问题,权威的DNS服务器可能会误判客户端所在的位置和运营商,从而导致解析出跨运营商访问的IP地址,用户的访问速度降低。