为什么 DNS 查找是 UDP?

为什么 DNS 查找是 UDP?
  1. UDP 不保证消息传递
  2. 不保证有序传输。
  3. 其连接较少。

但根据我的理解,be needing all these three features while lookup. Let's take the example when I enter浏览器中的 DNS 应该是 google.com`

UDP 会将 google.com 划分为小的数据块/数据包。假设这些是 goog 和 lee.com。

关于以上几点的疑问

  1. 如果数据包goog由于某种原因在网络中丢失,浏览器是否不会尝试重新传输它并且我会在浏览器上收到错误?
  2. 如果le.com数据包在之前到达goog,接收方将获得完整的数据包le.comgoog。DNS 服务器将找不到任何相同的内容?
  3. 浏览器在源机器上创建套接字连接并发送数据包。关闭连接。现在从接收方获取响应,因为连接已关闭。操作系统如何将收到的响应传递回浏览器应用程序,以便将请求发送到谷歌服务器?操作系统是否保留了一些信息,以便一旦 DNS 响应返回,它就可以查看初始请求是什么并将其发送到谷歌服务器?

答案1

UDP 会将 google.com 划分为小块/数据包

首先,UDP 本身不会对数据进行分段。如果应用程序将整个 DNS 查询作为单个数据报发送,则 UDP 层不会以任何方式对其进行分割;它仍然是单个数据报。大型数据报(超过 IP MTU 的大小)可能会被IP 层,然后透明地重新组合,并且 UDP 仍然将其视为单个数据报。

第二,碎片不会那么小。它们可以大到 IP MTU 允许的程度。DNS 查询/响应的原始大小限制(在 EDNS 扩展之前)为 512 字节,而现在总是适合单个 IP 数据包,没有任何碎片。

(如果 DNS 需要发送比这更大的响应,它会怎么做?它会发送前 512 个字节,并在 DNS 响应标头中设置“截断”标志。然后客户端将通过 TCP 尝试相同的查询。是的,DNS 也通过 TCP 运行。)

如果数据包 goog 由于某种原因在网络中丢失,浏览器是否不会尝试重新传输它并且我会在浏览器上收到错误?

如果个别 IP 片段丢失,则不会重新传输它们 - 整个数据包将被视为丢失。UDP 不会尝试重新传输它。

(注意:浏览器不处理单个 IP 碎片。如果它发送的单个 UDP 数据报太大而无法容纳在 MTU 内,则必要的 IP 碎片由操作系统处理。)

但是,浏览器通常会通过发送整个新的 DNS 查询几秒钟后。

如果 le.com 数据包先于 goog 到达,接收方将获得完整的数据包 le.comgoog 。DNS 服务器将找不到任何相同的内容?

这不会发生。IP 片段上写有原始偏移量;即使它们到达时顺序混乱,它们也将被正确地重新组装。

浏览器在源机器上创建套接字连接并发送数据包。关闭连接。现在从接收方获取响应,因为连接已关闭。操作系统如何将收到的响应传递回浏览器应用程序

浏览器没有如果仍在等待 DNS 响应,则关闭套接字。

操作系统是否会保留一些信息,以便 DNS 响应返回后它可以查看初始请求是什么并将其发送到 Google 服务器?

这一切都是由浏览器本身完成的。浏览器在实际尝试联系网站本身之前会执行 DNS 查找,因此它会记住待处理的 HTTP 请求。

相关内容