DNS 支持 TCP 和 UDP 双协议,但为何偏偏只钟情 UDP?

2023-11-02

一、前言

之前在聊到 App 网络优化时,聊到通过 HTTPDNS 替换掉传统的 DNS 解析,来达到网络优化的效果。其中提到 DNS 解析,是支持 UDP 和 TCP 双协议的。

但是细心的朋友通过 wireshark、sniffer、tcpdump 等抓包工具分析,会发现基本上所有客户端发起 DNS 查询的场景下,都只使用到了 UDP 协议。

那在 DNS 中,TCP 协议在什么场景下才会用到呢?

今天我们就来聊聊,DNS 的 TCP 的使用场景。

二、DNS

2.1 什么是 DNS

先来简单了解一下 DNS。

在网络的世界中,每个有效的域名背后都有为其提供服务的服务器,而我们网络通信的首要条件,就是知道服务器的 IP 地址。

但是记住域名(网址)肯定是比记住 IP 地址简单。如果有某种方法,可以通过域名,查到其提供服务的服务器 IP 地址,那就非常方便了。这里就需要用到 DNS 服务器以及 DNS 解析。

DNS(Domain Name System),它的作用就是根据域名,查出对应的 IP 地址,它是 HTTP 协议的前提。只有将域名正确的解析成 IP 地址后,后面的 HTTP 流程才可以继续进行下去。

DNS 同时占用了 UDP 和 TCP 的 53 端口,但是大多数情况下,DNS 查询都只使用到了 UDP,而 TCP 只在一些特殊情况下才会被使用到。

简单来说,DNS 使用 TCP 的情况,只有两种:

  1. DNS 查询响应报文大于 512 字节时。

  2. DNS 主、辅助服务器之间,进行区域传送时。

使用 TCP 的场景,基本上就是以上两种场景,当然,如果客户端主动发起一个 TCP 的 DNS 查询,也会使用 TCP 协议,这就不在讨论的范围内了。

2.2 DNS 响应报文大于 512 字节

说到 DNS 响应报文,先来看看 DNS 数据包的结构,对于 DNS 来说,请求报文和响应报文的结构是一样的。

这其中,我们主要关注 Flags 这个标志位的结构。

在 Flags 中,每个字段都有其自己的含义,在这里我们做重关注 QR 和 TC 两个字段。

QR 是一个 Bit,用于标识当前是查询报文(0)还是响应报文(1)。

TC 也是一个 Bit,当它的值为 1 时,表示当前响应报文总长度,已经超过 512 字节,所以做了截断处理,只返回前 512 个字节。

当遇到这种情况时,DNS 解析器会使用 TCP 来重发原来的查询请求,UDP 要求相应报文在 512 字节以内,而 TCP 则没有此限制,TCP 能用多个报文段来传送任意长度的用户数据。

DNS 查询是一个过程复杂,但是结果简单的过程。通常返回的数据不会大于 512 字节,这也就是为什么我们通过抓包的手段,得到的结果都是 DNS 在使用 UDP 协议。

需要注意的是,在实际使用中,很多 DNS 服务器在进行配置的时候,就把 TCP 查询包的方式关闭,仅支持 UDP 查询包。

2.3 DNS 主、辅助服务器的区域传送

DNS 服务器,在设计时就要求一定要是高可用、高并发和分布式的服务器,它被分为多个层次结构,分别是根 DNS 服务器、顶级域 DNS 服务器、权威 DNS 服务器。

这三类 DNS 服务器,组成一种类似树的结构。

在这个"树"中,一个独立管理的 DNS 子树,称为一个区域(zone)。一个 DNS 服务器负责管理一个或多个区域,为了满足高可用,一个区域的管理者必须为该区域提供一个主 DNS 服务器和至少一个辅助 DNS 服务器

主 DNS 服务器和辅助 DNS 服务器,必须是独立和冗余的,以便当某个 DNS 服务器发生故障时,不会影响该区域的 DNS 查询。

既然 DNS 服务器有主和辅助之分,那必然面临了数据同步的情况,我们将辅助服务器从主服务器同步信息的动作,称为区域传送,而在触发区域传送试,使用的就是 TCP 协议。

触发 DNS 区域传送的情况有两种:

  1. 新上线一台辅助服务器,会从主服务器执行区域传送,进行同步数据。

  2. 辅助服务器会定时(通常是 3 小时),向主服务器查询,以便了解到主服务器的数据是否发生变动,如果变动,也会触发一次区域传送。

区域传送会使用 TCP 协议,一方面是为了保证数据的可靠,另一方面此时传送的数据,也远比一个查询或响应大的多。

三、小结时刻

到此我们就了解清楚了,虽然 DNS 服务器支持 TCP 和 UDP 双协议,但是通常我们在做 DNS 查询的时候,也只用到了 UDP 协议。

TCP 只有在以下两种情况下,才会被使用到:

  1. DNS 响应报文大于 512 字节,通过 TC 标记为截断是,才会使用 TCP 重新查询一遍。

  2. DNS 主服务器和辅助服务器之间,进行区域传送时,为了保证稳定以及传输数据太大的原因,也会使用 TCP 协议传输。

DNS 查询和响应,通常都在广域网上通信,对于 DNS 客户端,保证好的重传和超时机制,就显得尤为重要了。

reference:

《TCP/IP 详解卷一》14.8 用 UDP 还是 TCP

http://www.xumenger.com/dns-udp-tcp-20180604

本文对你有帮助吗?留言、点赞、转发是最大的支持,谢谢!


联机圆桌」????推荐我的知识星球,一年 50 个优质问题,上桌联机学习。

公众号后台回复成长『成长』,将会得到我准备的学习资料,也能回复『加群』,一起学习进步;你还能回复『提问』,向我发起提问。

推荐阅读:

关于字符编码,你需要知道的都在这里 | 图解:HTTP 范围请求 | Java 异常处理 | 安卓防止用户关闭动画导致动画失效 | Git 找回遗失的代码 | 阿里的 Alpha 助力 App 启动速度优化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DNS 支持 TCP 和 UDP 双协议,但为何偏偏只钟情 UDP? 的相关文章

  • electron-14版后remote废除

    文章目录 前言 安装与配置 前言 Electron最近的版本变迁比较频繁 在升级到14 0 0版本后 废除了很多旧有的API 而其中最主要的就是remote模块从旧有的模块里抽出 变成了一个需要新安装的模块 electronic remot
  • Android升级到7.0使得webview加载页面为空白页

    前段时间 公司一哥们把他的手机拿给我看 问到公司的软件加载进去是空白页 等了好久也是空白 我也为是网络出现了问题 排查没问题啊 看看是不是缓存问题 又是清缓存 又是卸载重装 结果还是空白页面 想了一下是不是系统问题 问他有没有更新过系统 结
  • Android:RecyclerView 的使用,有这一篇就够了

    谨以文章记录学习历程 如有错误还请指明 RecyclerView 简介 首先 可以理解 RecyclerView 是 ListView 的升级版 更加灵活 同时由于封装了 ListView 的部分实现 导致其使用更简单 结构更清晰 从名字
  • 金融数据时间序列分析——模型准确率过高怎么办

    多少年后 小f想起了自己还是刚刚出道的小萌新时候犯的一个错误 当时模型的准确率贼高 高的离谱 就像下面这种情况 precision recall f1 score support 1 1 1 1 1934 0 1 1 1 535 1 1 1
  • LoadStdProfileSettings -- 加载MRU

    如何为自己的应用程序加入最近文件列表功能呢 最简单的方法就是在你新建工程的时候选择包含最近文件列表功能 也就是在 MFC AppWizard 的第 4 步的时候使 How many files would you like on your
  • 06.RabbitMQ重试机制

    RabbitMQ重试机制 补偿机制 在消费中如果发生异常了 RabbitMQ会使用补偿机制 重试 如果消息没消费成功 会一直重复发送 直到消费成功为止 我们以之前的P2P例子为例 Component RabbitListener queue
  • antd中Form.Item无法获取到对应的表单值解决

    antd中Form Item无法获取到对应的表单值解决 前言 问题代码示例 解决 前言 本文章讲的解决方案只是其中一种 无法获得对应表单的原因有很多 只能在今后的道路上慢慢采坑然后避免 问题代码示例 import React Compone
  • Retrofit中的注解原理项目实战

    今天我们来聊聊这个最近很火的网络请求库retrofit 在此基础上会延伸出一些列的知识点 现在关于retrofit的文章很多 我之所以写这篇文章的原因在于 8月份负责假设新客户端底层的过程中首次尝试使用该库 并取得非常不错的效果 不到20天
  • 计算机视觉最新技术:YOLOv8等前沿算法推荐!

    计算机视觉最新技术 YOLOv8等前沿算法推荐 计算机视觉是人工智能领域中的一个重要方向 它涉及到图像 视频等多媒体形式的信息处理 而随着人工智能技术的不断发展 计算机视觉领域也不断涌现出新的算法和模型 其中 YOLOv8等一系列算法被认为
  • 初识springcloud(微服务)

    1 微服务的定义 microservice 1 多个微服务开发的依然是一个完整的应用 2 微服务都会独立运行在一个独立的进程里面 3 微服务之间通常会采用轻量级的通信机制来进行通信 比如http https socket netty dub
  • python 视频流分析,通过ffmpeg管道将视频输出流到Python脚本中进行分析。如何导入python?...

    我正在与其他库一起编写一个脚本 它需要RGB24格式的帧或图像 为了提高兼容性 我决定允许外部管道将帧流式传输到这个程序中 每次在代码中使用更改设备或源代码可能会变得乏味 使用解析器简单地指定源代码会导致语法错误 示例 ffmpeg f d
  • python如何更新包

    python如何更新包 更多python视频教程请到菜鸟教程https www piaodoo com Python安装新包 pip是很好用的安装工具 pip list 可以查询所有已安装的包和版本 怎么知道本地安装包的版本是否有可以更新的
  • Python模拟智能开关设备MQTT接入阿里云物联网平台 - PyCharm paho.mqtt

    概要 Python 使用 paho mqtt 库 利用阿里云物联网平台的设备证书 productKey deviceName deviceSecret 自动合成 userName passWord 以MQTT通信协议接入阿里云物联网平台 并
  • IPFS搭建私有网络

    87条消息 IPFS 节点搭建 躺在家里不干活的博客 CSDN博客 ipfs节点搭建 一 安装go ipfs 1 下载 下载地址https gitee com wang ya nan go ipfs releases wget https
  • Hadoop Spark 常见问题【一】

    Spark 1 RDD 数据集拆分 数据存储在内存或者磁盘 多分区 失效自动重构 转换操作构造 2 RDD俩种依赖 窄依赖 父RDD中的分区最多只能被一个子RDD的一个分区使用 和宽依赖 子RDD依赖于所有父RDD 3 spark 角色 1
  • APS高级计划排程系统和生产排产系统

    一 什么是APS系统 高级计划与排程APS Advanced Planning and Scheduling 是指在考虑生产资源约束的前提下 通过优化方法 为生产加工任务精确安排生产资源和计划生产时间 使生产及时完成 并使资源充分利用 AP
  • 【WebRTC 02】从摄像头获取视频以及切换分辨率和视频源

    上一节中我们已经搭建出了用于操作的环境 这一节我们要实现的一个小目标 就是将电脑摄像头拍到的内容实时显示到网页上 同时我们一起学习下原理 并做一些小拓展 文章目录 操作环境 实现效果 几个概念 HTML5中的Audio和Video API
  • C++项目练手:矩阵类的功能实现

    C 项目练手 矩阵类的功能实现 C 课程设计 矩阵类的相关功能实现 矩阵简述 实数矩阵是由一个按照长方阵列排列的实数集合 除数据外 两个实数矩阵可以进行加法和乘法运算 一个矩阵也可以和一个实数相乘 得到一个新的矩阵 请基于抽象出的矩阵的属性
  • JavaScript进阶之高阶函数(Higher-order function)

    你还在以为 map reduce filter 是高阶函数吗 高阶函数听上去很让人不明觉厉 但其实也并没有什么特别厉害的地方 只是网上的定义一直让我们有点模糊而已 接下来我们来详细讲讲 首先是定义 查自百度百科 定义 在数学和计算机科学中
  • 二进制安装docker

    二进制安装docker文档 建模部署 docker安装 下载docker 因rpm包安装依赖较多 选择二进制安装 下载地址如下 https download docker com linux static stable x86 64 创建d

随机推荐