DNS:层次结构、解析、记录与缓存
DNS(Domain Name System)
人类可以用很多种方式来表示,比如姓名、身份证号、社保号等,但是人类会更乐意使用容易记忆的姓名而不是社保号。想象一下人们之间这样说话:“你好,我叫132-67-9875”。
主机可以使用主机名(hostname)进行表示,例如www.google.com、www.facebook.com,这些名字便于记忆。同时主机也可以使用IP地址进行标识,一个IP地址由4个取值在0~255的字节组成,通常以点分十进制表示,如121.7.106.83。
路由器更喜欢定长的、有层次结构的IP地址来标记主机,因此域名系统DNS的作用就是进行主机名到IP地址的转换。
类似电话本的原理,每一个名字都对应了一个单独的电话号码。DNS最简单的设计就是只使用一个DNS服务器,其中包含所有的映射(mapping),客户端可直接将查询发往该DNS服务器。
这种集中式的设计存在几个问题:
-
单点故障(single point of failure):如果该DNS服务器故障,整个因特网随之瘫痪。
-
通信容量(traffic volume):单个DNS需要处理所有DNS查询。
-
远距离集中式数据库(distant centralized database):单个DNS不可能与所有的客户端都相邻,一些地区需要跨越半个地球,造成严重的时延。
-
维护(maintenance):中央数据库庞大,需要频繁为新添加的主机更新记录。
分布式层次数据库
为了处理扩展性的问题,DNS使用了大量的DNS服务器分布在全世界,并以层次方式组织。
DNS服务器分层3类:
-
根DNS服务器
-
顶级域(TLD, Top-Level Domain)DNS服务器
-
权威(authoritative)DNS服务器
例如一个DNS客户需要获取www.amazon.com的IP地址。客户首先与根服务器之一联系,它将返回顶级域名com的TLD服务器的IP地址。接着客户与TLD服务器之一联系,它将为amazon.com返回权威服务器的IP地址。最后客户与权威服务器之一联系,它将为www.amazon.com返回IP地址。
每个ISP都有一个本地DNS服务器(local DNS server),它并不严格属于DNS的层级体系。当主机进行DNS查询时,查询会被发送到本地DNS服务器,再由该本地DNS服务器作为代理(proxy),将查询转发给层级DNS服务器。
用递归查询解析域名
解锁完整互动实验、进阶解析与精选参考答案。
用迭代查询解析域名
解锁完整互动实验、进阶解析与精选参考答案。
知识测验
为了减少时延并减少传输DNS报文的数量,DNS使用了DNS缓存(DNS caching)。只要DNS服务器获得了IP映射,就将其缓存,因此根DNS服务器不会再被经常访问。然而IP映射并不是永久的,DNS服务器在一段时间后将会丢弃缓存信息。
记录类型与寿命
DNS不仅存储地址。A记录提供IPv4地址,AAAA提供IPv6地址,CNAME把一个名字指向另一个规范名字,MX指出某域的邮件交换服务器及优先级。MX的值是邮件服务器名字,不是邮件正文,也不一定直接给出IP地址;还可能需要解析那个名字。
缓存根据记录的TTL(Time To Live,存活时间)控制寿命。TTL是缓存可保留记录的时间,不是网络分组的跳数上限;两者用了相同缩写,但对象与单位不同。缓存中的剩余TTL随时间减少,权威数据变化通常不会立即通知每个缓存。
知识测验
计算DNS剩余寿命
记录在t=0存入缓存,TTL为60秒。用Python打印t=45与t=60的剩余寿命和新鲜度。预期两行为45 15 True与60 0 False。若权威在t=10修改A记录,解释t=45为何仍可能使用旧缓存。假设没有主动失效通知或过期继续服务扩展。