深入解析DNS请求与响应报文—基于RFC1035的逐字节分析

news2024/10/21 3:01:12

深入解析DNS请求与响应报文 — 基于RFC1035的逐字节分析

​ 在网络通信中,DNS(域名系统)扮演着至关重要的角色,主要负责将人类可读的域名转换为机器可读的IP地址。DNS默认使用UDP协议进行查询,因为UDP具有较低的延迟和开销,适合快速的请求-响应模式。然而,在以下情况下,DNS会使用TCP协议:

  • 当响应数据超过512字节时(在DNS中,如果使用EDNS0,最大可以达到4096字节)。
  • 当进行区域传送(zone transfer)时,通常用于DNS服务器之间的同步。
  • 当请求需要保证可靠性(如在某些复杂的查询中)。

​ 在这篇博客中,我们将结合RFC1035的规范,详细分析DNS请求与响应报文的格式与内容。我们将涵盖以下内容:

  1. DNS数据帧格式(基于RFC1035)。
  2. DNS资源记录(RR)格式(基于RFC1035)。
  3. 逐字节分析DNS请求与响应报文,并结合以上两点进行详细解析。

1. DNS 数据帧格式(根据RFC 1035)

在深入分析DNS请求和响应报文之前,我们先了解一下DNS数据帧的整体结构。基于RFC1035,DNS数据帧的格式可以分为以下几个部分:

+---------------------+
|        Header       |  固定12字节,包含标识符、标志位、计数器等
+---------------------+
|      Question       |  可变长度,包含查询的域名、查询类型等
+---------------------+
|       Answer        |  可变长度,包含资源记录(RR)的回答部分
+---------------------+
|     Authority       |  可变长度,包含权威名称服务器信息(如果有)
+---------------------+
|     Additional      |  可变长度,包含附加信息(如果有)
+---------------------+

DNS数据帧各部分说明:

  1. Header:包含ID、标志位、问题数、回答数、权威记录数、附加记录数等。
  2. Question:用于客户端查询的域名信息。
  3. Answer:服务器返回的查询结果(例如A记录、CNAME记录等)。
  4. Authority:指示权威名称服务器的信息。
  5. Additional:可能包含额外的资源记录或其他附加信息。

DNS数据帧头部格式

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                      ID                       | 16 位标识符
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|QR| Opcode |AA|TC|RD|RA| Z|AD|CD|   RCODE      | 标志字段
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                QDCOUNT (问题计数)             |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                ANCOUNT (回答计数)             |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|              NSCOUNT (权威记录计数)           |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|              ARCOUNT (附加记录计数)           |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  • ID:唯一标识DNS查询和响应报文的16位标识符。
  • Flags:包含各种标志位(QR表示查询或响应,Opcode表示操作码,AA为授权应答,RD为递归请求等)。
  • QDCOUNT:问题部分的数量。
  • ANCOUNT:回答部分的数量。
  • NSCOUNT:权威部分的数量。
  • ARCOUNT:附加部分的数量。

DNS报文中的四个部分

  • 问题部分
    • 包含查询名称、类型和类。
  • 回答部分
    • 包含问题的回答,如IP地址、CNAME等。
  • 权威部分
    • 包含授权服务器的信息。
  • 附加部分
    • 提供额外的资源记录(RR)。

2. DNS 资源记录(RR)格式

​ 在上一章节中,我们介绍了DNS数据帧的整体结构,其中AnswerAuthorityAdditional部分都可能包含资源记录(Resource Records, RR)。资源记录是DNS响应中用来携带域名解析结果的核心组成部分。

​ 每个资源记录遵循相同的结构,定义了域名信息、类型、TTL(生存时间)和实际的数据值。为了理解DNS的响应内容,我们需要先掌握RR格式的具体组成部分。

​ 资源记录(RR)是DNS报文的核心内容,描述了域名相关的数据。RR的格式如下:

+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                                               |
/                   NAME                        / 域名
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   TYPE                        | 资源类型
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   CLASS                       | 资源类(通常为IN)
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                    TTL                        | 生存时间
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
|                   RDLENGTH                    | 数据长度
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
/                   RDATA                       / 资源数据
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
  • NAME:域名,采用压缩格式或标签形式存储。
  • TYPE:记录类型(如A、CNAME、MX等)。
  • CLASS:资源类,通常为IN(表示互联网类)。
  • TTL:生存时间,以秒为单位,指示缓存记录的时长。
  • RDLENGTH:资源数据的长度。
  • RDATA:资源数据,根据类型不同,内容也不同。

3. 逐字节分析DNS请求报文

以下是一个DNS请求报文的示例:

0000   a1 d2 13 84 7c 6a 51 e2 33 34 8a 22 08 00 45 00
0010   00 48 e2 ea 00 00 40 11 f1 f7 c0 a8 01 10 df 05
0020   05 05 e5 f0 00 35 00 34 2b 94 2e 45 01 00 00 01
0030   00 00 00 00 00 00 0c 73 61 66 65 62 72 6f 77 73
0040   69 6e 67 06 75 72 6c 73 65 63 02 71 71 03 63 6f
0050   6d 00 00 01 00 01

逐字节分析

我们将报文分为以太网帧、IP头部、UDP头部和DNS报文部分。

以太网帧头部
0000   a1 d2 13 84 7c 6a   // 目的MAC地址
0006   51 e2 33 34 8a 22   // 源MAC地址
000C   08 00               // 以太网类型,0800表示IPv4
IP头部
000E   45 00               // 版本(IPv4)和头部长度
0010   00 48               // 总长度(72字节)
0012   e2 ea               // 标识符
0014   00 00               // 标志和片偏移
0016   40                  // TTL(64)
0017   11                  // 协议(17,表示UDP)
0018   f1 f7               // IP头部校验和
001A   c0 a8 01 10         // 源IP地址(192.168.1.16)
001E   df 05 05 05         // 目的IP地址(223.5.5.5)
UDP头部
0022   e5 f0               // 源端口(58864)
0024   00 35               // 目的端口(53,DNS)
0026   00 34               // 长度(52字节)
0028   2b 94               // 校验和
DNS报文头部
002A   2e 45               // Transaction ID(随机生成)
002C   01 00               // 标志位,表示标准查询
002E   00 01               // QDCOUNT(1个问题)
0030   00 00               // ANCOUNT(无回答)
0032   00 00               // NSCOUNT(无权威记录)
0034   00 00               // ARCOUNT(无附加记录)
DNS问题(Question)部分
0036   0c 73 61 66 65 62 72 6f 77 73 69 6e 67   // 查询的域名(safebrowsing)
0042   06 75 72 6c 73 65 63                     // 域名(urlsec)
0048   02 71 71                                 // 域名(qq)
004B   03 63 6f 6d 00                           // 域名(com)
004F   00 01                                    // 查询类型(A记录)
0051   00 01                                    // 查询类(IN,互联网类)

4. 逐字节分析DNS响应报文

以下是一个DNS响应报文的示例:

0000   51 e2 33 34 8a 22 a1 d2 13 84 7c 6a 08 00 45 00
0010   00 98 e2 ea 00 00 77 11 ba a7 df 05 05 05 c0 a8
0020   01 10 00 35 e5 f0 00 84 00 00 2e 45 81 80 00 01
0030   00 03 00 00 00 00 0c 73 61 66 65 62 72 6f 77 73
0040   69 6e 67 06 75 72 6c 73 65 63 02 71 71 03 63 6f
0050   6d 00 00 01 00 01 c0 0c 00 05 00 01 00 00 00 44
0060   00 24 0c 69 6e 73 2d 33 74 6d 77 62 72 34 71 03
0070   69 61 73 0d 74 65 6e 63 65 6e 74 2d 63 6c 6f 75
0080   64 03 6e 65 74 00 c0 38 00 01 00 01 00 00 00 44
0090   00 04 2a 51 96 c9 c0 38 00 01 00 01 00 00 00 44
00a0   00 04 2a 51 96 ca

逐字节分析

以太网帧头部
0000   51 e2 33 34 8a 22  // 目的MAC地址
0006   a1 d2 13 84 7c 6a  // 源MAC地址
000C   08 00               // 以太类型,0800表示IPv4
IP头部
000E   45 00               // 版本(IPv4)和头部长度
0010   00 98               // 总长度(152字节)
0012   e2 ea               // 标识符
0014   00 00               // 标志和片偏移
0016   77                  // TTL(119)
0017   11                  // 协议(17,表示UDP)
0018   ba a7               // IP头部校验和
001A   df 05 05 05        // 源IP地址(223.5.5.5)
001E   c0 a8 01 10        // 目的IP地址(192.168.1.16)
UDP头部
0022   00 35               // 源端口(53,DNS)
0024   e5 f0               // 目的端口(58864)
0026   00 84               // 长度(132字节)
0028   00 00               // 校验和
DNS报文头部
002A   2e 45               // Transaction ID(0x2e45)
002C   81 80               // 标志位,表示这是响应,QR=1,标准响应
002E   00 01               // QDCOUNT(1个问题)
0030   00 03               // ANCOUNT(3个回答)
0032   00 00               // NSCOUNT(0个权威记录)
0034   00 00               // ARCOUNT(0个附加记录)
DNS问题(Question)部分
0036   0c 73 61 66 65 62 72 6f 77 73 69 6e 67   // 查询的域名(safebrowsing)
0042   06 75 72 6c 73 65 63                     // 域名(urlsec)
0048   02 71 71                                 // 域名(qq)
004B   03 63 6f 6d 00                           // 域名(com)
004F   00 01                                    // 查询类型(A记录)
0051   00 01                                    // 查询类(IN,互联网类)
回答部分(Answer Section)
0053   c0 0c               // 指向问题部分的指针,表示名称(safebrowsing)
0055   00 05               // 类型(CNAME,0x0005)
0057   00 01               // 类(IN,0x0001)
0059   00 00 00 44         // TTL(68秒)
005D   00 24               // RDLENGTH(36字节)
005F   0c 69 6e 73 2d 33 74 6d 77 62 72 34 71 03  // RDATA(ins-3tmwbr4q.)
0070   69 61 73 0d 74 65 6e 63 65 6e 74 2d 63 6c 6f 75
0080   64 03 6e 65 74 00   // RDATA(tencent-cloud.net)

在这个回答部分中,第一条记录是CNAME记录,指向**ins-3tmwbr4q.tencent-cloud.net**。

接下来是第二条记录:

0080   c0 38               // 指向问题部分的指针,表示名称(tencent-cloud.net)
0082   00 01               // 类型(A,0x0001)
0084   00 01               // 类(IN,0x0001)
0086   00 00 00 44         // TTL(68秒)
008A   00 04               // RDLENGTH(4字节)
008C   2a 51 96 c9        // RDATA(42.81.150.201)
  • 第二条记录:A记录为 42.81.150.201

然后是第三条记录:

0090   c0 38               // 指向问题部分的指针,表示名称(tencent-cloud.net)
0092   00 01               // 类型(A,0x0001)
0094   00 01               // 类(IN,0x0001)
0096   00 00 00 44         // TTL(68秒)
009A   00 04               // RDLENGTH(4字节)
009C   2a 51 96 ca        // RDATA(42.81.150.202)
  • 第三条记录:A记录为 42.81.150.202

解析结果

  • 第一条记录:CNAME为 ins-3tmwbr4q.tencent-cloud.net
  • 第二条记录:A记录为 42.81.150.201
  • 第三条记录:A记录为 42.81.150.202

分析小结

在分析完请求和响应的报文后,我们发现以下几点:

  • 请求报文的ID(Transaction ID)用于匹配请求与响应。响应中包含相同的ID,确保请求者能够识别响应。
  • 响应报文中包含多个答案(ANCOUNT),表示该查询可能对应多个结果。在这个例子中,提供了CNAME记录和相应的目标域名。
  • **资源记录(RR)**的每个部分都严格遵循RFC 1035的定义,包括NAME、TYPE、CLASS、TTL、RDLENGTH和RDATA字段。

最后

​ 通过逐字节分析DNS请求与响应报文,我们可以深入了解DNS的工作原理和报文结构。结合RFC 1035中的规范,能够更好地理解DNS如何在网络中执行域名解析任务。希望这篇博客对你理解DNS协议有帮助!

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

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

相关文章

Halcon实战——基于NCC模板匹配的芯片检测(附源码)

Halcon实战——基于NCC模板匹配的芯片检测(附源码) 关于作者 作者:小白熊 作者简介:精通python、matlab、c#语言,擅长机器学习,深度学习,机器视觉,目标检测,图像分类&am…

Java | Leetcode Java题解之第493题翻转对

题目&#xff1a; 题解&#xff1a; class Solution {public int reversePairs(int[] nums) {Set<Long> allNumbers new TreeSet<Long>();for (int x : nums) {allNumbers.add((long) x);allNumbers.add((long) x * 2);}// 利用哈希表进行离散化Map<Long, Int…

linux 效率化 - 输入法 - fcitx5

安装 Fcitx5 1. 卸载 ibus 框架 由于 ibus 和 fcitx 可能会冲突&#xff0c;先卸载 ibus&#xff08;暂未确认原因&#xff09; sudo apt remove --purge ibus2. 安装 fcitx5 输入法框架 sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-frontend-gtk…

深入理解Nest的REQUEST范围和TRANSIENT范围

深入理解Nest的REQUEST范围和TRANSIENT范围 单例模式REQUEST范围控制器的REQUEST范围REQUEST范围的冒泡特性场景 TRANSIENT范围例外场景 总结 单例模式 单例模式是指在整个程序执行期间&#xff0c;程序内的类都会实例化&#xff0c;且与应用程序生命周期直接相关&#xff0c;…

javax.el.PropertyNotFoundException: Property ‘XXX‘ not found on type XXX(类的路径)

捣鼓了半小时的bug 在网上找了好多方案,都没有解决 其中一个佬的解决方案:异常&#xff1a;javax.el.PropertyNotFoundException: Property xxx not found on type java.lang.String-CSDN博客 但是还是没有解决我的问题 最终解决方法,在jsp文件头部导入了类包(第三行我导入…

【Nginx系列】Nginx配置超时时间

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

MySQL日期类型选择建议

我们平时开发中不可避免的就是要存储时间&#xff0c;比如我们要记录操作表中这条记录的时间、记录转账的交易时间、记录出发时间、用户下单时间等等。你会发现时间这个东西与我们开发的联系还是非常紧密的&#xff0c;用的好与不好会给我们的业务甚至功能带来很大的影响。所以…

深入拆解TomcatJetty(二)

深入拆解Tomcat&Jetty&#xff08;二&#xff09; 专栏地址&#xff1a;https://time.geekbang.org/column/intro/100027701 1、Tomcat支持的IO模型和应用层协议 IO模型&#xff1a; NIO&#xff1a;非阻塞 I/O&#xff0c;采用 Java NIO 类库实现。NIO2&#xff1a;异…

Cyber RT 之 Timer Component 实践(apollo 9.0)

实验内容 Component 是 Cyber RT 提供的用来构建功能模块的基础类&#xff0c;Component 有两种类型&#xff0c;分别为 Component 和 TimerComponent。 相较于 Component&#xff0c;TimerComponent 不提供消息融合&#xff0c;也不由消息触发运行&#xff0c;而是由系统定时…

UE5 gameplay学习 蓝图0 level blueprint

首先在左上角这个位置可以创建一个这个蓝图 我理解这个蓝图适合做全局事件规划啥的 在场景选中一个物体&#xff0c;右侧面板拿到他&#xff0c;直接拖入蓝图&#xff0c;就能操作他了 这里获取到了这个物体&#xff0c;在gamebegin的时候把Z加了500 执行播放的时候能看见他从…

Windows API 一 ----起步

目录 1.介绍主函数入口参数。 2. 简单介绍 Windows.h 这个头文件 小结&#xff0c;也聊一聊 1.介绍主函数入口参数。 第一个参数: HINSTANCE 类型的 参数&#xff0c; 称为“实例句柄“&#xff0c;这个参数唯一标志了我们写的这个程序。 第二个参数&#xff1a; HINSTANCE…

poisson过程——随机模拟(Python和R实现)

Python实现 exponential()使用&#xff0c;自动poisson过程实现。 import numpy as np import matplotlib.pyplot as plt# Parameters lambda_rate 5 # rate parameter (events per time unit) T 10 # total time# Generate Poisson process times np.random.exponential(…

k8s系列-Rancher 上操作的k8s容器网络配置总结

Rancher 上操作的k8s容器网络配置总结 要在 Rancher 中配置Spring Boot 应用 ykhd-zhjgyw-xpwfxfjfl 服务&#xff0c;正确的配置方式如下&#xff1a; 1. 应用程序监听端口 在 application.yaml 文件中&#xff0c;配置的应用监听端口是 10001&#xff0c;并且应用的上下文…

Mycat 详细介绍及入门实战,解决数据库性能问题

一、基本原理 1、数据分片 &#xff08;1&#xff09;、水平分片 Mycat 将一个大表的数据按照一定的规则拆分成多个小表&#xff0c;分布在不同的数据库节点上。例如&#xff0c;可以根据某个字段的值进行哈希取模&#xff0c;将数据均匀的分布到不同的节点上。 这样做的好处…

美摄科技云服务解决方案,方案成熟,接入简单

美摄科技作为视频处理领域的先锋&#xff0c;凭借其强大的技术实力和深厚的行业经验&#xff0c;推出了成熟的云服务解决方案&#xff0c;为轻量化视频制作开辟了全新的道路。 一、成熟方案&#xff0c;接入无忧 美摄科技云服务解决方案的最大亮点在于其成熟度和易用性。我们…

RabbitMQ 入门(四)SpringAMQP五种消息类型(Work Queue)

一、WorkQueue(工作消息队列) Work queues&#xff0c;也被称为&#xff08;Task queues&#xff09;&#xff0c;任务模型。简单来说就是让多个消费者绑定到一个队列&#xff0c;共同消费队列中的消息。 当消息处理比较耗时的时候&#xff0c;可能生产消息的速度会远远大于…

react里实现左右拉伸实战

封装组件&#xff1a; 新建一个resizeBox.tsx文件写上代码如下&#xff1a; import React, { ReactNode, useState, useEffect, useRef } from react; import styles from "./resizeBox.less"; interface ResizableBoxProps {/*** 盒子的宽度*/widthNum?: number;…

比较相同机器上 redis和mysql分别单独承载的 最大连接数量

在相同的机器上&#xff0c;Redis 和 MySQL 的最大连接数量会受到硬件配置&#xff08;如 CPU、内存、网络等&#xff09;、配置参数和应用场景的影响。以下是对 Redis 和 MySQL 在单机环境下最大连接数的比较&#xff1a; Redis 最大连接数量 默认配置&#xff1a; Redis 默…

【2024最新版】网络安全学习路线-适合入门小白

首先说明&#xff0c;我是一名CTF的web手&#xff0c;这是我自己亲身学习网络安全的路线&#xff0c;希望能够帮到大家&#xff0c;我虽然不是大牛&#xff0c;但我也希望能够帮助一些网安小白找到自己学习的方向&#xff0c;后面有就业的详细安全技术要求&#xff0c;如果真想…

yolov8实例分隔

1.查看显卡型号 2.在https://en.wikipedia.org/wiki/CUDA上查看显卡算力&#xff0c;这里显卡为1650&#xff0c;算力为7.5 3.查看显卡算力对应的cuda版本 4slurm上该怎么办&#xff1f; 查看slurm上计算节点cuda版本 查看cuda版本 srun -A 2022099 -J job1 -p Gnode --…