今天宝叔突然在群里发了个问题;
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下的),下一篇说下相近的几个命令,要不这里太长了。。。
这是可以得到如下结果 这个时候我们ping一下a.com,会发现a.com指向了127.0.0.1。接下来我们再改下host127.0.0.1 a.com192.168.4.102 a.com
再命令行先输入ipconfig /flushdns清一下dns的缓存,再ipconfig /displaydns会发现
在ping一下
继续改host
127.0.0.1 a.com192.168.4.102 a.com192.168.4.103 a.com
继续清DNS缓存,查DNS缓存
从这几个,我们就可以得出我们的前两条结论host的解析首先是自上而下的非127的优先于127.0.0.1的然后我们继续改,继续打脸。。。
127.0.0.1 a.com192.168.4.102 test.com a.com192.168.4.103 a.com
你猜输出啥,上图
这个时候a.com解析到了两个部分里面,一部分是红色圈出的“A(主机)记录”,一部分是“CNAME”记录,主机记录也就是默认解析了。CNAME记录又是啥?CNAME记录意味着多个域名映射到了一个IP上,这时只有ip后面紧邻的域名(首域名)会生成“A(主机)记录”,而其他后续的域名会解析成首域名的别名记录,也就是CNAME记录。而CNAME记录在dns解析中的优先级是低于“A(主机)记录”的。 这也就得出了另一条结论,同域名多条记录的时候,域名紧邻ip(域名1这种)的优先级高于非紧邻的(域名2/3这种) 然后,继续改host127.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的综上我们就大致的出了本文的结论啦,大家有兴趣可以自己在试一下,如有错误欢迎指出~