【问题标题】:Why is UDP used for DNS requests and not TCP?为什么 UDP 用于 DNS 请求而不是 TCP?
【发布时间】:2021-12-27 14:41:36
【问题描述】:
为什么DNS请求通常使用UDP而不是TCP?
我知道我们可以使用 TCP,但为什么 UDP 是默认协议?有什么原因吗,还是只是出于设计目的?
【问题讨论】:
-
TCP 也可以用于 DNS。请参阅 RFC 7766 说明:“大多数 DNS 服务器运营商已经支持 TCP,并且大多数软件实现的默认配置是支持 TCP。本文档的主要受众是那些实现者它对 TCP 的有限支持限制了互操作性并阻碍了新 DNS 功能的部署。因此,本文档更新了核心 DNS 协议规范,因此对 TCP 的支持从此成为完整 DNS 协议实施的必要部分。"
标签:
networking
dns
udp
protocols
【解决方案1】:
UDP 是默认协议,因为在大多数情况下,在设计 DNS 时,交换是单个问题/响应,每个部分都适合一个 512 字节的小数据包,因此无需建立长时间运行的连接,其中TCP 在交换任何数据之前首先需要进行 3 次握手。
因此,在大多数情况下,UDP 提供更好的性能,而 DNS 对时间敏感。
当然,UDP 比 TCP 更容易被欺骗,而且更大的数据包可能是个问题。
【解决方案2】:
首先,需要注意的是,TCP 也可以用于 DNS。在实践中,大多数 DNS 服务器都支持 UDP 和 TCP,尽管 TCP 很少用于简单的 DNS 查询,主要用于zone transfers 等操作。
使用 UDP 的最大优势是性能提升。 TCP DNS 查询速度较慢的原因有几个:
-
TCP 要求在每次请求之前建立连接,然后断开连接。因此,如果一条消息从您的计算机传输到服务器并返回需要 20 毫秒(这个时间称为 RTT - 往返时间),那么 TCP 查询将需要 3xRTT(60 毫秒)才能完全处理 - 打开连接需要 20 毫秒, 查询多 20 毫秒,另外 20 毫秒将其拆除。 UDP 只需要一个 RTT,所以 20 毫秒。
-
由于 TCP 面向连接的特性,每个连接都需要更多资源来存储和管理 TCP 的状态。 TCP 要求客户端和服务器对每个连接都有一个单独的socket。
-
UDP 使部署anycast DNS servers 变得容易。在任播中,几台服务器(可能在世界各地)共享一个 IP 地址 - 例如。 1.1.1.1。当您向1.1.1.1 发送查询时,其中一台服务器(可能是地理位置上最近的一台)会得到它。由于 TCP 涉及来回发送多个数据包,因此更难实现可靠的任播,因为您需要确保数据包始终到达同一个确切的服务器。否则,它们最终可能会到达不知道如何处理它们的不同服务器。
-
较低的数据开销 - 与 TCP 为每个段发送的标头相比,UDP 标头很小。使用 UDP 意味着发送更少的字节。
-
简单性 - UDP 比 TCP 简单得多。 TCP 针对长数据传输进行了优化,并具有许多复杂的机制,例如 flow control 和 congestion control 用于优化数据流的速率。 DNS 不需要任何这些机制来进行简单查询,因为发送的典型数据量很小。