聊聊host中ip/域名映射记录的解析规则

今天宝叔突然在群里发了个问题; host做如下配置,a.com会指向哪里?或者说ping一下a.com结果会是什么?

127.0.0.1 a.com
192.168.4.106 a.com
192.168.4.105 x.com a.com
192.168.4.107 a.com x.com
127.0.0.1 a.com

what?host自上而下解析啊,这不妥妥的127.0.0.1么,一测试,啪啪啪的打脸了。。。输出的是192.168.4.106,为啥?


以下结论仅针对windows系统,linux系统的暂时还未测试,后面补充


先上结论

首先先上一下经过自己测试总结得出的结论,解决你的问题,如果你有兴趣,可以再往后看具体的解决流程(图有点多) host配置:

ip 域名a 域名b 域名c

先看下基本测试结论

1、host的解析首先是自上而下的
2、同域名多条记录的时候,首域名记录(域名a这种)的优先级高于非首域名记录(域名b/c这种)
3、同样紧邻ip的 多条同域名记录,优先级遵循第一条,且 非127.0.0.1的优先于127.0.0.1的
4、同域名多条记录且均不紧邻ip的,遵循第一条
5、0.0.0.0 会产生主机记录但ping不通,因此不计入优先级计算范围

然后我们在细看一下

首先host文件会解析出多种域名ip的映射记录,大致有“A(主机)记录”记录、“CNAME”别名记录、PTR记录等。前两种用于域名正向解析,即从域名到ip,后面一种用于ip逆向解析即从ip找域名。今天说的主要是正向解析,暂时忽略PTR记录,来看下A主机记录和CNAME别名记录,如下

a.com
----------------------------------------
记录名称. . . . . . . : a.com
记录类型. . . . . . . : 1
生存时间. . . . . . . : 0
数据长度. . . . . . . : 4
部分. . . . . . . . . : 答案
A (主机)记录  . . . . : 192.168.4.106

a.com
----------------------------------------
记录名称. . . . . . . : a.com
记录类型. . . . . . . : 5
生存时间. . . . . . . : 0
数据长度. . . . . . . : 8
部分. . . . . . . . . : 答案
CNAME 记录  . . . . . : b.com

A主机记录即首域名(紧邻ip的域名)映射产生的记录,别名记录即非首域名映射到首域名上的记录。这两类记录大致遵守以下规则: 1、记录生成顺序自上而下且不覆盖, 2、同一域名可能产生多条主机记录和别名记录, 3、主机记录优先级高于别名记录, 4、多条主机记录中,非127.0.0.1和0.0.0.0的ip主机记录优先级最高,其次是127.0.0.1的,最后是0.0.0.0,但是当仅有0.0.0.0的记录时,你会发现是ping不通的;

再回头看一下之前的基本结论就比较容易理解了~~,然后根据这个结论在看前面的问题就很明显了,妥妥的192.168.4.106


再看过程

接着我们聊一下我们的探寻思路。 首先,host文件的作用大家都清楚的,加速及实现域名解析。说加速可以从浏览器解析域名的流程的角度来理解,正常情况下浏览器输入一个url之后会去做域名解析找到对应的IP,这个解析过程一般会经过

  • 浏览器DNS缓存
  • 本地host配置
  • DNS服务器
  • 上层root server

等几个流程(前面一个流程解析到了就返回)。在host中配置之后相当于提前了一步域名的解析,也就是我们说的加速。解析就不必说了,实现域名到ip的转换,比如一些内部域名,没有做外网解析,这个时候如果系统内部没有相应的DNS服务器去做解析,那就去配host吧。

日常开发中,改host一般就是新加一条

192.168.4.106 a.com

但是,经常改的话就会出现最前面的问题,一堆重复的配置,最终究竟该解析到哪里?

怎么解?第一个想到的肯定是测试啊,清空host(记得备份。。。),只保留一下配置

127.0.0.1 a.com

这个时候,在命令行窗口输入ipconfig /displaydns,这个命令会显示DNS解析程序缓存的内容(windows下的),下一篇说下相近的几个命令,要不这里太长了。。。 这是可以得到如下结果

这个时候我们ping一下a.com,会发现a.com指向了127.0.0.1。接下来我们再改下host

127.0.0.1 a.com
192.168.4.102 a.com

再命令行先输入ipconfig /flushdns清一下dns的缓存,再ipconfig /displaydns会发现

在ping一下

继续改host

127.0.0.1 a.com
192.168.4.102 a.com
192.168.4.103 a.com

继续清DNS缓存,查DNS缓存

从这几个,我们就可以得出我们的前两条结论 host的解析首先是自上而下的 非127的优先于127.0.0.1的

然后我们继续改,继续打脸。。。

127.0.0.1 a.com
192.168.4.102 test.com a.com
192.168.4.103 a.com

你猜输出啥,上图

这个时候a.com解析到了两个部分里面,一部分是红色圈出的“A(主机)记录”,一部分是“CNAME”记录,主机记录也就是默认解析了。CNAME记录又是啥?CNAME记录意味着多个域名映射到了一个IP上,这时只有ip后面紧邻的域名(首域名)会生成“A(主机)记录”,而其他后续的域名会解析成首域名的别名记录,也就是CNAME记录。而CNAME记录在dns解析中的优先级是低于“A(主机)记录”的。 这也就得出了另一条结论, 同域名多条记录的时候,域名紧邻ip(域名1这种)的优先级高于非紧邻的(域名2/3这种) 然后,继续改host

127.0.0.1 a.com
192.168.4.102 test.com a.com
192.168.4.103 c.om a.com

在改

127.0.0.1 a.com
0.0.0.0 a.com
192.168.4.102 test.com a.com
192.168.4.103 c.om a.com

在改

0.0.0.0 a.com
127.0.0.1 a.com
192.168.4.102 test.com a.com
192.168.4.103 c.om a.com

我就不截图了,有点多,可以发现 0.0.0.0的映射虽然可以产生一条主机记录但是本身不起作用的,只配置0.0.0.0 a.com的时候,是ping不到a.com的

综上我们就大致的出了本文的结论啦,大家有兴趣可以自己在试一下,如有错误欢迎指出~


本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏云计算教程系列

如何在Ubuntu 18.04上安装最新的MySQL

MySQL是一个着名的开源数据库管理系统,用于存储和检索各种流行应用程序的数据。MySQL是LAMP堆栈中的M,是一组常用的开源软件,也包括Linux,Apac...

3010
来自专栏编程

10 个例子教你学会 ncat 命令

ncat 或者说 nc 是一款功能类似 cat 的工具,但是是用于网络的。它是一款拥有多种功能的 CLI 工具,可以用来在网络上读、写以及重定向数据。 -- P...

1915
来自专栏Java帮帮-微信公众号-技术文章全总结

Web-第二十五天 Maven学习一【悟空教程】

解决方案:maven对项目生命周期进行定义,规范,开发人员和测试人员使用maven软件完成构建。

1383
来自专栏北京马哥教育

Python爬虫代理池

4088
来自专栏散尽浮华

Nginx+upstream针对后端服务器容错的运维笔记

熟练掌握Nginx负载均衡的使用对运维人员来说是极其重要的!下面针对Nignx负载均衡upstream容错机制的使用做一梳理性说明: 一、nginx的upstr...

1.1K9
来自专栏吴伟祥

Maven概念梳理 原

Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的 软件项目管理工具。

451
来自专栏web前端

HTTP协议理解

HTTP(Hyper Text Transfer Protocol)超文本传输协议,是一种请求响应式协议,类似两国会晤中需要遵守的规则。那么,其中有什么内容特点...

2148
来自专栏流柯技术学院

VirtualBox-Linux系统安装增强功能

2771
来自专栏IT技术精选文摘

史上最全Web端即时通讯技术原理详解

2493
来自专栏zaking's

走进webpack(1)--环境拆分及模块化

  初级的文章和demo已经基本完成了,代码也已经上传到了我的github上,如果你对webpack的使用并不是十分了解,那么建议你回头看下走近系列,里面包括了...

2736

扫码关注云+社区

领取腾讯云代金券