聊聊host中ip/域名映射記錄的解析規則

今天寶叔忽然在羣裏發了個問題;
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,這個解析過程通常會通過測試

  • 瀏覽器DNS緩存
  • 本地host配置
  • DNS服務器
  • 上層root server

等幾個流程(前面一個流程解析到了就返回)。在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的

綜上咱們就大體的出了本文的結論啦,你們有興趣能夠本身在試一下,若有錯誤歡迎指出~

相關文章
相關標籤/搜索