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

本文共 2860 字,大约阅读时间需要 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下的),下一篇说下相近的几个命令,要不这里太长了。。。

这是可以得到如下结果
这个时候我们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会发现

在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这种)
然后,继续改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的

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


转载地址:http://ysjtx.baihongyu.com/

你可能感兴趣的文章
服务应该去版本化,不管是微服务还是SOA
查看>>
Rate limiting限流
查看>>
Netflix:当你按下“播放”的时候发生了什么?
查看>>
一行代码迁移TensorFlow 1.x到TensorFlow 2.0
查看>>
2018智博会与腾讯“云+未来”峰会重庆站同日揭幕,六大亮点提前连连看
查看>>
为什么Oracle公开嫌弃自家产品MySQL?
查看>>
华为敏捷DevOps实践:如何从Excel管理软件的方式中走出来
查看>>
为什么Python发展得如此之快?
查看>>
使用Spring Cloud Function框架进行面向函数的编程
查看>>
C# 8的Ranges和递归模式
查看>>
大前端时代,如何做好C 端业务下的React SSR?\n
查看>>
基础设施即代码:Terraform和AWS无服务器
查看>>
LCA---Lowest common ancestor
查看>>
新的UWP和Win32应用程序分发模型
查看>>
乔布斯的64周年诞辰,苹果滞销的第N天
查看>>
Apache CarbonData里程碑式版本1.3发布
查看>>
组合式测试:移动测试服务的发展趋势
查看>>
一线:阿里云不做SaaS,那这件事会交给谁?
查看>>
Netflix混沌工程手册Part 2:混沌工程原则
查看>>
Serialize and Deserialize Binary Tree & BST
查看>>