解析是怎么走完的
从在地址栏输入域名到拿到地址,中间是一整条查询链:应用调用系统解析函数,由本机存根解析器把请求发给配置好的递归解析器;递归解析器再依次询问根服务器、顶级域服务器与权威服务器,最后把结果返回给客户端,并按生存时间逐级缓存。这条链路是全互联网访问的第一步,任何一环变慢或返回异常,用户在浏览器里看到的就是「网页打不开」。
链路步骤
| 第一步 | 应用调用系统解析函数,读取本机解析配置与本地记录文件 |
|---|---|
| 第二步 | 存根解析器把请求交给递归解析器,并声明希望得到完整解析 |
| 第三步 | 递归解析器问根服务器,只拿到顶级域的委派信息 |
| 第四步 | 继续问顶级域,拿到目标域的权威服务器地址 |
| 第五步 | 向权威服务器取得最终记录,回填并缓存,返回给客户端 |
一条命令看全流程
一条命令看全流程
dig +trace www.example.com A # 从根开始逐级迭代,能看清每一级谁在回答
# 依次能看到根域、顶级域、目标域三层的委派与最终应答
dig @223.5.5.5 www.example.com A +noall +answer # 指定公共解析器,排除本地配置干扰
getent hosts www.example.com # 走系统解析链路,会读本地记录文件,结果可能与 dig 不同各角色职责
| 角色 | 位置 | 典型行为 |
|---|---|---|
| 存根解析器 | 本机或操作系统 | 把请求转给配置好的递归解析器 |
| 递归解析器 | 运营商、公共或自建 | 全程代查并把结果缓存,供大量客户端复用 |
| 根服务器 | 根区 | 只返回顶级域的委派信息,不直接给出结果 |
| 顶级域服务器 | 各顶级域 | 返回目标域的权威服务器地址 |
| 权威服务器 | 目标区域 | 给出最终记录,是配置生效的唯一依据 |
排查方法
- 先用系统链路查一次,再用工具直接查,结果不同说明本地配置或本地记录文件在起作用
- 指定不同的递归解析器分别查询,可以判断是解析器缓存问题还是权威配置问题
- 直接向权威服务器提问,能立刻看到配置是否已经生效,排除各级缓存干扰
- 用迭代查询观察委派链,如果某一级返回异常,问题就在那一级的配置上
- 记录解析耗时:首次查询与命中缓存的耗时差别很大,能帮助判断是否频繁回源
递归解析器通常是边问边缓存:第二次解析同一域名不会再访问根与顶级域,只按生存时间决定何时回源。这也是为什么修改权威配置后,不同地区生效时间并不一致。
本机能解析不等于全网能解析:权威记录没配好,或者委派关系不一致时,只有本地缓存里的旧值还生效,一旦缓存过期就会立刻全面失败,必须用权威查询验证真实配置。
三个易混淆判断
- 结果为空与查询超时是两回事:前者说明记录不存在,后者说明链路中有节点没有应答
- 配置生效后仍查不到,优先检查委派关系是否指向了正确的权威服务器
- 内网环境里本地记录文件的优先级往往高于外部解析,排查时不要忘记它