为什么 DNS 请求使用 UDP 而不是 TCP?

Why is UDP used for DNS requests and not TCP?

为什么 DNS 请求通常使用 UDP 而不是 TCP?

我知道我们可以使用 TCP,但为什么 UDP 是默认协议?有什么原因吗,还是只是出于设计目的?

UDP 是默认协议,因为在大多数情况下,在设计 DNS 时,交换是一个单一的 question/response,每个部分都适合一个 512 字节的小数据包,因此无需建立长运行 连接,其中 TCP 在交换任何数据之前首先需要 3 次握手。

因此在大多数情况下,UDP 提供更好的性能,而 DNS 对时间敏感。

当然 UDP 比 TCP 更容易被欺骗,更大的数据包可能是个问题。

首先需要注意的是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 的 connection-oriented 性质,需要更多资源 per-connection 来存储和管理 TCP 的状态。 TCP 要求客户端和服务器对每个连接都有一个单独的 socket

  • UDP 使部署变得容易 anycast DNS servers。在任播中,多个服务器(可能在世界各地)共享一个 IP 地址 - 例如1.1.1.1。当您向 1.1.1.1 发送查询时,这些服务器之一(可能是地理位置最近的服务器之一)会收到它。由于 TCP 涉及来回发送多个数据包,因此很难实现可靠的任播,因为您需要确保数据包始终到达同一台服务器。否则,它们最终可能会到达不同的服务器,而这些服务器不知道如何处理它们。

  • 更低的数据开销 - 与每个段的 header TCP 发送相比,UDP header 很小。使用 UDP 意味着发送更少的字节。

  • 简单 - UDP 比 TCP 简单得多。 TCP 针对长数据传输进行了优化,并具有一系列复杂的机制,例如 流控制 拥塞控制 以优化数据流速率。 DNS 不需要任何这些机制来进行简单查询,因为发送的数据量通常很小。