为什么 DNS 使用 UDP 协议?( 四 )


总结很多人认为 DNS 使用了 UDP 协议来获取域名对应的 IP 地址,这个观点虽然没错,但是还是有一些片面,更加准确的说法其实是 DNS 查询在刚设计时主要使用 UDP 协议进行通信,而 TCP 协议也是在 DNS 的演进和发展中被加入到规范的:

  1. DNS 在设计之初就在区域传输中引入了 TCP 协议,在查询中使用 UDP 协议;
  2. 当 DNS 超过了 512 字节的限制,我们第一次在 DNS 协议中明确了『当 DNS 查询被截断时,应该使用 TCP 协议进行重试』这一规范;
  3. 随后引入的 EDNS 机制允许我们使用 UDP 最多传输 4096 字节的数据,但是由于 MTU 的限制导致的数据分片以及丢失,使得这一特性不够可靠;
  4. 在最近的几年,我们重新规定了 DNS 应该同时支持 UDP 和 TCP 协议,TCP 协议也不再只是重试时的选择;
这篇文章已经详细介绍了 DNS 的历史以及选择不同协议时考虑的关键点,在这里我们重新回顾一下 DNS 查询选择 UDP 或者 TCP 两种不同协议时的主要原因:
  • UDP 协议
  • DNS 查询的数据包较小、机制简单;
  • UDP 协议的额外开销小、有着更好的性能表现;
  • TCP 协议
  • DNS 查询由于 DNSSEC 和 IPv6 的引入迅速膨胀,导致 DNS 响应经常超过 MTU 造成数据的分片和丢失,我们需要依靠更加可靠的 TCP 协议完成数据的传输;
  • 随着 DNS 查询中包含的数据不断增加,TCP 协议头以及三次握手带来的额外开销比例逐渐降低,不再是占据总传输数据大小的主要部分;
无论是选择 UDP 还是 TCP,最核心的矛盾就在于需要传输的数据包大小,如果数据包小到一定程度,UDP 协议绝对最佳的选择,但是当数据包逐渐增大直到突破 512 字节以及 MTU 1500 字节的限制时,我们也只能选择使用更可靠的 TCP 协议来传输 DNS 查询和相应 。到最后,我们还是来看一些比较开放的相关问题,有兴趣的读者可以仔细思考一下下面的问题:
  • 如何对使用 TCP 协议的 DNS 进行一些优化,减少一些额外开销?
  • 我们现在已经可以使用 UDP/TCP/TLS/HTTPS 四种方式传输 DNS 数据,这些方式有什么异同?是否还可以通过其他的协议实现 DNS 查询?
如果对文章中的内容有疑问或者想要了解更多软件工程上一些设计决策背后的原因,可以在博客下面留言,作者会及时回复本文相关的疑问并选择其中合适的主题作为后续的内容 。
如果对本文 为什么 DNS 使用 UDP 协议 · Why's THE Design? 的内容有疑问,请在下面的评论系统中留言,谢谢 。
原文链接:为什么 DNS 使用 UDP 协议 · Why's THE Design? · 面向信仰编程
Follow: Draveness · GitHub

【为什么 DNS 使用 UDP 协议?】


推荐阅读