问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

为什么DNS协议使用UDP?只使用了UDP吗?

创作时间:
作者:
@小白创作中心

为什么DNS协议使用UDP?只使用了UDP吗?

引用
1
来源
1.
https://cloud.tencent.com/developer/article/1818152

DNS协议为什么使用UDP?是否只使用UDP?本文将从TCP和UDP的基本特性出发,详细解释为什么DNS需要同时使用这两种传输协议,并进一步说明在不同场景下DNS如何选择使用TCP或UDP。

DNS为什么同时使用TCP和UDP

我们从TCP与UDP的比较说起,老生常谈的话题,不过相信大部分同学都会忽略掉一个点,等下会指出来。

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

  1. TCP需要三次握手建立连接,四次挥手释放连接;UDP不需要,面向无连接
  2. TCP首部需要20个字节;而UDP首部只有8个字节
  3. TCP具有一系列保证可靠传输的机制;而UDP尽最大努力交付,不提供可靠传输的机制,如果在数据传输的过程中出现部分数据的丢失,UDP协议本身并不能做出任何检测或补救措施
  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协议。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号