今天宝叔忽然在群里发了个问题;
host作以下配置,a.com会指向哪里?或者说ping一下a.com结果会是什么?javascript
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,为啥?java
如下结论仅针对windows系统,linux系统的暂时还未测试,后面补充linux
首先先上一下通过本身测试总结得出的结论,解决你的问题,若是你有兴趣,能够再日后看具体的解决流程(图有点多)
host配置:windows
ip 域名a 域名b 域名c
一、host的解析首先是自上而下的 二、同域名多条记录的时候,首域名记录(域名a这种)的优先级高于非首域名记录(域名b/c这种) 三、一样紧邻ip的 多条同域名记录,优先级遵循第一条,且 非127.0.0.1的优先于127.0.0.1的 四、同域名多条记录且均不紧邻ip的,遵循第一条 五、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的域名)映射产生的记录,别名记录即非首域名映射到首域名上的记录。这两类记录大体遵照如下规则:
一、记录生成顺序自上而下且不覆盖,
二、同一域名可能产生多条主机记录和别名记录,
三、主机记录优先级高于别名记录,
四、多条主机记录中,非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,这个解析过程通常会通过测试
等几个流程(前面一个流程解析到了就返回)。在host中配置以后至关于提早了一步域名的解析,也就是咱们说的加速。解析就没必要说了,实现域名到ip的转换,好比一些内部域名,没有作外网解析,这个时候若是系统内部没有相应的DNS服务器去作解析,那就去配host吧。url
平常开发中,改host通常就是新加一条spa
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的
综上咱们就大体的出了本文的结论啦,你们有兴趣能够本身在试一下,若有错误欢迎指出~