今天朋友问我一个这样的问题: 我知道DNS解析有使用递归查询, 还有迭代查询这两种方式, 那么我们平时访问网页到底是以什么样的方式进行查询呢?
我其实对DNS的内部解析毫无概念, 一直也没有接触过它的底层实现. 既然问到了, 我就学习了一番, 做一下笔记.
是这样的, 首先, 假设你访问www.baidu.com.
流程:
客户端发起域名解析请求, 并将请求发送或转发到本地DNS服务器.
情况1:
本地DNS服务器接收到请求后就去查询缓存, 如果有记录, 则返回给客户端. (这种叫做非权威应答)
情况2:
- 本地DNS没有找到相应记录, 则会把请求转发到根DNS(13台根DNS服务器的IP默认存储在DNS服务器中, 当需要时就会有选择性的链接)
- 根DNS服务器收到请求后会判断这个域名是谁来授权管理, 并会返回一个负责该区域子域名的DNS服务器地址.
- 比如, 查询www.baidu.com的IP, 根DNS服务器就会在负责.com顶级域名的DNS服务器中选一个(并非随机, 而是根据空间, 地址, 管辖区域等条件进行筛选), 返回给DNS服务器.
- 可以说根域对顶级域有绝对管理权, 自然也知道他们的全部信息, 因为在DNS系统中, 上级对下级有管理权限, 毫无疑问, 根DNS是最高的一级了.
- 本地DNS服务器接收到这个地址(根DNS提供过来的顶级域名DNS服务器地址)后, 就将请求转发到这个地址. 负责.com域名的某台服务器收到此请求后, 如果自己不能解析, 就会返回一个管理.com的下一级的DNS服务器给本地的DNS服务器, 也就是负责管理baidu.com的DNS.
- 当本地服务器收到这个地址, 就会重复上述动作, 继续请求得到的下层级地址.
- 不断重复这个轮回动作, 直到有一台DNS服务器解析出这个地址为止. 在这个过程中, 客户机一直处于等待状态.
- 本地DNS获得IP时, 把IP返回给客户端, 到此在本地的DNS服务器取得地址后, 递归查询计算完成了. 本地DNS服务器同时会将这条记录写入自己的缓存, 以备后用.
情况3:
重复上诉动作还无法取得域名对应IP, DNS服务器则返回此域名不可达.
整个流程中, 本地DNS服务器一次次进行对DNS服务器(包括根DNS服务器, 顶级域名DNS服务器, 顶级域名DNS服务器的下级DNS服务器, ..., ...) 这一系列的一层层往对应下级DNS请求的过程就是递归查询.
流程中, DNS服务器收到请求后, DNS服务器并不直接回复查询结果,而是告诉本地DNS服务器另一台DNS 服务器地址,本地域名服务再向这台DNS服务器提交请求. 这个过程就是迭代查询.
以后再做使用CDN后的解析补充.