DNS解析
浏览器缓存
: 浏览器缓存DNS记录一段时间。有趣的是,操作系统不会告诉浏览器每个DNS记录的生存时间,因此浏览器将它们缓存一段固定的时间(因浏览器而异,2到30分钟)。操作系统缓存
: 如果浏览器缓存不包含所需的记录,则浏览器进行系统调用(Windows中的gethostbyname)查看hosts文件。操作系统有自己的缓存。路由器缓存
: 请求继续到您的路由器,路由器通常有自己的DNS缓存。ISP DNS缓存
(Internet Service Provider,即因特网服务提供商): 检查的下一个位置是缓存ISP的DNS服务器, 即电信、移动等。递归查询和迭代查询
- 您的ISP的DNS服务器开始递归搜索,从根名称服务器,通过.com顶级域名服务器,到baidu的名称服务器。通常,DNS服务器将在缓存中具有.com名称服务器的名称,因此不需要命中根名称服务器。
扩展注意:
- 所有DNS请求和回答报文使用的UDP数据报经过端口53发送
- DNS主要基于UDP(User Datagram Protocol)无连接运输层协议,而不是使用TCP(Transmission Control Protocol 传输控制协议)可靠数据连接。因为 一次UDP查询可以短到两个包:一个查询包、一个响应包。一次TCP交换则至少包含9个包:三次握手初始化TCP会话、一个查询包、一个响应包以及四次分手的包交换。 考虑到效率原因,故采用UDP作为DNS的运输层协议。
- 为什么DNS查询只返回13个根域名服务器?
12 Header + 5 Question section + 31 Resource record + 15 * n (Other resource record) + 16n (A record in additional section) =512(早期DNS查询结果是一个512字节的UDP数据包
)
15的组成:第一个 Resource record 要是全场度,nameserver name需要20bytes. 加上前面 root label 之类的信息后是 root-label: 1 byte + ttl: 4 bytes + class: 2 bytes + type: 2 bytes + rdlength: 2 bytes + 20 = 31 bytes.之后的 resource record 的 nameserver name 可以被压缩(DNS compression),只需要4bytes. 需要:11 + 4 = 15bytes.
16的组成:Additional section 类似情况,ttl: 4 bytes + class: 2 bytes + type: 2 bytes + rdlength: 2 bytes + address: 4 bytes = 14 bytes. 外加被压缩的 nameserver name 2 bytes. = 16 bytes
最后512bytes 的分配为:
12 + 5 + 31 + 31n = 512n = 14.96
当初设计的时候,安排了13个,空出了以后字节空间给以后的 feature 使用。