當(dāng)你在瀏覽器中輸入網(wǎng)址后按下回車,會發(fā)生什么事情 - (一)DNS解析

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

一、DNS域名解析

首先,我們得在瀏覽器里輸入一個網(wǎng)址,就拿taobao做例子 吧。

image.png

輸入后按下回車,這時候瀏覽器會首先進(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域名查詢的報文

image.png

這里對查詢報文的具體格式就不深究了。只單獨說下圖中最下方二進(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)答報文如下圖,它與查詢報文的格式是很相似的。

image.png

二、關(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)系起來的。這里盜個圖

image.png

如上圖所示,域名本身按層次進(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如下圖所示)
image.png

瀏覽器: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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容