今天寶叔突然在群里發了個問題;
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的
綜上我們就大致的出了本文的結論啦,大家有興趣可以自己在試一下,如有錯誤歡迎指出~