DNS协议详解及报文格式分析

2023-05-16

DNS协议详解及报文格式分析

Posted on 2017-06-18 by Jocent No Comments ↓
目录
  • 一. DNS协议理论知识
    • 1.1. 域名结构
    • 1.2. 域名服务器
    • 1.3. 域名解析过程
  • 二. DNS协议报文格式
    • 2.1 头部
    • 2.2 正文
  • 三. Wireshark分析DNS协议
    • 3.1 请求报文
    • 3.2 响应报文

解BUG的过程中碰到了DNS相关的内容,折腾网站和域名邮箱时也对DNS做了一些配置,发现对一些细节有点记不清晰了,因此很有必要重新温习一下这方面的知识。学过网络的应该记得现代计算机通信的基石是TCP/IP协议,计算机A想要与计算机B进行通信,首先就必须要知道计算机B的IP地址,就像打电话一样,你给别人打电话首先必须得知道别人的电话号码吧,电话号码都不知道还搞个毛。但是问题来了,让人们去记忆这又臭又长的IP地址或是电话号码,无疑是不人道的,当然,这个小问题也并莫有难倒勤劳勇敢的人民群众。很快就发明了通讯录这个东西,用于将人名与电话号码联系起来。在计算机领域也出现了DNS(Domain Name System),即域名系统,用于将域名解析成对应的IP地址。本文将介绍DNS协议的基本理论及其报文格式,最后给出了用Wireshark抓取DNS报文的记录。如果需要了解更为详细的内容,请参考 RFC1034 和 RFC1035。


回到顶部

一. DNS协议理论知识

1.1. 域名结构

域名系统并不像电话号码通讯录那么简单,通讯录主要是单个个体在使用,同一个名字出现在不同个体的通讯录里并不会出现问题,但域名是群体中所有人都在用的,必须要保持唯一性。为了达到唯一性的目的,因特网在命名的时候采用了层次结构的命名方法。每一个域名(本文只讨论英文域名)都是一个标号序列(labels),用字母(A-Z,a-z,大小写等价)、数字(0-9)和连接符(-)组成,标号序列总长度不能超过255个字符,它由点号分割成一个个的标号(label),每个标号应该在63个字符之内,每个标号都可以看成一个层次的域名。级别最低的域名写在左边,级别最高的域名写在右边。域名服务主要是基于UDP实现的,服务器的端口号为53。

比如:本网站的域名 jocent.me,由点号分割成了两个域名jocentme,其中 me是顶级域名(TLD,Top-Level Domain), jocent是二级域名(SLD,Second Level Domain)。关于域名的层次结构,请看下面的示意图。


注意:最开始的域名最后都是带了点号的,比如 jocent.me 搁以前的话应该是 jocent.me. ,最后面的点号表示根域名服务器,后来发现所有的网址都要加上最后的点,就简化了写法,干脆所有的都不加,但是你在网址后面加上点号也是可以正常解析的。

1.2. 域名服务器

有域名结构还不行,还需要有一个东西去解析域名,手机通讯录是由通讯录软件解析的,域名需要由遍及全世界的域名服务器去解析,域名服务器实际上就是装有域名系统的主机。由高向低进行层次划分,可分为以下几大类:

  • 根域名服务器:    最高层次的域名服务器,也是最重要的域名服务器,本地域名服务器如果解析不了域名就会向根域名服务器求助。全球共有13个不同IP地址的根域名服务器,它们的名称用一个英文字母命名,从a一直到m。这些服务器由各种组织控制,并由 ICANN(互联网名称和数字地址分配公司)授权,由于每分钟都要解析的名称数量多得令人难以置信,所以实际上每个根服务器都有镜像服务器,每个根服务器与它的镜像服务器共享同一个 IP 地址,中国大陆地区内只有6组根服务器镜像(F,I(3台),J,L)。当你对某个根服务器发出请求时,请求会被路由到该根服务器离你最近的镜像服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和地址,如果向根服务器发出对 “jocent.me” 的请求,则根服务器是不能在它的记录文件中找到与 “jocent.me” 匹配的记录。但是它会找到 “me” 的顶级域名记录,并把负责 “me” 地址的顶级域名服务器的地址发回给请求者。
  • 顶级域名服务器:负责管理在该顶级域名服务器下注册的二级域名。当根域名服务器告诉查询者顶级域名服务器地址时,查询者紧接着就会到顶级域名服务器进行查询。比如还是查询"jocent.me",根域名服务器已经告诉了查询者“me”顶级域名服务器的地址,“me”顶级域名服务器会找到 “jocent.me”的域名服务器的记录,域名服务器检查其区域文件,并发现它有与 “jocent.me” 相关联的区域文件。在此文件的内部,有该主机的记录。此记录说明此主机所在的 IP 地址,并向请求者返回最终答案。
  • 权限域名服务器:负责一个区的域名解析工作
  • 本地域名服务器:当一个主机发出DNS查询请求的时候,这个查询请求首先就是发给本地域名服务器的。

1.3. 域名解析过程

域名解析总体可分为两大步骤,第一个步骤是本机向本地域名服务器发出一个DNS请求报文,报文里携带需要查询的域名;第二个步骤是本地域名服务器向本机回应一个DNS响应报文,里面包含域名对应的IP地址。从下面对jocent.me进行域名解析的报文中可明显看出这两大步骤。注意:第二大步骤中采用的是迭代查询,其实是包含了很多小步骤的,详情见下面的流程分析。

其具体的流程可描述如下:

  1. 主机10.74.36.90先向本地域名服务器10.74.1.11进行递归查询
  2. 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
  3. 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器 dns.me的IP地址
  4. 本地域名服务器向顶级域名服务器 dns.me进行查询
  5. 顶级域名服务器me告诉本地域名服务器,下一步查询权限服务器dns.jocent.me 的IP地址
  6. 本地域名服务器向权限服务器 dns.jocent.me进行查询
  7. 权限服务器 dns.jocent.me告诉本地域名服务器所查询的主机的IP地址
  8. 本地域名服务器最后把查询结果告诉 10.74.36.90

其中有两个概念递归查询和迭代查询,其实在整个描述的过程中已经体现的很明显,这里再说明一下:

  • 递归查询:本机向本地域名服务器发出一次查询请求,就静待最终的结果。如果本地域名服务器无法解析,自己会以DNS客户机的身份向其它域名服务器查询,直到得到最终的IP地址告诉本机
  • 迭代查询:本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它再去查,每次它都是以客户机的身份去各个服务器查询
回到顶部

二. DNS协议报文格式

2.1 头部

  1. 会话标识(2字节):是DNS报文的ID标识,对于请求报文和其对应的应答报文,这个字段是相同的,通过它可以区分DNS应答报文是哪个请求的响应
  2. 标志(2字节):
    QR(1bit)查询/响应标志,0为查询,1为响应
    opcode(4bit)0表示标准查询,1表示反向查询,2表示服务器状态请求
    AA(1bit)表示授权回答
    TC(1bit)表示可截断的
    RD(1bit)表示期望递归
    RA(1bit)表示可用递归
    rcode(4bit)表示返回码,0表示没有差错,3表示名字差错,2表示服务器错误(Server Failure)
  3. 数量字段(总共8字节):Questions、Answer RRs、Authority RRs、Additional RRs 各自表示后面的四个区域的数目。Questions表示查询问题区域节的数量,Answers表示回答区域的数量,Authoritative namesversers表示授权区域的数量,Additional recoreds表示附加区域的数量

 

2.2 正文

  1. Queries区域1.1 查询名:长度不固定,且不使用填充字节,一般该字段表示的就是需要查询的域名(如果是反向查询,则为IP,反向查询即由IP地址反查域名),一般的格式如下图所示。1.2 查询类型:
    类型助记符说明
    1A由域名获得IPv4地址
    2NS查询域名服务器
    5CNAME查询规范名称
    6SOA开始授权
    11WKS熟知服务
    12PTR把IP地址转换成域名
    13HINFO主机信息
    15MX邮件交换
    28AAAA由域名获得IPv6地址
    252AXFR传送整个区的请求
    255ANY对所有记录的请求

    这里给一个域名,可用来模拟DNS的查询类型,可以选择不同的类型,比如A,PTR等玩一下, https://www.nslookuptool.com/chs/       
    1.3 查询类:通常为1,表明是Internet数据

  2. 资源记录(RR)区域(包括回答区域,授权区域和附加区域)

该区域有三个,但格式都是一样的。这三个区域分别是:回答区域,授权区域和附加区域

2.1. 域名(2字节或不定长):它的格式和Queries区域的查询名字字段是一样的。有一点不同就是,当报文中域名重复出现的时候,该字段使用2个字节的偏移指针来表示。比如,在资源记录中,域名通常是查询问题部分的域名的重复,因此用2字节的指针来表示,具体格式是最前面的两个高位是 11,用于识别指针。其余的14位从DNS报文的开始处计数(从0开始),指出该报文中的相应字节数。一个典型的例子,C00C(1100000000001100,12正好是头部的长度,其正好指向Queries区域的查询名字字段)。

2.2 查询类型:表明资源纪录的类型,见1.2节的查询类型表格所示 

2.3 查询类:对于Internet信息,总是IN

2.4 生存时间(TTL):以秒为单位,表示的是资源记录的生命周期,一般用于当地址解析程序取出资源记录后决定保存及使用缓存数据的时间,它同时也可以表明该资源记录的稳定程度,极为稳定的信息会被分配一个很大的值(比如86400,这是一天的秒数)。

2.5. 资源数据:该字段是一个可变长字段,表示按照查询段的要求返回的相关资源记录的数据。可以是Address(表明查询报文想要的回应是一个IP地址)或者CNAME(表明查询报文想要的回应是一个规范主机名)等。

回到顶部

三. Wireshark分析DNS协议

下面给出wireshark抓包的记录,感兴趣的可以根据上面介绍的协议报文格式手动解析一下,相信会有很大收获。

3.1 请求报文

3.2 响应报文

 

DNS相关的命令小贴士:

  • Windows环境下清空DNS缓存的命令是 ipconfig/flushdns 也可以通过重启DNS client 和 DHCP client 两项服务清空DNS缓存
  • Windows环境下可以用命令 ipconfig /displaydns  来查看DNS缓存的内容
  • nslookup 命令可以用来查看域名对应的IP地址,比如 nslookup jocent.me

本文撰写过程中参考了以下几篇博文的内容,现列出链接如下:

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

DNS协议详解及报文格式分析 的相关文章

  • 从零开始搭二维激光SLAM --- 栅格地图的构建

    上周搬家 导致这篇文章更新的慢了点 之前的文章我们都是通过scan to scan的方式进行位姿变换的计算 接下来的文章将带领大家体验scan to map的计算位姿变换的方式 首先 来简要介绍一下什么是map 1 地图与占用栅格地图 1
  • 从零开始搭二维激光SLAM --- 基于gtsam的后端优化的代码实现

    上一篇文章我们分析了如何使用ceres进行位姿图的优化 这篇文章来讲一下如何使用gtsam进行位姿图的优化 1 gtsam简介 gtsam是最近几年火起来的一个优化库 GTSAM xff08 Georgia Tech Smoothing a
  • 从零开始学定位 --- kaist数据集体验

    1 Kaist数据集简介 选择数据集选择了好几天 xff0c 最终选择了kaist数据集 xff0c 这个数据集中有 轮速计 xff0c imu gps 16线雷达 xff0c 这些传感器满足了我认为多传感器融合定位的需要 简要介绍一下Ka
  • 从零开始学定位 --- 使用kaist数据集进行LIO-SAM建图

    之前的文章只是将数据的雷达在rviz中进行可视化了 xff0c 并没有实际用起来 这篇文章将使用Kaist Urban08 数据使用LIO SAM进行三维点云地图的构建 1 clone 工程 仓库的地址是 https github com
  • 我的2048天创作纪念日

    距离发布第一篇博客竟然已经2048天了 不知不觉都已经这么长时间了啊 xff0c 真是岁月不饶人啊 随想 5年的时间 xff0c 这5年经历了硕士时期 xff0c 经历了毕业之后的第一份工作 xff0c 第二份工作 xff0c 第三份工作
  • 基于粒子滤波的SLAM(GMapping)算法分析

    本文是 Improved Techniques for Grid Mapping with Rao Blackwellized Particle Filters 的大致翻译 xff0c 难免有不通顺与错误的地方 xff0c 如有错误请指出
  • tf之static_transform_publisher

    tf xff1a transform xff0c ROS中管理3D坐标系变换的工具 只要告诉tf两个相关联坐标系的坐标变换信息 xff0c tf会帮你一直记录这个两个坐标系的坐标变换 xff0c 即使两个坐标系处于运动中 1 tf的命令行用
  • sensor_msgs/PointCloud2 Message

    sensor msgs PointCloud2 Message File sensor msgs PointCloud2 msg Raw Message Definition This message holds a collection
  • 安卓平台及windows平台上基于Gazebo仿真器的px4遥控控制

    这里写自定义目录标题 安卓平台及windows平台上基于Gazebo仿真器的px4遥控控制数据链路描述安卓平台简介安卓平台四旋翼无人机控制安卓平台固定翼无人机控制安卓平台无人车控制安卓遥控器实物控制 桌面平台遥控图形界面桌面平台四旋翼无人机
  • sitl_gazebo,px4模型matlab接口分析,gazebo与matlab联合仿真

    最近在使用matlab建立四旋翼控制程序 xff0c 奈何没有好的可视化仿真软件 xff0c 便想起px4的gazebo仿真环境 xff0c 使用matlab连接px4底层通信模型 xff0c 实现matlab在软件层面的可视化仿真 Gaz
  • 【体验】ESP32-CAM可能是最便宜的“监控”方案,ESP32-CAM程序下载调试

    生活新装备 NEW EQUIPMENT FOR LIFE 抱着试一试的心里 xff0c 买了ESP32 CAM xff0c xff08 你别说 还真对得起 我和RMB xff0c 看下边 xff0c 看下边 xff09 xff1a 当年玩S
  • 【树莓派】树莓派SD卡系统镜像系统备份方法

    微信关注 DLGG创客DIY 设为 星标 xff0c 重磅干货 xff0c 第一时间送达 先感谢漂移菌的技术支持 耐心 细致的帮我解决了一个困扰我很久的问题 树莓派系统备份问题 问题的提出 xff1a 树莓派各种版本系统 xff0c 各种软
  • 【笔记】可能是唯一能让天猫精灵方糖播放本地音乐的智能方案

    微信关注公众号 DLGG创客DIY 设为 星标 xff0c 重磅干货 xff0c 第一时间送达 前言 如上图所示 xff0c 我家也有个同款的天猫精灵方糖 xff0c 买了 xff08 好像是个奖品 xff09 好几年了 xff0c 利用率
  • C++做题网站

    今天小编带大家介绍一下我平时用的C 43 43 做题网站 1 洛谷 平时我发题解一般是选自这个网站 传送链接 xff1a 洛谷 2 黑猫OJ 里面的题很好 传送链接 xff1a 黑猫OJ 3 图灵编程OJ 我最开始用的做题网站 传送链接 x
  • ROS系列:第三章(二)

    系列文章目录 第一章 ROS概述与环境搭建 第二章 ROS通信机制 第三章 ROS通信机制进阶 第四章 ROS运行管理 第五章 ROS常用组件 第六章 机器人系统仿真 第七章 机器人系统仿真 第八章 机器人系统仿真 第九章 机器人系统仿真
  • 手把手系列--STM32H750移植FreeRTOS(二)--优化编译速度

    一 目的 在上一篇 手把手系列 STM32H750移植FreeRTOS 我们已经实现了在ArtPi开发板上使用FreeRTOS 在编译阶段我们发现整个编译过程特别慢 xff0c 那么如何优化编译速度呢 xff1f 本篇的主要目的就是优化整个
  • FreeRTOS如何判断当前上下文是在中断还是在线程环境中

    一 目的 很多小伙伴在使用FreeRTOS API时 xff0c 肯定看到过类似这样的接口 xff1a xSemaphoreGiveFromISR SemaphoreHandle t xSemaphore signed BaseType t
  • 手把手系列--STM32H750移植FreeRTOS(三)--获取CPU占用

    一 目的 在之前的博文中我们移植验证了STM32H750XBH6上运行FreeRTOS系统 xff0c 在实际项目开发中我们经常会遇到获取系统实时运行负载的情况 xff0c 进而对系统进行优化 手把手系列 STM32H750移植FreeRT
  • 【资料分享】工程师必备嵌入式资料合集

    对于许多电子工程师来说 xff0c 各种电路资料 xff0c 学习资料 xff0c 新新技术资料等等 xff0c 都有越多越好的 本篇帖子就为大家整理了一些比较受工程师欢迎的一些电路资料 如果你有心动的话 xff0c 不妨就来搜集一波吧 x
  • HTML网页Javascript跳转代码

    有时候咱们不希望在该页面出现一条长长的链接 xff0c 那就可以采用跳转页了 xff0c 以下是代码 lt html gt lt head gt lt meta http equiv 61 34 Content Type 34 conten

随机推荐

  • 一起尝试写一个自己的小软件

    一起尝试写一个自己的小软件 xff0c 有时候写个小软件 xff0c 会耗费一两个小时 xff0c 有时候耗费几个小时 xff0c 甚至几天 xff0c 但是在写小软件的过程中 xff0c 咱们都是沉浸在软件写好后的美妙体验中 xff0c
  • 网页被挂马了怎么办呢

    首先 xff0c 咱们了解一下网页挂马是什么意思 xff1a 网页挂马指的是把一个木马程序上传到一个网站里面然后用木马生成器生一个网马 xff0c 再上到空间里面 xff01 再加代码使得木马在打开网页时运行 xff01 接下来讲怎么办 如
  • 公司里最看重的是发展机会

    公司里最看重的是发展机会 xff0c 而不是现在的工资 xff0c 这是很多老板都喜欢说的 说的多了 xff0c 咱么那就相信了 虽然说 xff0c 很大程度上 xff0c 今后的日子怎么过 xff0c 取决于现在的想法和奋斗 xff0c
  • 处在八零末期,九零早期,缝隙中的人

    处在八零末期 xff0c 九零早期 xff0c 缝隙中的人 思想既可以与八零年代的人相似 xff0c 又有九零年代那种无法脱掉的稚气 这就是89年 90年出生的人 的特性
  • 马上就下班回家了,让我再写一篇

    马上就下班回家了 xff0c 让我再写一篇 xff0c 写博客让我突然静下来了 同时都纷纷离开了 快了 xff0c 快了 xff0c 马上写好了
  • 我知道自己的未来需要什么

    我知道自己的未来需要什么 xff0c 现在的路就在眼前 xff0c 争取一把 xff0c 奋斗一段时间 xff0c 未来光明坦途正在招手 下班了 xff0c 下次再来
  • 走马观花之《视觉SLAM十四讲》

    1 视觉SLAM 系统概述 SLAM 是Simultaneous Localization and Mapping 的缩写 xff0c 中文译作 同时定位与地图构建 它是指搭载特定传感器的主体 xff0c 在没有环境先验信息的情况下 xff
  • 硬件工程师必会模块之MOS管构成的基本门逻辑电路—看芯片手册框图必备技能

    本文你可以获得什么 xff1f MOS管构成的缓冲器Buffer和漏极开路们OD门是数字电路非常重要的概念 xff0c 怎么构成的 xff1b 反相器 xff0c 线与逻辑怎么玩 xff0c 又怎么用呢 xff1f 根据原理图 xff0c
  • 关于信号量的作用范围

    最近在搞信号量的时候产生了怀疑 xff0c 信号量的作用范围和信号量在任务的位置时候有关系呢 xff1f 答案是有的 xff0c 其实信号量的作用范围是指的从信号量开始到程序的跳转点为止 xff0c 比如一个任务中 xff0c 把信号量放在
  • UNIX 环境高级编程之我见

    UNIX环境高级编程 xff08 第二版 xff09 xff08 人民邮电出版社 xff09 美 W Richard Stevens amp Stephen A Rago 著 本书的主要结构分为以下几个部分 xff1a xff08 1 xf
  • xShell连接ubuntu不成功

    操作环境 xff1a xShell6 43 vm15 43 ubuntu18 04 xShell中以root身份连接虚拟机中的ubuntu时 xff0c 连接不上 xff0c 见下图 xff1a 密码输入的也是对的 xff0c 也能够双向p
  • mac brew install

    brew cask install myprogram base darren 64 Darren 2 project brew cask install docker Error Unknown command cask brew ins
  • mac/linux 系统批量计算文件md5命令

    find type f print0 xargs 0 md5
  • 链表-设计链表

    leetcode 707 设计链表 注意 xff1a 面向对象的思想 这是创建一个自己的链表 xff0c dummyhead和 size初始化都在构造函数中 xff0c 同时自己的链表类也需要定义自己的节点 struct LinkNode链
  • KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案

    KVM虚拟机使用桥接方式时和宿主机无法通信的解决方案 应用场景 虚拟机客户机安装完成后 xff0c 需要为其设置网络接口 xff0c 以便和主机网络 xff0c 客户机之间的网络通信 事实上 xff0c 如果要在安装时使用网络通信 xff0
  • android 电池充电状态记录

    摘抄源码记录下 http androidxref com 9 0 0 r3 xref frameworks native include batteryservice BatteryServiceConstants h This file
  • python 输入三个变量,然后按小到大输出(解析)

    python 实例解析 xff08 1 xff09 vim 2 python py x 61 int input 39 please input x 39 y 61 int input 39 please input y 39 z 61 i
  • Linux系统调用Hook姿势总结

    http www cnblogs com LittleHann p 3854977 html 主题 Linux 相关学习资料 http xiaonieblog com post 61 121 http hbprotoss github io
  • 利用WireShark进行DNS协议分析

    一 准备工作 系统是Windows 8 1Pro 分析工具是WireShark1 10 8 Stable Version 使用系统Ping命令发送ICMP报文 二 开始工作 打开CMD exe键入 ping www oschina net
  • DNS协议详解及报文格式分析

    DNS协议详解及报文格式分析 Posted on 2017 06 18 by Jocent No Comments 目录 一 DNS协议理论知识 1 1 域名结构1 2 域名服务器1 3 域名解析过程 二 DNS协议报文格式 2 1 头部2