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 使用。

本文深入解析DNS查询过程,包括浏览器、操作系统、路由器及ISP的DNS缓存机制,递归与迭代查询的区别,以及UDP在DNS请求中的应用。揭示DNS根域名服务器数量限制背后的原理。
1015

被折叠的 条评论
为什么被折叠?



