通过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地址,希望也能让您有一些收获。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

分布式链路追踪专栏,Spring Cloud Sleuth:分布式链路追踪之通信模型设计

Spring Cloud Sleuth 赋予分布式跟踪的 Spring Boot 自动配置的一键解决方案。Spring Cloud Sleuth 是基于 Brave 的封装,也是很多公司采用开源加自研的最佳解决方案。 那么从作为架构师或者技术专家如何去借鉴优秀框架的设计理念和思想,本次 Chat 将开…

肯·汤普逊 :我心目中的神,好像真正无敌之上的大佬都对C++提出了批判!大佬们的思想像红太阳太耀眼,常人不能直视

肯尼斯蓝汤普逊(英语:Kenneth Lane Thompson,1943年2月4日—),小名肯汤普逊(英语:Ken Thompson),美国计算机科学学者和工程师。黑客文化圈子通常称他为“ken”[1]。在贝尔…

为什么很多公司选择不升级JDK版本,仍然使用JDK8?

在讨论为什么许多公司选择不升级JDK版本,而继续使用JDK 8时,我们需要从多个角度来分析这个问题。以下是根据您提供的背景信息进行的一些分析和真实案例。 本文已收录于,我的技术网站 ddkk.com,有大厂完整面经,工作技术…

test Symbolic Execution-03-Soot - A Java optimization framework

拓展阅读 开源 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) 开源 Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) test fuzz-01-模糊测试(Fuzz Testing) Soot 重要…

【linux】awk的基本使用

awk是shell中一个强大的文本处理工具,被用于处理文本和数据 当你心中默念想要使用类似于 处理某一行,处理某一列 的文本 的功能时,就是awk登场的时候了 举个简单的例子是,当我们想知道自己的所有网卡的名字时,可以用i…

繁花的范总-UMLChina建模知识竞赛第5赛季第3轮

DDD领域驱动设计批评文集 做强化自测题获得“软件方法建模师”称号 《软件方法》各章合集 参考潘加宇在《软件方法》和UMLChina公众号文章中发表的内容作答。在本文下留言回答。 只要最先答对前3题,即可获得本轮优胜。 如果有第4题,第4题为附加题&am…

OpenHarmony—Linux之系统调用

Linux之系统调用 这里我们只讨论: 硬件: Arm64系统: Linux系统 (Kernel-5.15-rc1)高级语言: C (glibc-2.34)模式: 64位 (即未定义CONFIG_COMPAT) 2、什么是系统调用 …

主键(设置/删除方法,复合主键),唯一键,主键和唯一键的应用差异,自增长字段(如何实现,查看上次的值),外键(引入,外键约束)

目录 主键(primary key) 介绍 作用 设置主键 建表前 建表后 复合主键 介绍 示例 删除主键 唯一键(unique) 介绍 意义 示例 建表 主键 唯一键 插入数据示例 主键和唯一键的应用差异 主键 唯一键 索引 auto_increment 介绍 示例 自动插入 手动插入 …

电子签章系统,怎么做到大量文件自动电子签章?

在当今信息爆炸的时代,海量文件的签署管理成为各行业面临的挑战之一。电子签章系统的出现,为解决这一问题提供了有效途径。本文将探讨电子签章系统如何实现海量文件自动签章,提高工作效率并确保安全性。 钉钉、企微、飞书、OA、CRM、ERP等&a…

K8S API访问控制之RBAC利用

前言 K8S对于API的访问安全提供了访问控制,主要为4个阶段,本文为第二个阶段——鉴权的RBAC。RBAC是基于角色的访问控制,使用kubeadm安装集群1.6版本以上的都默认开启了RBAC。本文主要研究集群可能存在的利用点及相对应的利用手法。 API访问…

图像的初识

一、图像的数组表示 RGB能够构成人眼所能识别的所有颜色。 二、图像的变换 Example: img.shape Out[329]: (512, 768, 3) img.dtype Out[330]: dtype(uint8) #补值变换 shift_temp_img [255,255,255] - img shift_img Image.fromarray(shift_temp_img.astype(ui…

机器学习~从入门到精通(二)线性回归算法和多元线性回归

为什么要做数据归一化 一、数据归一化: 1.最值归一化 2.均值方差归一化import numpy as npX np.random.randint(1,100,size100) X X.reshape(-1,2) X.shape X np.array(X,dtypefloat) X[:,0] (X[:,0]-np.min(X[:,0]))/(np.max(X[:,0])-np.min(X[:,0])) X[:,1]…

class_4:car类

#include <iostream> using namespace std; class Car{ public://成员数据string color; //颜色string brand; //品牌string type; //车型int year; //年限//其实也是成员数据&#xff0c;指针变量&#xff0c;指向函数的变量&#xff0c;并非真正的成员函数void (*…

强化学习应用(六):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

C# .NET SQL sugar中 IsAny进行根据条件判断数据是否存在 IsAny的使用

SQL sugar 中控制器直接判断数据是否存在 首先确保你的Service层继承的表名 控制器中使用IsAny进行根据条件判断数据是否存在

Redis命令 - Sets命令组常用命令

Set集合&#xff0c;无序&#xff0c;一堆不重复值的组合。利用redis提供的set数据结构&#xff0c;可以存储一些集合性的数据。 使用场景&#xff1a;例如&#xff0c;实现如共同关注、共同喜好、二度好友等 1、SADD key member [member …] 向集合中添加一个或者多个成员 …

Windows Server调整策略实现999999个远程用户用时登录

正文共&#xff1a;1234 字 23 图&#xff0c;预估阅读时间&#xff1a;2 分钟 上篇文章中&#xff08;Windows Server 2019配置多用户远程桌面登录服务器&#xff09;&#xff0c;我们主要介绍了Windows Server 2019在配置远程桌面时&#xff0c;如何通过3种方式创建本地用户账…

Harbor安装

采用原生的方式安装Harbor 下载Harbor安装包&#xff1a;https://github.com/goharbor/harbor/releases/download/v2.3.4/harbor-offline-installer-v2.3.4.tgz 拖拽到Linux并解压&#xff1a; tar -zxvf harbor-offline-installer-v2.3.4.tgz -C /usr/local/修改Harbor配置文…

Python-AST语法树

一、抽象语法树 1、什么是抽象语法树 在计算机科学中&#xff0c;抽象语法树&#xff08;abstract syntax tree &#xff0c;AST&#xff09;&#xff0c;是源代码的抽象语法结构的树状表现形式&#xff0c;这里特指编程语言的源代码。AST是编译器或解释器在处理源代码时所使…

原子类-入门介绍和分类说明、基本类型原子类

Atomic翻译成中文是原子的意思。在化学上,我们知道原子是构成一般物质的最小单位,在化学 反应中是不可分割的。在我们这里Atomic是指一个操作是不可中断的。即使是在多个线程一起执 行的时候,一个操作一旦开始,就不会被其他线程干扰。 基本类型原子类 AtomicInteger:整…