DNS协议分析

news2025/7/11 4:38:16

上一篇文章从工作原理角度分析了DNS的作用与意义,这次来看看DNS到底是以什么形式进行通信的。

DNS报文格式如下所示:

DNS报文由12字节长的首部和4个长度可变的字段组成。

1.标识,由主机端设置,为的是唯一标识当前DNS报文。

2.16bit的标志字段被划分为若干子字段。

a.第1位为query或response,0为请求,1为响应

b.opcode是操作码,0是标准查询(大部分情况),1是反向查询,2是服务器状态请求

c.AA是1 bit标志,表示"授权回答 (authoritative answer)",默认是0。

d.TC表示是否可截断,用UDP时,表示应答长度超过512字节时,只返回前512字节

e.RD表示"期望递归"请求,与RA对应,一般是请求端发送。该标志为1,说明服务器必须对该请求进行处理。若为0,且请求的DNS没有一个授权回答,就返回一个能够解答这种查询的其他DNS列表,这种方式成为迭代查询。

f.RA表示"可用递归",是RD的响应。大部分DNS都可响应RD,除了少部分根服务器

g.后面三位必须是0

h.rcode通常只有两种情况,0为没有差错,3为名字有错,表示查询中指定的域名不存在。

3.随后的 4个16 bit字段说明最后 4个变长字段中包含的条目数。对于查询报文,问题数通常是1,而其他3项则均为0。对于应答报文,回答数至少是 1,剩下的两项可以是0或非0。

4.DNS查询报文中的问题部分(通常一个DNS报文只有一个问题)

a.查询名是要查找的名字,它是一个或多个标识符的序列。每个标识符以首字节的计数值来说明随后标识符的字节长度,每个名字以最后字节为 0结束,长度为0的标识符是根标识符。

计数字节的值必须是0-63的数,因为标识符的最大长度仅为63

上图中的00001011是第一个标识符的计数值,1011代表11,说明后面11个字节为一个标识符,对应的是chenjingjiu这11个字符,后面的点被省略

然后是这个00000010,说明后面的标识符只有两个字节。

00000000表示根标识符,结束查询名字段。

这里要注意,从问题部分的图片可以看出,查询名字段虽然画成了整4字节的倍数的样子,但其实是可以随意变长的。可以是11字节,也可以是17字节,不一定是4字节的整倍数。

b.每个问题有一个查询类型,而每个响应也有一个类型。大约有2 0个不同的类型值,其中的一些目前已经过时。下图中是目前常用的类型记录。

最常用的查询类型是A类型,表示期望获得查询名的IP地址。一个PTR查询则请求获得一个IP地址对应的域名,这是一个指针查询。

c.查询类通常是1,指互联网地址(某些站点也支持其他非 I P地址)。

下面是用wireshark抓取到的访问我的个人博客产生的DNS记录。

(免费订阅,永久学习)学习地址: Dpdk/网络协议栈/vpp/OvS/DDos/NFV/虚拟化/高性能专家-学习视频教程-腾讯课堂

更多DPDK相关学习资料有需要的可以自行报名学习,免费订阅,永久学习,或点击这里加qun免费
领取,关注我持续更新哦! ! 

该DNS报文标识符为首先来看第一条数据0x290a,标志位第一位为0表示是一个请求,opcode是0表示该请求为标准请求,AA标志为0,TC标志为0说明未截断,RD为1表示请求递归,后面是保留位,最后4bit为0表示未出错。该DNS报文为一个请求报文,所以问题数为1,其余为0.再往后请求为http://chenjingjiu.cn,类型为A类型,为一个InterNet请求。

5.DNS响应报文中的资源记录部分

DNS报文中最后的三个字段,回答字段、授权字段和附加信息字段,均采用一种称为资源记录RR(Resource Record)的相同格式。

a.域名是记录中资源数据对应的名字。它的格式和前面介绍的查询名字段格式相同

b.类型说明RR的类型码。它的值和前面介绍的查询类型值是一样的。通常是1,指InterNet数据

c.生存时间字段是客户程序保留该资源记录的秒数。资源记录通常的生存时间值为2天。

d.资源数据长度说明资源数据的数量。该数据的格式依赖于类型字段的值。对于A类型资源,该值为4

e.对于A类型资源,资源数据是4字节的IP地址

接下来看第一个DNS请求的响应报文

可以看出前面与请求报文是相同的,只有后面不同。但是后面最有意思的是Name字段仅占用2字节,而请求时的报文可是用了16字节呢,这种差距不可谓不大了。这是DNS报文设计之初就考虑到每个报文中可能有很多重复的Name字段,因此设计了一种压缩表示法。前两bit为11表示压缩格式,而后面跟的14bit表示的是Name所在的位置相对于DNS首部的偏移值。本例中1100转换为12,说明相对于DNS首部偏移值是12字节,正好是DNS首部的定长字段。而第13字节就是请求的Name。所以该字段值一般都是12.

后面指示的类型2字节,类别2字节,TTL是4字节,数据长度2字节,地址占用4字节。返回博客IP地址188.131.238.222.

来看一下报文的长度,请求报文74字节,响应报文90字节。做一个简单的计算:

请求报文(74)=Ether(14)+IP(20)+UDP(8)+DNS(32)=Ether[D_MAC(6)+S_MAC(6)+IP_type(2)]+IP[Version(0.5)+Header_len(0.5)+Service_type(1)+Total_len(2)+Identity(2)+Flag(3bit)+Offset(13bit)+TTL(1)+Protocol(1)+Checksum(2)+S_IP(4)+D_IP(4)]+UDP[S_port(2)+D_port(2)+UDP_Len(2)+Checksum(2)]+DNS[TID(2)+Flag(2)+Question(2)+Ans_RR(2)+Auth_RR(2)+Add_RR(2)+Name(16)+DNS_type(2)+Class(2)]

响应报文(90)=请求报文(74)+DNS_response[Name(2)+Type(2)+Class(2)+TTL(4)+Data_len(2)+Address(4)]

最后来考虑一下DNS到底是用UDP还是TCP?

DNS名字服务器使用的熟知端口号无论对UDP还是TCP都是53,这意味着DNS均支持UDP和TCP访问。但从刚才wireshark抓出的包可以看出,基本上DNS都是通过UDP传输的,那么什么时候用TCP呢?

前面介绍过一个TC位,当DNS发出一个查询请求,并且返回响应中的TC位为1,说明该DNS响应长度超过512字节,后面的响应有缺失,因此此时需要利用TCP进行重传。TCP可以分段传输任意长度的报文。

本文就到这里,后面还会接触到一个叫DNS2TCP的隧道,并且利用这个隧道来实现上网。

原文链接:https://zhuanlan.zhihu.com/p/61782663 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/108989.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

关于Docker入门

目录 1.Docker简介 2.Centos7安装Docker 3.Docker HelloWorld运行原理解析 4.阿里云镜像仓库 5.Docker命令 Docker基本命令 Docker镜像常用命令 Docker 容器常用命令 1.Docker简介 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源 Doc…

Vue3——vuex的使用——axios网络请求的使用

vuex作用:用来集中式管理数据 集中式的应用,当前有四个组件A,B,C,D,假如现在有一个数据x在A里面,现在其他三个组件都要用到x并且好要修改x的时候,有一种方法就要用到全局事件总线,如下图所示 像上面这样不…

用于生成随机曲面的Matlab程序(Matlab代码实现)

目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨‍💻4 Matlab代码 💥1 概述 本文在总结、分析现有随机图形生成方法的基础上,结合自由形状的造型技术、自适应神经网络的自适应学习机理&#x…

科研人快速入门LaTex到日常使用,下载安装配置,语法使用说明等

1 前言 Latex是一款开源免费并且应用相当广泛的排版工具,被⼴泛运⽤在各个⾏业,⽐如学术界、出版界。LaTeX 和 Word 相比,LaTeX 入门者更能写出漂亮的文档。它不但能对文字、公式、图片进行精确而复杂的排版,并且还能保证全文各个…

【OpenFeign】【源码+图解】【四】FeignClient实例工具类ReflectiveFeign

【OpenFeign】【源码图解】【三】FeignClient的配置信息 目录5. FeignClient实例工具类ReflectiveFeign5.1 增强Builder属性5.1.1 Capability5.2 创建ReflectiveFeign5. FeignClient实例工具类ReflectiveFeign 上文中调用了targeter.target(this, builder, context, target)&a…

【GO】 K8s 管理系统项目[API部分--Node]

K8s 管理系统项目[API部分–Node] 1. 接口实现 service/dataselector.go type nodeCell corev1.Nodefunc(n nodeCell) GetCreation() time.Time {return n.CreationTimestamp.Time }func(n nodeCell) GetName() string {return n.Name }2. Node功能 service/node.go 2.1 重…

基于Servlet 的Java Web项目的CSRF防御概念

本篇创建一个基本的Jave Web 项目, 使用Servlet提供服务, 使用Filter 处理CSRF防御。 演示环境 Java 1.8.0_211Eclipse 2021-06 (4.20.0)Maven 3.6Servlet 创建与运行 在Eclipse 中创建一个简单的Maven 项目, 项目名为 java-web,如下图: 创建完成的项目目录结构如下: 创…

pre compile header

预编译头文件存在的目的是减少一个项目中不经常改动的文件的编译次数; 打个比方:c标准库,当我们在项目中调用一个c标准库的时候,这个库一般是只读的,所以我们没必要每次编译项目的时候都recompile c标准库&#xff1b…

预约挂号系统技术点详解(二)

一、微服务间服务的调用介绍 1. 需求(医院接口远程调用数据字典) service-hosp服务调用service-cmn服务 2. 实现步骤 ⑴ 搭建service-client父模块 修改pom文件,添加需要使用的model模块和工具模块依赖,并添加openfeign依赖 …

Python学习笔记-PyQt

记述PyQt的相关基本知识。 一、PyQt概述 PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是最强大的库之一。PyQt是由Phil Thompson 开发。 PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工…

使用 kube-prometheus(release-0.6) 监控 Kubernetes v1.18.20

本文档是使用 kube-prometheus-stack[release-0.6] 来监控 kubernetes1.18.20,具体兼容性可以看这里:https://github.com/prometheus-operator/kube-prometheus/tree/release-0.6#kubernetes-compatibility-matrix 1 概述 1.1 在 k8s 中部署 Prometheus…

SpringBoot任务调度(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-scheduling-tasks.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建应用程序,使用…

数据结构 - AVL树 (Adelson-Velsky and Landis Tree)

目录一、前言二、简介三、左旋与右旋四、AVL树的调整1、向AVL树中插入新数据1)LL型不平衡(右单旋转)2)RR型不平衡(左单旋转)3)LR型不平衡(左右双旋转)4)RL型不…

爆款短视频是怎样练成的:视频发布技巧,首次公开

剪辑好的优质短视频怎么发布才能成为爆款视频?短视频发布技巧公开 前面几篇我们讨论了短视频定位,怎么写文案脚本,怎么拍摄以及后期剪辑,至此我们一个优质的短视频已经制作完成,今天我们就聊一下下一个环节&#xff1…

Kafka Producer Retries Idempotence 原理

Kafka Producer Retries & Idempotence 原理 由于存在网络瞬时抖动;或者kafka集群短暂的不可用,会导致kafka producer发送消息出现异常,生产者无法将消息推送到topic,在这种情况下,消息丢失的可能性很高。因此kaf…

全排列思路

目录 省流版结论 推导过程 输出结果(元素数量为4时) 省流版结论 (程序来源:排列组合之——全排列(c语言)_rewrite!的博客-CSDN博客_全排列) 一晚上的时间,终于弄懂了。真羡慕计算…

基于标志点特征高精提取与匹配方法,进行双目、结构光、RGBD相机、单目相机多视拼接

1. 工作原理 人工张贴标志点变换位置拍照相邻照片的公共视野内有相同的标志点群匹配两张照片对应标志点对通过三对以上标志点对,实现两张照片间的坐标变换求解 2.标志点特征 圆形 分类: 编码(粘贴于被测物体表面):…

SpringBoot文件上传(官方案例)

在线文档项目结构 1.源码克隆:git clone https://github.com/spring-guides/gs-uploading-files.git 2.包含两个项目initial和complete,initial可以根据文档练习完善,complete是完整项目 3.功能描述:构建接受文件上传的应用程序&a…

转行人必看:数字IC前端设计学习路线与方法(内附学习视频)

众所周知,数字前端设计对于工程师的能力要求比较高,不仅有学历上的要求,还要求掌握很多的知识技能。不少跨专业想要转行的小伙伴对数字前端设计这个岗位不是很了解,下面IC修真院就带大家全面了解一下数字IC前端设计。 数字前端到…

酒水销售网站

开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 网站前台:网站介绍、帮助信息、酒水资讯、酒水类型、酒水信息、购物分享 管理员: 1、管理网站介…