文/朱季谦

本文主要想通过动手实际分析一下是如何通过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速度将更快。

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

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

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

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

通过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 ......



这些信息当中,正好包含了域名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域名的流程,这里直接引用了——

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

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

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

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

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

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

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

欢迎关注微信公众号——

通过Wireshark抓包分析谈谈DNS域名解析的那些事儿的更多相关文章

  1. Wireshark抓包分析/TCP/Http/Https及代理IP的识别

    前言 坦白讲,没想好怎样的开头.辗转三年过去了.一切已经变化了许多,一切似乎从没有改变. 前段时间调研了一次代理相关的知识,简单整理一下分享之.如有错误,欢迎指正. 涉及 Proxy IP应用 原理/ ...

  2. 用Wireshark抓包分析超过70秒的请求

    超过70秒的请求是通过分析IIS日志发现的: 10.159.63.104是SLB的内网IP. 通过Wireshark抓包分析请求是9:22:21收到的(tcp.stream eq 23080): 09 ...

  3. Wireshark抓包分析HTTPS与HTTP报文的差异

    一.什么是HTTPS: HTTPS(Secure Hypertext Transfer Protocol)安全超文本传输协议 它是一个安全通信通道,它基于HTTP开发,用于在客户计算机和服务器之间交换 ...

  4. wireshark 抓包分析 TCPIP协议的握手

    wireshark 抓包分析 TCPIP协议的握手 原网址:http://www.cnblogs.com/TankXiao/archive/2012/10/10/2711777.html 之前写过一篇 ...

  5. wireshark抓包分析工具的使用

    # wireshark抓包分析工具的使用 ## 常用抓包指令 - `ip.src==192.168.60.26 and ip.dst==111.7.187.220 and tcp.port == 80 ...

  6. Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析

    Wireshark抓包分析TCP建立/释放链接的过程以及状态变迁分析 一.介绍计算机网络体系结构 1.计算机的网络体系结构 在抓包分析TCP建立链接之前首先了解下计算机的网络通信的模型,我相信学习过计 ...

  7. wireshark抓包分析——TCP/IP协议

    本文来自网易云社区 当我们需要跟踪网络有关的信息时,经常会说"抓包".这里抓包究竟是什么?抓到的包又能分析出什么?在本文中以TCP/IP协议为例,简单介绍TCP/IP协议以及如何通 ...

  8. 【计算机网络】wireshark抓包分析1

    学习计算机网络很久了,但总是局限于书本知识,感觉get不到重点.经师兄建议用wireshark抓包分析看看. 我自己以前并没有做过抓包分析,所以这篇博文可能会有很多错误,只是我自己的一个记录,路过的亲 ...

  9. TCP/IP详解卷1 - wireshark抓包分析

    TCP/IP详解卷1 - 系列文 TCP/IP详解卷1 - 思维导图(1) TCP/IP详解卷1 - wireshark抓包分析 引言 在初学TCP/IP协议时,会觉得协议是一种很抽象的东西,通过wi ...

随机推荐

  1. 8.算法竞赛中的常用JAVA API :Calendar日期类

    8.算法竞赛中的常用JAVA API :Calendar日期类 摘要 在蓝桥杯中有关于日期计算的问题,正好java中的Date类和Calendar类提供了对日期处理的一些方法.Date类大部分方法已经 ...

  2. 用expect做自动运行脚本

    下面的脚本演示了在Ubuntu上安装expect,写一个切换用户的expect脚本,并运行脚本看到效果的过程. root@guserver:~# apt-get install expect godu ...

  3. 手把手和你一起实现一个Web框架实战——EzWeb框架(二)[Go语言笔记]Go项目实战

    手把手和你一起实现一个Web框架实战--EzWeb框架(二)[Go语言笔记]Go项目实战 代码仓库: github gitee 中文注释,非常详尽,可以配合食用 上一篇文章我们实现了框架的雏形,基本地 ...

  4. Shell-13-常用文件目录

    linux系统目录结构 环境变量文件 系统级 系统级变量文件对所有用户生效 #系统范围内的环境变量和启动文件. #不建议把要做的事情写在这里面,最好创建一个自定义的,放在/etc/profile.d ...

  5. 一文搞懂RPC原理

    RPC原理解析 什么是RPC RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.R ...

  6. SQLServer 判断文件是否存在

    根据20190621工作写的逻辑,以后可根据实际情况再做修改.顺便记录一下游标的使用,加强记忆. DECLARE @Id NVARCHAR(MAX) DECLARE @UserName NVARCHA ...

  7. Dijkstra链路状态选路算法

  8. 关于SequenceInputStream

    两个流合并时: package stream.sequence; import java.io.BufferedReader; import java.io.BufferedWriter; impor ...

  9. 模拟文件上传(三):使用apache fileupload组件进行文件批量上传

    其中涉及到的jar包 jsp显示层: <%@ page language="java" import="java.util.*" pageEncoding ...

  10. C++笔记(11) 智能指针

    1. 设计思想 智能指针是行为类似于指针的类对象,但这种对象还有其他功能.首先,看下面的函数: void remodel(std::string & str) { std::string * ...