- UDP 不保证消息传递
- 不保证有序传输。
- 其连接较少。
但根据我的理解,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。
关于以上几点的疑问
- 如果数据包
goog
由于某种原因在网络中丢失,浏览器是否不会尝试重新传输它并且我会在浏览器上收到错误? - 如果
le.com
数据包在之前到达goog
,接收方将获得完整的数据包le.comgoog
。DNS 服务器将找不到任何相同的内容? - 浏览器在源机器上创建套接字连接并发送数据包。关闭连接。现在从接收方获取响应,因为连接已关闭。操作系统如何将收到的响应传递回浏览器应用程序,以便将请求发送到谷歌服务器?操作系统是否保留了一些信息,以便一旦 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 请求。