博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
聊聊host中ip/域名映射记录的解析规则
阅读量:5341 次
发布时间:2019-06-15

本文共 2911 字,大约阅读时间需要 9 分钟。

今天宝叔突然在群里发了个问题;

host做如下配置,a.com会指向哪里?或者说ping一下a.com结果会是什么?

127.0.0.1 a.com192.168.4.106 a.com192.168.4.105 x.com a.com192.168.4.107 a.com x.com127.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.106a.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下的),下一篇说下相近的几个命令,要不这里太长了。。。

这是可以得到如下结果
461976-20180719204252019-1096619545.png
这个时候我们ping一下a.com,会发现a.com指向了127.0.0.1。接下来我们再改下host

127.0.0.1 a.com192.168.4.102 a.com

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

461976-20180719204750049-72874585.png

在ping一下

461976-20180719204838411-860306384.png

继续改host

127.0.0.1 a.com192.168.4.102 a.com192.168.4.103 a.com

继续清DNS缓存,查DNS缓存

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

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

127.0.0.1 a.com192.168.4.102 test.com a.com192.168.4.103 a.com

你猜输出啥,上图

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

127.0.0.1 a.com192.168.4.102 test.com a.com192.168.4.103 c.om a.com

在改

127.0.0.1 a.com0.0.0.0 a.com192.168.4.102 test.com a.com192.168.4.103 c.om a.com

在改

0.0.0.0 a.com127.0.0.1 a.com192.168.4.102 test.com a.com192.168.4.103 c.om a.com

我就不截图了,有点多,可以发现

0.0.0.0的映射虽然可以产生一条主机记录但是本身不起作用的,只配置0.0.0.0 a.com的时候,是ping不到a.com的

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


转载于:https://www.cnblogs.com/heioray/p/9338012.html

你可能感兴趣的文章
Spring的xml文件配置方式实现AOP
查看>>
清理网站缓存的几种方法
查看>>
js 使用json.js处理json对象
查看>>
UML类图
查看>>
php基础随记
查看>>
WWF(1)
查看>>
2016蓝桥杯决赛 机器人塔(会超时)
查看>>
vue中过滤器filter的使用
查看>>
vue中v-show与v-if的区别
查看>>
time模块
查看>>
已知树的前序中序求后序,或者已知树的中序后序求前序(1)
查看>>
构建之法 阅读笔记06
查看>>
vhdl rising_edge(clk) (clk'event and clk='1')的区别
查看>>
LoadRunner补丁Patch4下载
查看>>
七 Hibernate5种查询检索方式,单表&多表
查看>>
【tyvj1305】最大子序和
查看>>
面试总结一
查看>>
Logging模块的简单使用 Python
查看>>
【程序47】
查看>>
win7下自动更新svn目录
查看>>