在 2024 年 2 月,研究人员探讨了 DNS 在处理 UDP 响应时的行为,特别是当响应中设置了截断标志时。研究人员关注的是 DNS 解析器在处理截断响应时的行为,以及有多少 DNS 解析器无法使用 TCP 进行 DNS 查询。本月,研究人员重复进行了这个实验,但这次使用了一个仅支持 IPv6 的 DNS 服务器环境。
DNS 和 UDP 的工作原理
DNS 协议利用 UDP 传输协议来最大化其效率。UDP 传输允许服务器支持更高的 UDP 查询负载,相比 TCP 查询和响应。然而,UDP 有一个问题,即虽然 IP 规范允许 IP 包的大小达 65,535 个八位字节,但大多数网络的最大包大小远远小于这个值。当一个 IP 设备尝试转发一个太大的包时,它需要对包进行分片。在 IPv4 中,这个分片可以在飞行中处理,而在 IPv6 中,包会导致一个 ICMPv6 包太大控制消息被发送回包的源地址,发送者需要对发送到这个目的地的包进行分片。
IPv6 和分片
如果 IP 网络在传递分片包方面完全可靠,那么像 DNS 这样的应用程序可以利用这种可靠性,发送所有消息,大小达 65,535 个八位字节,使用 UDP。较大的消息,例如使用 AXFR 的区域传输,需要使用 TCP,但所有其他消息都可以使用 UDP,根据需要对消息进行分片。然而,还有另一个与大 IP 包相关的限制,即主机在重新组装分片包方面愿意使用的内存量。超过这个主机限制的包将被丢弃。在 IPv4 规范中,主机的最小/最大重新组装缓冲区大小为 576 个八位字节。因此,DNS 的初始设计选择了一条保守的路径,任何使用 UDP 的 DNS有效载荷都不允许超过 512 个八位字节。如果 DNS 响应者想要传递一个较大的消息,它将发送一个截断的 UDP 响应,该响应被故意截断,以使响应不超过 512 个八位字节,并在响应的头部设置截断位。
实验结果
在 2013 年,RFC 6891 《DNS 扩展机制》被发布,该机制允许查询者指定它是能够处理更大的 UDP 消息的。然而,实验结果显示,仍然有很多 DNS 解析器无法正确处理截断的 UDP 响应,或者无法使用 TCP 进行 DNS 查询。这些结果表明,尽管有新的规范和机制被引入,但 DNS 协议仍然需要改进,以确保其在不同网络环境中的可靠性和效率。
对运维和网络工程师来说,这些结果具有重要的实际意义。他们需要了解 DNS 协议的局限性和潜在问题,以确保其网络环境中的 DNS 服务的可靠性和效率。通过了解这些问题,工程师可以采取措施改进 DNS 服务,确保其网络环境中的可靠性和效率。
原文: APNIC Blog(2024-03-14)|编译自 APNIC Blog,事实以原文为准。
来源:APNIC Blog