深入解析DNS协议与报文示例

深入解析DNS协议与报文示例

DNS(Domain Name System)是一种用于域名解析的协议,通过DNS报文的交互实现域名到IP地址的映射。本文将深入分析一个DNS查询报文和DNS应答报文的示例,解释每个字段的含义和作用。

DNS报文概述 一个标准的DNS报文由两部分组成:DNS查询报文和DNS应答报文。每个报文都包含了固定的报文头和变长的问题、回答、授权和附加部分。

DNS报文结构

dns报文结构

以下是DNS报文的主要部分及其作用:

  1. DNS报文首部(DNS Header):
    • 标识(Identification): 16位字段,用于标识报文,用于匹配查询和响应。
    • 标志(Flags): 包含多个标志位,如查询/响应标志、递归标志等。
    • 问题数(QDCount): 指定查询部分的问题数目。
    • 回答数(ANCount): 指定回答部分的记录数目。
    • 权威部分数(NSCount): 指定权威部分的记录数目。
    • 附加部分数(ARCount): 指定附加部分的记录数目。

在这里插入图片描述

  1. 查询部分(Question Section):

    • 域名(QNAME): 一个以字节为单位的域名列表,表示查询的域名。
    • 查询类型(QTYPE): 16位字段,表示查询的资源记录类型。
    • 查询类别(QCLASS): 16位字段,表示查询的资源记录类别。
  2. 回答部分(Answer Section):

    • 域名(NAME): 一个以字节为单位的域名列表,表示查询的域名。
    • 类型(TYPE): 16位字段,表示资源记录的类型。
    • 类别(CLASS): 16位字段,表示资源记录的类别。
    • 生存时间(TTL): 32位字段,表示资源记录的生存时间。
    • 数据长度(RDLENGTH): 16位字段,表示资源记录数据字段的长度。
    • 资源记录数据(RDATA): 实际的资源记录数据,可以是IPv4地址、IPv6地址、CNAME等。
  3. 权威部分(Authority Section):

    • 类似于回答部分,包含权威服务器的资源记录信息。
  4. 附加部分(Additional Section):

    • 类似于回答部分,包含额外的资源记录信息,通常用于提供额外的信息,如DNSSEC签名等。

DNS报文的各个部分协同工作,完成了域名解析的过程。查询部分包含了要查询的域名和相关信息,而回答部分包含了查询得到的结果。权威部分和附加部分提供了额外的信息,帮助解析器更好地理解和验证DNS数据。整个DNS报文的结构允许DNS系统在分布式网络环境中高效地工作。

1. DNS查询报文

00 19 56 6e 19 bf 00 17  a4 1a b2 e0 08 00 45 00
00 3b ed c6 00 00 80 11  e3 c3 ac 15 0f 04 ac 15
01 f9 04 a9 00 35 00 27  2f bd 3e 3a 01 00 00 01
00 00 00 00 00 00 03 77  77 77 06 67 6f 6f 67 6c
65 02 63 6e 00 00 01 00  01 

这个数据包是一个IPv4的UDP数据包,它包含了一个DNS查询请求。让我们逐步解析这个数据包。

  • 以太网帧头(Ethernet Frame Header):

    • 00 19 56 6e 19 bf: 源MAC地址。
    • 00 17 a4 1a b2 e0: 目标MAC地址。
    • 08 00: 以太网类型字段,表示上层协议为IPv4。
  • IPv4报文头(IPv4 Header):

    • 45: 版本(4)和首部长度(5个32位字)。
    • 00 3b: 服务类型和总长度(59字节)。
    • ed c6: 标识、标志和片偏移。
    • 00 00: 生存时间(TTL)。
    • 80 11: 协议(UDP)和首部校验和。
    • e3 c3 ac 15: 源IP地址(172.21.4.172)。
    • 0f 04 ac 15: 目标IP地址(172.21.1.245)。
  • UDP报文头(UDP Header):

    • 04 a9: 源端口号(1193)。
    • 00 35: 目标端口号(53)。
    • 00 27: UDP长度。
    • 2f bd: 校验和。
  • DNS报文:

    • 3e 3a: 事务标识(0x3e3a)。
    • 00 01: 标志字段,表示这是一个标准查询,且期望递归。
    • 00 01: 问题数(1个问题)。
    • 00 00: 回答数(0个回答)。
    • 00 00: 权威回答数(0个权威回答)。
    • 00 00: 附加记录数(0个附加记录)。
  • DNS查询部分(Question Section):
    在这里插入图片描述

    • 03 77 77 77: 查询的域名长度和内容(“www”)。
    • 06 67 6f 6f 67 6c 65: 查询的域名长度和内容(“google”)。
    • 02 63 6e: 查询的域名长度和内容(“cn”)。
    • 00: 域名结束标志。
    • 00 01: 查询类型为A记录。
    • 00 01: 查询类别为Internet类别。

以下是一些常见的 DNS 查询类型 (QTYPE) 和查询类别 (QCLASS) 的值:

查询类型 (QTYPE):

  • 00 01: A 记录 (Address Record) - 将域名映射到 IPv4 地址。
  • 00 02: NS 记录 (Name Server Record) - 指定域名服务器负责特定区域的权威信息。
  • 00 05: CNAME 记录 (Canonical Name Record) - 提供域名的规范别名。
  • 00 0C: PTR 记录 (Pointer Record) - 用于反向 DNS 查询,将 IP 地址映射到域名。
  • 00 0F: MX 记录 (Mail Exchange Record) - 指定邮件服务器的优先级和域名。

查询类别 (QCLASS):

  • 00 01: Internet 类别 - 在 Internet 上查询域名与 IP 地址之间的关系。
  • 00 02: CSNET 类别 - 在 CSNET (Computer Science Network) 上进行查询。
  • 00 03: CHAOS 类别 - 在 CHAOS 网络上进行查询。
  • 00 04: HESIOD 类别 - 在 HESIOD 系统上进行查询。

这只是一小部分可能的查询类型和查询类别,DNS 协议支持许多其他类型和类别,每个用于不同的目的。上述是一些最常见的用法。

因此,这个数据包是一个从源IP地址(172.21.4.172)发送到目标IP地址(172.21.1.245)的DNS查询请求,查询的域名是"www.google.cn",查询类型为A记录。


2. DNS应答报文

00 17 a4 1a b2 e0 00 19 56 6e 19 bf 08 00 45 00
00 78 48 af 00 00 7d 11 8b 9e ac 15 01 f9 ac 15
0f 04 00 35 04 a9 00 64 75 db 3e 3a 81 80 00 01
00 03 00 00 00 00 03 77 77 77 06 67 6f 6f 67 6c
65 02 63 6e 00 00 01 00 01 c0 0c 00 05 00 01 00
00 05 42 00 11 02 63 6e 01 6c 06 67 6f 6f 67 6c
65 03 63 6f 6d 00 c0 2b 00 01 00 01 00 00 00 5f
00 04 cb d0 21 65 c0 2b 00 01 00 01 00 00 00

这是一个DNS应答报文的示例,我们将其分成多行进行解析:

Ethernet帧头和IPv4报文头

  • 00 17 a4 1a b2 e0: 源MAC地址。
  • 00 19 56 6e 19 bf: 目标MAC地址。
  • 08 00: 以太网类型字段,表示上层协议是IPv4。
  • 45 00: IPv4报文头,包括版本、首部长度、服务类型等信息。
  • 00 78: 总长度字段,表示IPv4报文总长度为120字节。
  • 48 af: 标识字段。
  • 00 00: 标志字段。
  • 7d 11: 生存时间(TTL)和协议字段,表示UDP协议。
  • 8b 9e: IPv4首部校验和。
  • ac 15 01 f9: 源IP地址,表示 172.21.1.249
  • ac 15 0f 04: 目标IP地址,表示 172.21.15.4

UDP报文头

  • 00 35: 源端口号(53)。
  • 04 a9: 目标端口号(1193)。
  • 00 64: 长度字段,表示UDP报文总长度为100字节。
  • 75 db: 校验和字段。

DNS报文头

  • 3e 3a: 标识符字段。
  • 81 80: 标志字段,表示这是一个标准查询,期望标准响应。
  • 00 01: 问题数,表示有一个问题。
  • 00 03: 回答数,表示有三个回答。
  • 00 00: 权威记录数。
  • 00 00: 附加记录数。

查询部分

  • 03 77 77 77: 域名 www。03表示的是后面有3个字符
  • 06 67 6f 6f 67 6c 65: 域名 google。06表示的是后面有6个字符
  • 02 63 6e: 域名 cn。02表示的是后面有2个字符
  • 00: 结束标志。
  • 00 01: 查询类型为A记录。
  • 00 01: 查询类别为Internet。

应答部分

在这里插入图片描述

应答部分1

  • c0 0c: 指向查询部分的指针。(DNS报文起始位置开始)
  • 00 05: 类型(Type)为CNAME记录。
  • 00 01: 类别(Class)为Internet。
  • 00 00 05 42: 生存时间(TTL)为1346。
  • 00 11: 数据长度为17。
  • 02 63 6e: 域名 cn
  • 01 6c: 域名l
  • 06 67 6f 6f 67 6c 65: 域名 google
  • 03 63 6f 6d: 域名 com

应答部分2

  • c0 2b: 指向查询部分的指针。(DNS报文起始位置开始)
  • 00 01: 类型(Type)为A记录。
  • 00 01: 类别(Class)为Internet。
  • 00 00 00 5f: 生存时间(TTL)为95。
  • 00 04: 数据长度为4。
  • cb d0 21 65: IPv4地址 203.208.33.101

应答部分3

  • 与应答部分2类似,提供了另一个IPv4地址 203.208.33.100

这个数据包是一个DNS查询,查询域名 www.google.cn 的A记录。应答部分提供了两个IPv4地址和一个CNAME记录。

在 DNS协议中,当一个域名的回答部分是别名(CNAME)类型时,它可能被压缩。这是通过指针(Pointer)实现的。指针是一个指向报文中先前出现的相同域名的指针。

在进行域名查询时,如果发现回答部分是一个别名,你可以按照以下步骤来处理别名压缩:
如果你在解析 DNS回答时遇到一个指针,需要按照指针的值重新定位到先前出现的相同域名的位置。指针的格式是高两位为11,后面14位是指向的位置。

在DNS响应报文中,应答部分包含了关于查询的响应信息。以下是typeclass字段的作用和相关参数的解释:

Type字段:

type字段指定了资源记录的类型。一些常见的type值包括:

  • A (IPv4地址): 指定IPv4地址。
  • AAAA (IPv6地址): 指定IPv6地址。
  • MX (邮件交换): 指定邮件交换服务器的信息。
  • CNAME (规范名): 指定规范名,即别名。
  • PTR (指针): 用于反向DNS查询。
  • NS (域名服务器): 指定区域的授权域名服务器。
  • SOA (授权信息起始): 包含有关区域的授权信息。
  • TXT (文本): 包含文本信息,通常用于DNS记录中的注释等。

Class字段:

class字段指定了资源记录的类别。一些常见的class值包括:

  • IN (Internet): 表示Internet数据。
  • CS (CSNET): 早期的计算机通信网络。
  • CH (CHAOS): 用于查询服务器状态。
  • HS (Hesiod): Hesiod分布式数据库系统。

一般而言,对于大多数情况,typeA(IPv4地址)或AAAA(IPv6地址),而classIN(Internet)是最常见的组合。例如,如果查询的是IPv4地址,响应中的应答部分的type字段将为A,而class字段将为IN

请注意,不同的资源记录类型和类别具有不同的含义和使用场景。在实际使用中,具体的值可能会根据应用和协议而有所不同。要详细了解每个类型和类别的含义,建议查阅相关的DNS规范文档。


c0 0c 为什么是个指针?即
c0 0c 是 DNS 报文中的一个指针。在 DNS 报文中,域名可以通过使用指针
来减少冗余。指针的格式是两个字节,其中前两个比特是 11,表示这是一个指针。其余的14个比特用于指示指向的位置。

在这个例子中,c0 0c 中的 c 表示 110c 表示指针指向报文中偏移量为 0c 的位置。因此,它指向了 DNS
报文中先前的位置,以实现对之前域名的重用,减少冗余。

具体解释如下:

  • c 的二进制表示是 1100,其中前两位是 11,表示这是一个指针。
  • 0c 的二进制表示是 00001100,表示偏移量为 0c

将这两者组合在一起,就形成了指向先前位置的指针。这种机制有助于减少 DNS 报文的大小,特别是当多个域名共享相同的部分时。

这个域名指针是从哪开始偏移? DNS 报文中的指针指向的位置是相对于整个 DNS 报文的起始位置的偏移量(包括DNS报文头部)。在 DNS
报文中,指针使用两个字节表示,其中前两位是 11,表示这是一个指针。其余的 14 位用于指示相对于 DNS 报文起始位置的偏移量。

在你的例子中,c0 0c 中的 0c 是指针的偏移量,表示指针指向报文中偏移量为 0c 的位置。因此,偏移量 0c 将从
DNS 报文的起始位置开始计算。

  • 17
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值