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

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的

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


聊聊host中ip/域名映射记录的解析规则的更多相关文章

  1. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录(转)

    http://www.cnblogs.com/LittleHann/p/3828927.html 相关学习资料 http://baike.baidu.com/link?url=77B3BYIuVsB3 ...

  2. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录 专题

    首先要做的就是配置域名的MX 记录啦: 先添加一条A记录: mail.abc.com 指向 你的服务器IP! 然后添加域名的MX 记录,指向mail.abc.com A 记录( 即域名MX 记录的值为 ...

  3. 外网域名映射内网Ip 内网使用外网域名的https证书

    用nslookup www.baidu.com nslookup www.qq.com 15.64.64.53 测试了内网的dns可以解析外网域名 那么我买个外网域名,再对这个外网域名买个证书,然后外 ...

  4. 如何在Mininet中修改host的IP地址

    how to update virtual host's IP in mininet? I got it! do like this: mininet> py h1.setIP('10.0.0. ...

  5. DNS安全浅议、域名A记录(ANAME),MX记录,CNAME记录

    相关学习资料 http://baike.baidu.com/link?url=77B3BYIuVsB3MpK1nOQXI-JbS-AP5MvREzSnnedU7F9_G8l_Kvbkt_O2gKqFw ...

  6. 本地nginx多域名映射

    前言: 工作两年多了,一直感觉技术上没有太大的长进,好多东西感觉会但是给别人讲起来的时候又感觉和没学过一样.以后希望能坚持写博客,把看过的东西都一点一滴积累下来.言归正传,今天要说的是nginx与ho ...

  7. 通过配置host,自定义域名让本地访问

    最近服务器这块一直由我来维护,我们开发的项目很多域名根本没有解析,而是仅仅配置了host,就可以本地访问服务器了.感觉很有意思,于是乎,打算试一试.结果弄了许久,最后第二天才解决了.把这个艰辛的旅程记 ...

  8. Charles系列三:Charles打断点(包含修改请求,修改返回的内容),模拟慢速网络(弱网测试),域名映射,过滤请求,接口调试,打压测试

    一:Charles断点的使用(包含修改请求,修改返回的数据) 设置断点来修改请求和返回的数据,在开发过程中可以模拟多种响应.步骤如下: 1.添加断点方法有两种: 方法1:找到Charles中菜单项Pr ...

  9. win7下IIS配置以及域名映射方法

    win7下IIS配置以及域名映射方法 第一步:打开控制面板,选择程序与功能,如下图: 第二步:双击打开程序与功能面板,如下图: 第三步:打开”打开或关闭windows功能”(红线圈起来的地方),如下图 ...

随机推荐

  1. 关于Hall定理的学习

    基本定义 \(Hall\) 定理是二分图匹配的相关定理 用于判断二分图是否存在完美匹配 存在完美匹配的二分图即满足最大匹配数为 \(min(|X|,|Y|)\) 的二分图,也就是至少有一边的点全部被匹 ...

  2. digester解析xml文件

    在我们的项目中或多或少会采用xml来做配置文件,你可以采用Java原生支持的sax.DOM或者第三方的dom4j等.虽然提供了各式各样的解析方式,但是解析一个复杂的xml所编写的Java代码是非常麻烦 ...

  3. 撩课-Web大前端每天5道面试题-Day11

    1. 如何手写一个JQ插件? 方式一: $.extend(src) 该方法就是将src合并到JQ的全局对象中去: $.extend({ log: ()=>{alert('撩课itLike');} ...

  4. 撩课-Python-每天5道面试题-第2天

    一. 简述编程过程中, 注释的作用? (1) 方便开发人员自己理清楚代码思路 因为开发人员在拿到一个需求时, 首先应该思考的是如何将需求问题, 分解成具体的实施步骤; 第一步干啥, 第二步干啥, 第三 ...

  5. mybatis之typehandles

    mybatis之typehandles 无论是Mybatis在预处理语句PreparedStatement中设置一个参数时,还是从结果集中取出一个值时,都会用类型处理器将获取的值以合适的方式转换成ja ...

  6. Python Django ORM基本增删改查

    工程下的urls.py中增加如下: from cmdb import views as cmdb #要把你要操作的项目import进来 urlpatterns = [ url(r'orm', cmdb ...

  7. python单继沿用父类属性的两种方法

    方法一 在子类中用父类调用其init方法(不建议) 方法二 在子类中使用super获得父类的方法 class Aaimal(object): type_name = '动物类' def __init_ ...

  8. svg动画之日出

    效果分析 一个太阳,从底部升起来,天空由黑变蓝.那么要画的东西确定为三个:1.太阳(圆形)2.太阳光芒 3.天空 代码如下 <!--画太阳--> <svg width="6 ...

  9. ThreeJS模拟人沿着路径运动-路径箭头使用纹理offset偏移

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. Nodejs + express + ejs 之服务器demo

    var http=require("http"); var express=require("express"); var fs = require(" ...