为何 DNS 协议使用 UDP?只使用了 UDP 吗?

为何 DNS 协议使用 UDP 呢?这个问题可能大部分同窗在各类博客或者面试过程当中都或多或少碰见过,张口就来,UDP 快啊,DNS 使用 UDP 使得打开网页速度更快。git

那各位有没有想过,既然 UDP 更快,为何 HTTP 不使用 UDP 呢?web

另外,为何 DNS 协议使用 UDP 这个问题自己其实并不彻底正确,DNS 并不是只使用 UDP 协议,它同时占用了 UDP 和 TCP 的 53 端口,做为单个应用层的协议,DNS 同时使用两种传输协议也属实是个另类了。面试

DNS 为何同时使用 TCP 和 UDP

咱们从 TCP 与 UDP 的比较提及,老生常谈的话题,不过相信大部分同窗都会忽略掉一个点,等下会指出来。安全

OK,轻松环节,闭着眼睛背:服务器

1)TCP 须要三次握手创建链接,四次挥手释放链接;UDP 不须要,面向无链接微信

2)TCP 首部须要 20 个字节;而 UDP 首部只有 8 个字节网络

3)TCP 具备一系列保证可靠传输的机制;而 UDP 尽最大努力交付,不提供可靠传输的机制,若是在数据传输的过程当中出现部分数据的丢失,UDP 协议自己并不能作出任何检测或补救措施app

4)正是因为 UDP 没有了可靠传输机制,因此速度远远快于 TCP,在某些状况下 UDP 是一种最有效的工做方式,通常用于即时通讯,好比:语音电话、 直播等等;而 TCP 通常用于文件传输、发送和接收邮件、远程登陆等准确性要求比较高的场景负载均衡

上面这些是最基本的吧。编辑器

接下来说的这个点,也就是不少人容易忽略的点,和 DNS 为何须要同时使用 UDP 和 TCP 这个问题息息相关:

  • 那就是 TCP 是面向字节流的,而 UDP 是面向报文的

解释一下这句话,咱们知道,TCP 具备序列号机制,发送方会把一个大的 HTTP 报文按序号分割成若干报文段并加上 TCP 首部,也就是封装成 TCP 报文段。那么接收方在收到这些 TCP 报文段后,就会按照序号以原来的顺序重组 HTTP 报文。这就是面向字节流的 TCP。

而所谓 UDP 面向报文,发送方的 UDP 对应用层交付下来的 HTTP 报文, 在添加 UDP 首部后也就是封装成 UDP 报文,就向下交付给网络层 IP 协议。不作任何的拆分与合并,主要就是由于 UDP 没有像 TCP 同样的序列号机制来标识报文,因此默认只有一个 UDP 报文。

UDP 这么作就会致使一个问题。

互联网上物理链路的最小传输单元 = 576 字节,为了在物理链路上顺利传输,UDP 报文不能超过 576 字节,为此,UDP 报文被限制在 512 字节之内

而 DNS 因为大面积使用了 UDP,这样一旦 DNS 报文超过 512 字节,基于 UDP 的 DNS 报文就只有抛弃多出来的 64 字节,截短为 512 字节,那么用户获得的 DNS 报文就是不完整的。

如何解决这个问题呢?

没错,最简单的方式就是使用 TCP。尽管速度可能相之 UDP 较慢,但对于获得完整的 DNS 报文,速度慢一点也能够忍受。

DNS 分别在什么状况下使用 UDP 和 TCP

了解了 TCP 面向字节流而 UDP 面向报文的这个特性以后,在域名解析的时候,也就是客户端向 DNS 服务器查询域名获取 IP 地址的时候,DNS 协议关于 UDP 和 TCP 的选择一般能够分为如下两种状况:

1)若客户端事先知道 DNS 响应报文的长度会大于 512 字节,则应当直接使用 TCP 创建链接

2)若客户端事先不知道 DNS 响应报文的长度,通常会先使用 UDP 协议发送 DNS 查询报文,若 DNS 服务器发现 DNS 响应报文的长度大于 512 字节,则多出来的部分会被 UDP 抛弃(截断 TrunCation),那么服务器会把这个部分被抛弃的 DNS 报文首部中的 TC 标志位置为 1,以通知客户端该 DNS 报文已经被截断。客户端收到以后会从新发起一次 TCP 请求,从而使得它未来可以从 DNS 服务器收到完整的响应报文。

固然了,在域名解析的时候,通常返回的 DNS 响应报文都不会超过 512 字节,用 UDP 传输便可。事实上,不少 DNS 服务器进行配置的时候,也仅支持 UDP 查询包。

不过,DNS 不只存在域名解析的过程,还有区域传输的过程,而在进行区域传输的时候 DNS 会强制使用 TCP 协议。

什么是区域传输?

这就不得不提一下主域名服务器和辅助域名服务器

设置域名服务器时,服务器管理员能够选择将域名服务器指定为主服务器仍是辅助服务器(也称为从服务器)。

主域名服务器负责维护一个区域的全部域名信息,是特定的全部信息的权威信息源,数据能够修改。主服务器直接从本地文件获取此信息。只能在主服务器上更改区域的 DNS 记录,而后主服务器才能更新辅助服务器。

当主域名服务器出现故障、关闭或负载太重时,辅助域名服务器做为主域名服务器的备份提供域名解析服务。辅助域名服务器中的区域文件中的数据是从主域名服务器中复制过来的,没法自行修改。

其实就是主从的概念,各位应该也都比较熟悉了。主域名服务器用来写,辅助域名服务器用来读,提供负载均衡的能力,缓解主域名服务器的压力

那么所谓区域传输(zone transfer)呢,就是辅助域名服务器与主域名服务器通讯,并同步数据信息的过程。

辅域名服务器会定时向主域名服务器进行查询以便了解数据是否有变更。若有变更,则会执行一次区域传输。区域传输使用 TCP 而不是 UDP,由于数据同步传送的数据量比一个 DNS 请求和响应报文的数据量要多得多

文章开头提到的既然 UDP 更快,为何 HTTP 不使用 UDP 呢?这个问题的答案也大抵如此。

因为互联网的不安全性,咱们须要数字证书并携带数字签名来保证数据的安全性,为此,整个 HTTP 报文的大小已经远远超过 512 字节,没法使用 UDP 传输。

小结

综上,总结下,虽然 UDP 速度更快,DNS 协议也确实大面积使用了 UDP,可是因为 UDP 面向报文、只能传输小于 512 字节的特性,DNS 并不是只使用了 UDP,具体的 TCP 和 UDP 使用场景以下:

  • DNS 在域名解析的过程当中,会根据 DNS 响应报文的大小选择使用 TCP 仍是 UDP。可是通常状况下,返回的 DNS 响应报文都不会超过 512 字节,因此事实上,不少 DNS 服务器进行配置的时候,也仅支持 UDP 查询包;
  • DNS 在进行区域传输的时候使用 TCP 协议。



  • 博主小硕在读,深耕 Java,目前在维护一个教程类仓库 CS-Wiki 「Gitee 官方推荐项目,现已 1.6k+ star,仓库地址:https://gitee.com/veal98/CS-Wiki」,公众号上的文章也会在此同步更新,欢迎各位前来交流学习。
  • 准备春招秋招的小伙伴能够参考个人这个论坛项目 Echo 「Gitee 官方推荐项目,现已 700+ star,仓库地址:https://gitee.com/veal98/Echo」。配套教程正在同步更新中,公众号后台回复 "Echo" 便可免费获取。
  • 另外,虽然如今本号仍然很小,不过我仍是建了一个交流群『 小牛肉和它的小伙伴们 』,感兴趣的各位能够下方扫码加我微信回复 "进群",我拉你进群:

本文分享自微信公众号 - 飞天小牛肉(CS-Wiki)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。

相关文章
相关标签/搜索