美文网首页
DNS何时使用TCP协议,何时使用UDP协议?

DNS何时使用TCP协议,何时使用UDP协议?

作者: 前端小白的摸爬滚打 | 来源:发表于2022-02-18 11:04 被阅读0次

    DNS 同时占用 UDP 和 TCP 端口 53 是公认的,这种单个应用协议同时使用两种传输协议的情况在 TCP/IP 栈也算是个另类。但很少有人知道 DNS 分别在什么情况下使用这两种协议。

    TCP 和 UDP

    • TCP:传输控制协议。面向连接,提供可靠的字节流服务

    • UDP:用户数据报协议。无连接,提供的是面向报文的不可靠复用

    演变历史

    刚被设计出来的 DNS 就会同时使用 UDP 和 TCP 协议,对于绝大多数的 DNS 查询来说都会使用 UDP 数据报进行传输,TCP 协议只会在区域传输(它的作用就是在多个命名服务器之间快速迁移记录,由于查询返回的响应比较大,所以会使用 TCP 协议来传输数据包)的场景中使用,其中 UDP 数据包只会传输最大 512 字节的数据,多余的会被截断;DNS 记录中存储的数据会越来越多,同时显示的指出了发现 UDP 包被截断时应该通过 TCP 协议重试。

    使用 UDP 进行传输的 DNS 查询和响应最大不能超过 512 字节,不能支持大量 IPv6 地址或者 DNS 安全签名等记录的传输;

    EDNS 为 DNS 提供了扩展功能,让 DNS 通过 UDP 协议携带最多 4096 字节的数据;能够帮助我们在一定程度上解决大数据包被截断的问题,减少了使用 TCP 协议进行重试的需要,但是由于最大传输单元的限制,这并不能解决所有问题。所以提出了使用 TCP 协议作为主要协议来解决 UDP 无法解决的问题,TCP 协议也不再只是一种重试时使用的机制

    为什么会需要 TCP?

    现在的网路状况使我们不仅遇到了 IPv4 即将无法分配的状况,而且还需要引入 DNSSEC 等机制来保证 DNS 查询和请求的完整性以及传输安全,总而言之,DNS 协议需要处理的数据包越来越大、数据也越来越多,但是『为什么当需要传输的数据较多时我们就必须使用 TCP 协议呢?』,如果继续使用 UDP 协议就不能完成 DNS 解析么。

    从理论上来说,一个 UDP 数据包的大小最多可以达到 64KB,这对于一个常见的 DNS 查询其实是一个非常大的数值;但是在实际生产中,一旦数据包中的数据超过了传送链路的最大传输单元(MTU,也就是单个数据包大小的上限,一般为 1500 字节),当前数据包就可能会被分片传输、丢弃,部分的网络设备甚至会直接拒绝处理包含 EDNS 选项的请求,这就会导致使用 UDP 协议的 DNS 不稳定。

    TCP 作为可靠的传输协议,可以非常好的解决这个问题,通过序列号、重传等机制能够保证消息的不重不漏,消息接受方的 TCP 栈会对分片的数据重新进行拼装,DNS 等应用层协议可以直接使用处理好的完整数据。同时,当数据包足够大的时候,TCP 三次握手带来的额外开销比例就会越来越小,与整个包的大小相比就会趋近于 0

    所以,我们在 DNS 中存储较多的内容时,TCP 三次握手以及协议头带来的额外开销就不是关键因素了,不过我们 TCP 三次握手带来的三次网络传输耗时还是没有办法避免的,这也是我们在目前的场景下不得不接受的问题。

    总结

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

    1. DNS 在设计之初就在区域传输中引入了 TCP 协议,在查询中使用 UDP 协议;

    2. 当 DNS 超过了 512 字节的限制会被截断,『当 DNS 查询被截断时,应该使用 TCP 协议进行重试』

    3. 随后引入的 EDNS 机制允许我们使用 UDP 最多传输 4096 字节的数据,但是由于 MTU 的限制导致的数据分片以及丢失,使得这一特性不够可靠;

    4. 在最近的几年,我们重新规定了 DNS 应该同时支持 UDP 和 TCP 协议,TCP 协议也不再只是重试时的选择;

    DNS 查询选择 UDP 或者 TCP 两种不同协议时的主要原因:

    • UDP 协议
      • DNS 查询的数据包较小、机制简单;
      • UDP 协议的额外开销小、有着更好的性能表现;
    • TCP 协议
      • DNS 查询由于 DNSSEC 和 IPv6 的引入迅速膨胀,导致 DNS 响应经常超过 MTU 造成数据的分片和丢失,我们需要依靠更加可靠的 TCP 协议完成数据的传输;
      • 随着 DNS 查询中包含的数据不断增加,TCP 协议头以及三次握手带来的额外开销比例逐渐降低,不再是占据总传输数据大小的主要部分;

    无论是选择 UDP 还是 TCP,最核心的矛盾就在于需要传输的数据包大小,如果数据包小到一定程度,UDP 协议绝对最佳的选择,但是当数据包逐渐增大直到突破 512 字节以及 MTU 1500 字节的限制时,我们也只能选择使用更可靠的 TCP 协议来传输 DNS 查询和相应。

    参考文档

    为什么 DNS 会使用 UDP 协议,假如使用 TCP 协议又会发生什么呢?

    相关文章

      网友评论

          本文标题:DNS何时使用TCP协议,何时使用UDP协议?

          本文链接:https://www.haomeiwen.com/subject/kmzelrtx.html