通过Wireshark抓包分析谈谈DNS域名解析的那些事儿

 

原创/朱季谦

本文主要想通过动手实际分析一下是如何通过DNS服务器来解析域名获取对应IP地址的,毕竟,纸上得来终觉浅,绝知此事要躬行。

一、域名与IP地址

当在浏览器上敲下“www.baidu.com”时,一键回车,很快,浏览器上就会刷新出熟悉的百度搜索页面。以前刚接触网络时,总以为这个过程是通过域名www.baidu.com来访问远程服务器,其实不然,本质上,还是通过IP去远程访问服务器获取资源。

这时,聪明的小伙伴就会出现一个疑问,为啥不直接通过域名去寻找到相应的服务器主机呢?

其实,若要实现通过域名的方式去寻找服务器主机,也不是不行,但没这个必要。

先来对比一下域名方式与IP地址方式两者的最关键差异在哪里,就知道为啥没这个必要了。

我们日常工作接触的IPv4地址一般都是以十进制的方式表示,例如,192.168.200.111,但在计算机当中,它其实是以二进制形式存在,192.168.200.111的二进制为1100 0000 1010 1000 1100 1000 0110 1111,总共32位,也就是32比特。众所周知,1个字节占了8比特,那么就意味着,一个32比特的IP地址长度也就4个字节。

在网络传输过程中,4个字节的长度,可以说,微不足道,但,若换成域名呢?

目前,域名最大长度可达:63个字符,每个char字符就占了2字节,63字符占了126字节,可见,若要用域名当成传输的地址,是多么耗性能,但若用IP地址就不一样了,32位也就只占4字节。

事实上,在浏览器上通过IP同样可以访问到对应域名的网址,但IP地址是一长串数字,难以记住,更难以理解这一堆数字代表了啥,但域名就不一样了,像百度的域名www.baidu.com,很直观就知道,这是访问百度的网址。

按照百度百科的说法,设计域名的作用,就是为了让用户更好理解。

当在浏览器上敲下“www.baidu.com”,在这个过程当中,会做一步域名解析成IP地址的操作,这里就涉及到一个叫做DNS的概念。DNS,全称Domain Name System,即域名系统,它提供的作用是将域名和IP地址相互映射。最通俗的理解,它就像是Java里key-value形式的Map,key是域名,value是对应映射的IP地址,通过map.get(域名),可得到域名对应的IP地址。

这里值得多提一点是,与DNS相反的另一个相似概念,是ARP(Address Resolution Protocol,地址解析协议),它是根据已知的IP地址,可获得MAC地址,当然,MAC这块已是数据链路层的知识,DNS则是应用层的东西了。

二、域名解析IP的步骤

域名解析出其映射的IP地址,主要有以下几个步骤:

首先,会根据域名从浏览器缓存当中获取,若能获取到,直接返回对应的IP地址;若获取失败,会尝试获取操作系统本地的域名解析系统,即在hosts文件检查是否有对应的域名映射,若能找到,直接获取其映射的IP地址返回。其中,关于这一步,作为程序员,可能多少都做过相关操作。例如,网上有一些关于Windows系统如何加快访问Github网站的教程,其中有一个方式,就是将Github的域名与对应的IP地址,添加到Windows的C:\Windows\System32\drivers\etc\hosts文件当中,随后再浏览Github,发现速度确实快了不少。这是因为,直接本地DNS解析出IP地址,可以减少远程网络方式去DNS服务器上获取域名对应的IP地址操作,也就意味着,域名解析IP速度将更快。

image

在hosts文件里存储的域名与IP地址映射,一般都是针对IP比较稳定且经常用的,例如工作当中的一些线上开发环境或者测试环境等域名,如果是IP变化比较频繁或者是根本就不知道IP是啥的,这类情况就无法通过hosts文件进行配置获取,只能通过网络访问DNS服务器去获取。

首先,会先去本地区域的DNS服务器找,我们可以在系统的网络配置上查看,究竟哪个是属于所在网络的本地区域DNS服务器,在命令行提示窗口输入,ipconfig /all,然后按回车键,可以找到“DNS服务器”一栏——

image

例如,我所在网络的DNS服务器IP是192.168.31.1,当浏览器访问某个域名时,就会向这个DNS服务器发送查询消息。

可以使用Wireshark抓包软件验证一下,还是以www.baidu.com域名来做实验,我们先看一下该域名对应的IP是啥,直接在命令窗口ping一下,就可以知道了,其IPv4地址是14.215.177.38

image

三、通过Wireshark分析域名解析网络传输

这时,先打开Wireshark抓包软件。

接着,在谷歌浏览器上输入www.baidu.com,回车,可以看到,本机IP会向本区域DNS服务器192.168.31.1发送了一个DNS协议的消息,该消息包含了域名www.baidu.com,A,还有一个0x1515这几个数据,然后,DNS服务器response返回了 以下信息:response 0x1515 A www.baidu.com CNAME www.a.shifen.com A 14.215.177.38 A 14.215.177.39 ......
 

image


这些信息当中,正好包含了域名www.baidu.com映射的IP地址(不止一个),其中就有一个是前面ping返回的14.215.177.38。

理论上,若在最近的DNS服务器上,无法解析到域名对应的IP地址时,那么最近的DNS服务器就会类似充当一个中介角色,帮助客户端去其他DNS服务器寻找,看看哪台DNS服务器上可以找到该域名对应的IP。同时,需要理解一个知识点是,任何一台DNS服务器,都存储了根域名的IP地址。在www.baidu.com域名这个案例当中,加入无法从192.168.31.1这条最近的DNS服务器上解析到对应IP地址时,该DNS服务器就会将客户端的查询请求发送给根域名服务器去询问www.baidu.com域名在哪里可以解析。根域名服务器不做解析,更像是一位指路人,告知去com域对应的DNS服务器查询。com域所在的DNS服务器同样无法解析,继续充当一位指路人,告知把请求转发去baidu.com所在的DNS服务器,层层转发下去,最后找的目标DNS服务器,解析出域名对应的IP地址,然后返回给客户端,这时,客户端就可以通过IP地址获取到相应的服务器资源了。

在《网络是怎样连接的》一书当中,有一个关于DNS服务器解析流程的插图,觉得比较直观地表达出从最近DNS域名如何转发到目标DNS域名的流程,这里直接引用了——

image

当然,这只是理论,实际情况其实还是存在一些区别的。

再回到刚刚Wireshark抓包获取的截图上分析,可以看到一点是,客户端发送给DNS服务器的消息,不止域名这一个信息,还包括了A等书,那么,问题就来了,DNS协议的查询请求当中,都包含了哪些参数呢?

在《网络是怎样连接的》一书当中,有相关一些介绍,客户端发送给DNS服务器的查询消息包含了3种信息:

  • 域名:服务器的域名名称,例如本文中提到的www.baidu.com这样的域名;
  • Class:Class是用来识别网络的信息,但目前除了互联网已经没有其他网络了,因此,Class只有一个IN值;
  • type类型:表示该域名映射对应的类型,当类型为A,表示DNS服务器上域名映射的是IP地址;当类似是MX时,则表示映射的是邮件服务地址;

针对以上说明,我们可以具体通过Wireshark被选中数据包详细信息栏来分析,通过DNS服务器解析www.baidu.com过程当中,客户端都发送了哪些查询信息。

image

可见,该DNS查询信息的域名为www.baidu.com,Class为IN,type类型为A,即代表映射的是IP地址。

通过本文,主要是分享一些自己对DNS解析的学习与理解,同时,通过实际Wireshark抓包方式,来深入分析下本机如何发送DNS协议去DNS服务器上获取访问域名对应的IP地址,希望也能让您有一些收获。

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

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

相关文章

Linux远程登陆协议ssh

目录 一、SSH服务 1. ssh基础 2. 原理 3. 服务端配置 3.1 常用配置项 3.2 具体操作 3.2.1 修改默认端口号 3.2.2 禁止root用户登录 3.2.3 白名单列表 3.2.4 黑名单列表 3.2.5 使用秘钥对及免交互验证登录 3.2.6 免交互式登录 一、SSH服务 1. ssh基础 SSH&…

VQE音频处理流程

VQE 上行VQE,主要针对MIC采集部分的音频增强 下行VQE,主要针对SPK播放部分的音频增强 附关键词解释 RES RES 模块为重采样(Resampler)模块。当AI上行或AO下行通路中开启VQE 各功能 模块时,在处理前后各存在一次重采样…

c语言实现b树

概述:B 树(B-tree)是一种自平衡的搜索树数据结构,广泛应用于数据库和文件系统等领域。它的设计旨在提供一种高效的插入、删除和查找操作,同时保持树的平衡,确保各个节点的深度相差不大。 B 树的特点包括&a…

怎么使用好爬虫IP代理?爬虫代理IP有哪些使用技巧?

在互联网时代,爬虫技术被广泛应用于数据采集和处理。然而,在使用爬虫技术的过程中,经常会遇到IP被封禁的问题,这给数据采集工作带来了很大的困扰。因此,使用爬虫IP代理成为了解决这个问题的有效方法。本文将介绍如何使…

Java中泛型和Object类型 初级进阶教程(一)

在学习的过程中&#xff0c;常常看到某个类或者接口等中使用 List<T>, Test<T>&#xff0c;其中<T>的作用是什么呢&#xff1f; 1 在类中使用泛型 public class Box<T> {private T content;public void setContent(T content) {this.content conten…

深度学习与药物发现在健康衰老中的应用

深度学习是一种模拟人脑神经网络处理信息的方法&#xff0c;其已在语音、图像、自然语言等处理中发挥了巨大作用。但在健康衰老这一领域的应用中&#xff0c;它面临着很多挑战。 首先&#xff0c;健康衰老是一个复杂的生物学过程&#xff0c;涉及众多因素&#xff0c;如基因、…

Linux———top命令详解(狠狠爱住)

top 命令 是一个常用的系统性能监测工具&#xff0c;它可以实时显示系统中各个进程的状态和资源占用情况。 启动 top 命令&#xff1a; 直接在终端输入 top 命令即可启动。默认情况下&#xff0c;top 显示的是按照 CPU 使用率排序的进程列表。 功能键说明&#xff1a; h&…

【redis基础1】基础数据类型详解和应用案例

博客计划 &#xff0c;我们从redis开始&#xff0c;主要是因为这一块内容的重要性不亚于数据库&#xff0c;但是很多人往往对redis的问题感到陌生&#xff0c;所以我们先来研究一下。 本篇&#xff0c;我们先看一下redis的基础数据类型详解和应用案例。 1.redis概述 以mysql为…

文章测试测试

系列文章目录 提示&#xff1a;这里可以添加系列文章的所有文章的目录&#xff0c;目录需要自己手动添加 例如&#xff1a;第一章 Python 机器学习入门之pandas的使用 提示&#xff1a;写完文章后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目…

xtu oj 1340 wave

题目描述 一个n列的网格&#xff0c;从(0,0)网格点出发&#xff0c;波形存在平波(从(x,y)到(x1,y))&#xff0c;上升波(从(x,y)到(x1,y1))&#xff0c;下降波(从(x,y)到(x1,y−1))三种波形&#xff0c;请问从(0,0)出发&#xff0c;最终到达(n,0)的不同波形有多少种&#xff1f…

C++PythonC# 三语言OpenCV从零开发(1):环境配置

文章目录 前言课程选择环境配置PythonC#COpenCV官网下载新建C项目测试运行Csharp版Python版 gitee仓库总结 前言 由于老王我想转机器视觉方向的上位机行业&#xff0c;我就打算开始从零学OpenCV。但是目前OpenCV有两个官方语言&#xff0c;C和Pyhont。C# 有大佬做了对应的Open…

快速幂板子

快速幂是快速算 a 的 c 次幂 原理&#xff1a; 我们用分治思想是比一个一个乘快的 即比如我们求a的8次方 &#xff1a;a1*a1 a2 ,那么我们直接a2*a2 a4&#xff0c;a4*a4 a8 参数就是几次幂。返回值是对应参数的幂 &#xff08;这里对p取余了&#xff09;(一般也把a当参数…

vue 自定义网页图标 favicon.ico 和 网页标题

效果预览 1. 添加配置 vue.config.js 在 module.exports { 内添加 // 自定义网页图标pwa: {iconPaths: {favicon32: "./favicon.ico",favicon16: "./favicon.ico",appleTouchIcon: "./favicon.ico",maskIcon: "./favicon.ico",msTil…

Java进阶第一天

Java进阶第一天 文章目录 Java进阶第一天双列集合特点Map的常见APIMap集合的遍历方式 双列集合 特点 双列集合一次需要存一对数据,分别是键和值(键值对)键不能重复,值可以重复键和值一一对应 Map的常见API Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的…

memory泄露分析方法(java篇)

#memory泄露主要分为java和native 2种&#xff0c;本文主要介绍java# 测试每天从monkey中筛选出内存超标的app&#xff0c;提单流转到我 首先&#xff0c;辨别内存泄露类型&#xff08;java&#xff0c;还是native&#xff09; 从采到的dumpsys_meminfo_pid看java heap&…

【ROS2】使用C++实现简单的发布订阅方

1 构建自定义数据类型 1、自定义消息类型Student 1.1 创建base_interfaces_demo包 1.2 创建Student.msg文件 string name int32 age float64 height 1.2 在cmakeLists.txt中增加如下语句 #增加自定义消息类型的依赖 find_package(rosidl_default_generators REQUIRED) # 为…

C++ namespace高级用法

高级用法 C++中的命名空间(namespace)是一种用于组织代码的机制,它可以帮助避免命名冲突,并使代码更加清晰和易于维护。以下是C++命名空间的一些高级用法: 嵌套命名空间:命名空间可以嵌套在其他命名空间中,形成一个层次结构。嵌套命名空间可以进一步细化命名空间,使其更…

k8s operator从0到1实践

文章目录 环境准备一个k8s集群开发工具包mac安装 实践初始化operator项目核心逻辑编写测试验证验证 部署 参考 环境准备 一个k8s集群 推荐使用docker-desktop&#xff0c;本地单机集群 开发工具包 这里推荐使用脚手架工具kubebuilder 使用脚手架工具&#xff0c;能生成项目…

Java基础-常量,变量,数据类型-笔记

1.关键字分类 用于定义数据类型的关键字&#xff1a;class&#xff0c;interface&#xff0c;enum&#xff0c;byte&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;float&#xff0c;double&#xff0c;char&#xff0c;boolean,void。 用于定义流程控制的关键字…

「微服务」企业微服务架构

首先&#xff0c;来自Darren的消息是&#xff0c;微服务架构并不是构建大规模企业应用程序的新方式。Netflix和亚马逊等公司已经实施了微服务架构&#xff0c;在过去几年中提供了成功的产品。 但是微服务架构适合您的组织吗&#xff1f;答案不是简单的是或否&#xff0c;但我会…