最初在網(wǎng)上看到這個問題時,似乎是某個人面試時被問到的問題。這個問題倒是個很開放性的問題,自己稍微想了下,也略微搜索了下網(wǎng)上的一些相關(guān)文章,感覺這樣一個簡單的日常上網(wǎng)動作,后面涉及到了如此多的技術(shù)點。如果能夠通過這樣一個簡單的案例,把各個知識點串一遍,在各個知識點之間建立聯(lián)系,對記憶這些知識很有幫助,大腦里也能形成一種系統(tǒng)性的知識結(jié)構(gòu)。
一、DNS域名解析
首先,我們得在瀏覽器里輸入一個網(wǎng)址,就拿taobao做例子 吧。

輸入后按下回車,這時候瀏覽器會首先進(jìn)行域名解析。所謂域名解析,就是將我們輸入的www.taobao.com這個url解析成瀏覽器實際訪問時使用的ip地址。這個解析的過程就要利用到DNS協(xié)議了。簡單的說,瀏覽器會到DNS服務(wù)器上進(jìn)行域名的查找,但實際上的過程遠(yuǎn)比這個復(fù)雜,后面再說。而瀏覽器和DNS服務(wù)器之間的通信則使用的是DNS協(xié)議。
DNS協(xié)議的報文有兩種:
- 查詢報文
- 應(yīng)答報文
如下圖所示,就是執(zhí)行www.taobao.com域名查詢的報文

這里對查詢報文的具體格式就不深究了。只單獨說下圖中最下方二進(jìn)制數(shù)據(jù)中藍(lán)色高亮的部分。這部分記錄了請求的URL文本,其編碼格式是對URL中按點號分段后得到多段,每段前加上對該段的字符長度計數(shù)值,最終拼接成一串。例如圖中的具體含義是:
03 77 77 77 = 3 + www
06 74 61 6f 62 61 6f = 6 + taobao
03 63 6f 6d = 3 + com
對應(yīng)的應(yīng)答報文如下圖,它與查詢報文的格式是很相似的。

二、關(guān)于DNS的各種八卦
DNS的結(jié)構(gòu)
就我目前了解到的知識來看,DNS系統(tǒng)的結(jié)構(gòu)有下面3個最大的特點
- 分布式
- 樹狀
- 授權(quán)解釋
所謂分布式,實際上是指整個DNS系統(tǒng)是由多個服務(wù)器共同組成的一個分布式系統(tǒng),具體的每個域名信息分散在系統(tǒng)中的各個服務(wù)器上。
而樹狀則是指這些服務(wù)器之間是一個典型的樹層次結(jié)構(gòu)聯(lián)系起來的。這里盜個圖

如上圖所示,域名本身按層次進(jìn)行了劃分。而這些域名會由一到多個DNS服務(wù)器記錄其相關(guān)信息,這樣看,對于www.taobao.com這個域名,com的部分有一些服務(wù)器進(jìn)行管理,taobao這個由另一些來管理,www的又由其他的管理。其中,處于樹頂端的是根服務(wù)器,根服務(wù)器主要用來管理互聯(lián)網(wǎng)的主目錄,全世界只有13臺,1個為主根服務(wù)器,放置在美國。其余12個均為輔根服務(wù)器,其中9個放置在美國,歐洲2個,位于英國和瑞典,亞洲1個,位于日本。
這樣對于一個域名的查詢,實際會涉及到多個DNS服務(wù)器。而在具體的查詢中,常常提到兩個概念:遞歸查詢、迭代查詢。網(wǎng)上對這兩個概念的說法似乎各有各的理解,這里也談?wù)勎伊私獾健?/p>
- 對于遞歸查詢,就是說當(dāng)客戶端(例如瀏覽器)向DNS服務(wù)器發(fā)起查詢時,如果這個DNS服務(wù)器不知道答案,就會向其他DNS服務(wù)器進(jìn)行查詢,直到查到結(jié)果或超時。這樣DNS服務(wù)器就相當(dāng)于一個跑腿的,在幫客戶端代理執(zhí)行到其他DNS服務(wù)器的查詢工作。具體舉個例子,當(dāng)我想查找www.taobao.com的IP地址時,我會向我機(jī)器上配置的DNS服務(wù)器首先發(fā)起詢問(我機(jī)器的DNS如下圖所示)

瀏覽器:211.137.130.3啊,告訴我www.taobao.com的IP。
211.137.130.3:我也不知道,我?guī)湍銌枂?/p>
211.137.130.3:根服務(wù)器啊,www.taobao.com的IP是啥?
根服務(wù)器:我不知道,問問com那邊吧,到xxx機(jī)器去問
211.137.130.3:com啊,www.taobao.com的IP是啥?
com:我不知道,問問taobao那邊吧,到y(tǒng)yy機(jī)器去問
211.137.130.3:taobao啊,www.taobao.com的IP是啥?
taobao:我不知道,問問www那邊吧,到zzz機(jī)器去問
211.137.130.3:www啊,www.taobao.com的IP是啥?
www:是這個,拿去吧
211.137.130.3:嘿,瀏覽器,幫你問到了哈,搞定
- 對于迭代查詢,查詢的過程類似,只是變成由客戶端自己來跑腿了,而不是由DNS服務(wù)器代理。
而上面這個查詢過程,也反映了DNS結(jié)構(gòu)的另一個特點,就是授權(quán)解釋。實際上可以看到,一個域名的解釋是由一個具有權(quán)威性的DNS服務(wù)器來做最正統(tǒng)的回答,其他服務(wù)器不知道的情況下都會向他獲取權(quán)威答案。這里涉及到DNS中的兩個概念:
- SOA(Start of Authority)
該記錄表明DNS域名服務(wù)器是DNS域中的數(shù)據(jù)表的信息來源,該服務(wù)器是主機(jī)名字的管理者 - NS(Name Server)
該記錄是域名服務(wù)器記錄,用來指定該域名由哪個DNS服務(wù)器來進(jìn)行解析
也就是說,通過SOA可以確定哪個服務(wù)器是解析域名的權(quán)威,而通過NS可以找到這個權(quán)威服務(wù)器。
另外值得一提的是,前面提到多次查詢過程實際中不會每次、頻繁的發(fā)生,因為每個服務(wù)器都將這些查詢結(jié)果做了緩存,減少向其他服務(wù)器查詢的次數(shù),以提高效率。
作為全局負(fù)載均衡
大型web應(yīng)用常常要使用負(fù)載均衡來滿足用戶對使用服務(wù)的效率需求。這種負(fù)載均衡可以在各個層面上應(yīng)用,例如數(shù)據(jù)庫層面的負(fù)載均衡、web服務(wù)器的負(fù)載均衡等等。
而DNS也可以作為一種全局的負(fù)載均衡手段來提高應(yīng)用的性能。從原理上說,就是在DNS服務(wù)器上,為同一個域名配置多個不同的IP地址,這樣用戶在查詢IP地址時就會獲得其中一個IP進(jìn)行訪問,這樣就起到了分流的作用。
即用TCP,也用UDP
DNS協(xié)議是一個比較另類的應(yīng)用層協(xié)議,它即使用了TCP協(xié)議,也使用了UDP協(xié)議,端口都是53。在查詢時優(yōu)先選擇UDP,區(qū)域數(shù)據(jù)傳輸必須采用TCP。
一些DNS相關(guān)命令
- dig
www:~ leo$ dig @a.gtld-servers.net github.com
; <<>> DiG 9.8.3-P1 <<>> @a.gtld-servers.net github.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 61943
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 8, ADDITIONAL: 6
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;github.com. IN A
;; AUTHORITY SECTION:
github.com. 172800 IN NS ns1.p16.dynect.net.
github.com. 172800 IN NS ns3.p16.dynect.net.
github.com. 172800 IN NS ns2.p16.dynect.net.
github.com. 172800 IN NS ns4.p16.dynect.net.
github.com. 172800 IN NS ns-520.awsdns-01.net.
github.com. 172800 IN NS ns-421.awsdns-52.com.
github.com. 172800 IN NS ns-1707.awsdns-21.co.uk.
github.com. 172800 IN NS ns-1283.awsdns-32.org.
;; ADDITIONAL SECTION:
ns1.p16.dynect.net. 172800 IN A 208.78.70.16
ns3.p16.dynect.net. 172800 IN A 208.78.71.16
ns2.p16.dynect.net. 172800 IN A 204.13.250.16
ns4.p16.dynect.net. 172800 IN A 204.13.251.16
ns-520.awsdns-01.net. 172800 IN A 205.251.194.8
ns-421.awsdns-52.com. 172800 IN A 205.251.193.165
;; Query time: 392 msec
;; SERVER: 192.5.6.30#53(192.5.6.30)
;; WHEN: Sat Jul 15 18:10:46 2017
;; MSG SIZE rcvd: 344
www:~ leo$
如上例所示,是使用dig命令,向a.gtld-serers.net這個DNS服務(wù)器查詢github.com得到的返回結(jié)果(注意在DNS服務(wù)器前面要加上@符號)??梢栽谄渲械腁UTHORITY SECTION中看到,一共返回了8個SOA的DNS服務(wù)器。如果繼續(xù)向其中幾個查詢,可以得到下面的一些結(jié)果。
例如,訪問ns1.p16.dynect.net,在ANSWER SECTION得到github.com的兩個IP:192.30.255.113、192.30.255.112。這也就是前面說的使用DNS做負(fù)載均衡的一個案例。
www:~ leo$ dig @ns1.p16.dynect.net github.com
; <<>> DiG 9.8.3-P1 <<>> @ns1.p16.dynect.net github.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 5267
;; flags: qr aa rd; QUERY: 1, ANSWER: 2, AUTHORITY: 8, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;github.com. IN A
;; ANSWER SECTION:
github.com. 60 IN A 192.30.255.113
github.com. 60 IN A 192.30.255.112
;; AUTHORITY SECTION:
github.com. 900 IN NS ns4.p16.dynect.net.
github.com. 900 IN NS ns-1707.awsdns-21.co.uk.
github.com. 900 IN NS ns3.p16.dynect.net.
github.com. 900 IN NS ns-421.awsdns-52.com.
github.com. 900 IN NS ns1.p16.dynect.net.
github.com. 900 IN NS ns-520.awsdns-01.net.
github.com. 900 IN NS ns2.p16.dynect.net.
github.com. 900 IN NS ns-1283.awsdns-32.org.
;; Query time: 573 msec
;; SERVER: 208.78.70.16#53(208.78.70.16)
;; WHEN: Sat Jul 15 18:17:20 2017
;; MSG SIZE rcvd: 280
www:~ leo$
- nslookup
該命令也可以返回一個域名的IP地址,如下所示
www:~ leo$ nslookup
> www.jd.com
Server: 211.137.130.3
Address: 211.137.130.3#53
Non-authoritative answer:
www.jd.com canonical name = www.jdcdn.com.
Name: www.jdcdn.com
Address: 111.20.253.129
>
有時如果在瀏覽器中訪問一個網(wǎng)址發(fā)現(xiàn)不能成功,可以用這個命令試一下域名解析是否正確。如果這里正確,那有時可能是電腦的DNS緩存由問題導(dǎo)致的,可以嘗試清除本地緩存。
三、各種緩存
之前說到,在瀏覽器進(jìn)行域名解析時,會向DNS服務(wù)器進(jìn)行查詢。然而實際情況并非怎么簡單直接。為了提高效率,這個過程中有各種分處各個層次的緩存來加速這個過程。這里copy一段來自http://blog.jobbole.com/33951/ 的文字:
- 瀏覽器緩存 – 瀏覽器會緩存DNS記錄一段時間。 有趣的是,操作系統(tǒng)沒有告訴瀏覽器儲存DNS記錄的時間,這樣不同瀏覽器會儲存?zhèn)€自固定的一個時間(2分鐘到30分鐘不等)。
- 系統(tǒng)緩存 – 如果在瀏覽器緩存里沒有找到需要的記錄,瀏覽器會做一個系統(tǒng)調(diào)用(windows里是gethostbyname)。這樣便可獲得系統(tǒng)緩存中的記錄。
- 路由器緩存 – 接著,前面的查詢請求發(fā)向路由器,它一般會有自己的DNS緩存。
- ISP DNS 緩存 – 接下來要check的就是ISP緩存DNS的服務(wù)器。在這一般都能找到相應(yīng)的緩存記錄。
- 遞歸搜索 – 你的ISP的DNS服務(wù)器從根域名服務(wù)器開始進(jìn)行遞歸搜索,從.com頂級域名服務(wù)器到Facebook的域名服務(wù)器。一般DNS服務(wù)器的緩存中會有.com域名服務(wù)器中的域名,所以到頂級服務(wù)器的匹配過程不是那么必要了。
后記
關(guān)于DNS的知識還是很龐大復(fù)雜的,后面有機(jī)會再進(jìn)一步學(xué)習(xí)了解吧。
另外,追加個鏈接:http://www.cnblogs.com/ityouknow/p/6380603.html
大致說的是一家p2p金融公司由于人員離職的交接工作沒做到位,導(dǎo)致公司買的DNS服務(wù)欠費,使得有的用戶無法訪問公司網(wǎng)站,結(jié)果有些用戶以為公司準(zhǔn)備跑路,到處散播恐慌消息。給公司帶來不小影響??催^后即覺得挺好笑的,也深深覺得要保證做好一個業(yè)務(wù),真的是一點馬虎不得啊。
參考
http://blog.csdn.net/jiangsd198/article/details/60780187
https://segmentfault.com/a/1190000002578457