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

ahm*_*hm5 5 dns networking udp protocols

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

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

Pat*_*zek 5

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

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

当然,UDP 比 TCP 更容易被欺骗,而且更大的数据包可能会成为问题。


Mal*_*alt 2

首先,需要注意的是 TCP 也可以用于 DNS。实际上,大多数 DNS 服务器都支持 UDP 和 TCP,但 TCP 很少用于简单的 DNS 查询,主要用于区域传输等操作。

使用 UDP 的最大优点是性能提升。TCP DNS 查询速度较慢的原因有以下几个:

  • TCP 要求在每次请求之前建立连接,然后断开连接。因此,如果一条消息从您的计算机传输到服务器并返回需要 20 毫秒(称为 RTT - 往返时间),那么 TCP 查询将需要 3xRTT (60 毫秒) 才能完全处理 - 打开连接需要 20 毫秒,另外 20 毫秒用于查询,另外 20 毫秒用于拆除它。UDP 只需要 1 个 RTT,即 20 毫秒。

  • 由于 TCP 面向连接的性质,每个连接需要更多的资源来存储和管理 TCP 的状态。TCP 要求客户端和服务器为每个连接都有一个单独的套接字。

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

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

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