“DNS常用UDP,也支持TCP;应用协议的名字与承载协议不是一对一关系。一个可靠应用协议可以以UDP为载体,但其可靠性来自新增状态机与假设,不来自UDP名称本身。”
形式陈述
DNS把域名与类型等查询条件映射到资源记录集合,不只是一张“名称到单个IP”的表。A记录给IPv4地址,AAAA给IPv6地址,CNAME给规范名别名,NS描述委派。查询通常含名称QNAME、类型QTYPE与类别QCLASS;同一个名称的不同类型可以有不同结果和TTL。
客户端可把查询交给递归解析器。解析器从缓存或已知服务器开始,沿根、顶级域及下级区域的委派查询相应权威服务器;权威服务器负责自己区域的数据,递归解析器负责替客户端追索结果。实际可从缓存中间站开始,不必每次从根走完整条链。CNAME另引出目标名称查询,其缓存寿命与目标地址记录分别计算。
本页采用普通TTL缓存,不启用serve-stale等扩展。记录在本地时刻t插入,剩余TTL为τ,则最迟在
负答案也有明确类型。NXDOMAIN表示查询到的名称不存在;NODATA表示名称存在但没有所查类型的记录,其DNS响应码通常仍为NOERROR。按RFC2308的基础缓存范围,NXDOMAIN以名称和类别复用,NODATA还必须区分类型;本文不展开CNAME、DNSSEC证明及名称不存在切断等扩展交互。可缓存负答案所附SOA给出的负TTL为SOA记录TTL与SOA.MINIMUM的较小值。
直觉
解析器回答“这是我在有效缓存期内保存的答案”,并不意味着此刻去权威服务器询问也必定得到同样内容。缓存让大多数请求少走很多路,也使新修改需要等待旧记录逐步失效。
没有得到回答,与得到“这个名称不存在”的明确回答,证据完全不同。超时可能是服务器或路径故障,不能据此合成NXDOMAIN。
例子与边界
剩余TTL不能重新计满
采用一条分析用共同时间线。解析器在t=0取得api.example的A记录192.0.2.8,TTL=60。t=20回复另一个缓存时,最多附剩余40秒,后者若立即收到,仍在t=60到期。t=50权威地址改为192.0.2.9,旧缓存仍可能在t=59用剩余1秒返回旧地址;t=60不能按本页普通缓存规则继续使用它。
若下游在t=20错误地重新缓存60秒,会拖到t=80;多级缓存反复重置还能不断延长旧值寿命。链中CNAME若TTL只有30而A记录TTL为60,t=35时也不能凭尚未到期的A记录假定原别名关系仍有效。
两种负答案不能混用
t=10收到absent.example的NXDOMAIN,SOA TTL=120、MINIMUM=30,负答案到t=40失效。t=25再次查询该名称可使用剩余15秒。另一名称v4only.example的AAAA查询收到NODATA,只说明没有AAAA;它仍可能有A记录,不能把该负答案用于否定A查询。
超时、SERVFAIL等是解析失败,不是上述不存在证据。解析失败缓存有另一套规范,RFC9520要求其时间范围至少1秒且最多5分钟;本页不实现该机制,也不把失败缓存条目当成名称不存在。解析器报错与名称事实应以不同状态保存。