一、前言

之前在聊到 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 启动速度优化


simulink 解析udp数据_DNS 支持 TCP 和 UDP 双协议,但为何偏偏只钟情 UDP?相关推荐

  1. ssh协议是tcp还是udp_DNS 支持 TCP 和 UDP 双协议,但为何偏偏只钟情 UDP?

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

  2. Linux内核网络UDP数据包发送(三)——IP协议层分析

    1. 前言 Linux内核网络 UDP 协议层通过调用 ip_send_skb 将 skb 交给 IP 协议层,本文通过分析内核 IP 协议层的关键函数来分享内核数据包发送在 IP 协议层的处理,并分 ...

  3. linux下udp丢包和传输延迟,如何测试UDP数据包的丢包率和延迟

    iperf也可以用于UDP数据包吞吐量.丢包率和延迟指标,但是由于UDP协议是一个非面向连接的轻量级传输协议,并且不提供可靠的数据传输服务,因此对UDP应用的关注点不是传输数据有多快,而是它的丢包率和 ...

  4. qt定时连续发送udp数据包_TCP和UDP

    首先强调一点,TCP/IP协议是一个协议簇.里面包括很多协议的,UDP只是其中的一个, 之所以命名为TCP/IP协议,因为TCP.IP协议是两个很重要的协议,就用他两命名了. 两个协议的区别实际使用时 ...

  5. [js] ajax请求地址只支持http/https吗?能做到让它支持rtmp://等其它自定义协议吗 ?

    [js] ajax请求地址只支持http/https吗?能做到让它支持rtmp://等其它自定义协议吗 ? ajax只支持http/https协议, 可以通过自定义http头来间接支持自定义协议 个人 ...

  6. 在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议)

    原标题:在C++ Builder中用socket api来写网络通讯程序(同时支持TCP和UDP协议) 原文:  http://www.csdn.net/develop/read_article.as ...

  7. frp实现花生壳+阿里云内网穿透,实现公有IP映射到本地(支持 TCP、UDP、HTTP、HTTPS 等多种协议)

    简介: 一文搞懂frp内网穿透并搭建配置使用,Windows.Mac电脑远程链接! frp 是一个专注于内网穿透的高性能的反向代理应用,支持 TCP.UDP.HTTP.HTTPS 等多种协议.可以将内 ...

  8. 教你动手写UDP协议栈 - UDP数据包解析<1>

    前景 为啥要自己写一个mini UDP的协议栈?因为我们干偷偷摸摸的事情,哈哈哈!!! 其实是为了不跑一个庞大的LWIP协议栈,通过自己写的mini udp协议栈截取数据包给设备升级.这样节省了很多资 ...

  9. 以太网,IP,TCP,UDP数据包分析【转】

    原文地址:http://www.cnblogs.com/feitian629/archive/2012/11/16/2774065.html 1.ISO开放系统有以下几层: 7 应用层 6 表示层 5 ...

最新文章

  1. Appium入门实例(Java)
  2. 【转】如何一直保持测试工作的热情
  3. mybatis学习(3)进阶
  4. Android官方开发文档Training系列课程中文版:创建自定义View之View的创建
  5. myeclipse 8.5 安装jbpm3.2开发插件
  6. Atitit 工作手册之班委会工作法 班级管理法 目录 1.1. 班级管理工作规范 1 1.2. 班长、学习委员、生活委员、纪律委员、宣传委员、文体委员组成的班委会 1 2. 班委会职责 1 2.
  7. oracle连接no listener
  8. 计算机组成原理试题库(含答案),计算机组成原理试题库(含答案)--
  9. vux页面转换html,Vue 初学者使用 Vux 前端开发框架 - 文章教程
  10. 统信系统安装京瓷打印机驱动步骤 针对京瓷系列复合机的UOS操作系统用户使用说明
  11. 08cms php5.4,08CMS - 内容管理CMS - PHP开源项目 - 开源吧
  12. Ubuntu14.04 安装Firefox flash插件
  13. 数据杂谈:CIO和CTO的区别(首席信息官首席技术官)
  14. docker(ELK) - logstash-elasticsearch-kibana
  15. Excel如何提取身份证中出生年月日、计算年龄、性别
  16. python2编码unicode,在不终止Unicode的情况下,在Python 2中编码转义字符的正确方法是什么?...
  17. php扩展库后门,编写基于PHP扩展库的后门
  18. 01-pandas时间类型dt类属性及方法
  19. (附源码)ssm高校志愿者服务系统 毕业设计 011648
  20. 几种重要的排序算法——交换排序

热门文章

  1. c语言程序设计报告用于医院食品加工等部,南开(本部)《C语言程序设计》14春在线作业答案...
  2. 关于exprot 和expert default的区别
  3. MySQL 过滤重复数据
  4. mysql c api example_The MySQL C API 编程实例
  5. Python入门进阶篇(六)字典的介绍
  6. 一个公网ip多少钱_一个丛书书号多少钱
  7. python的request请求401_Python模拟HTTPS请求返回HTTP 401 unauthorized错误
  8. 设无向图g如图所示_阿里重磅发布大规模图神经网络平台 AliGraph,架构算法解读...
  9. python处理表格数据教程_python利用Excel读取和存储测试数据完成接口自动化教程...
  10. js关闭setInterval及终止ajax请求