DNS域名解析詳解

前言

本文來自《深入分析Java Web技術(shù)內(nèi)幕》一書,因?yàn)楸救藢NS不是特別熟悉,這本書關(guān)于DNS的部分也已經(jīng)講得比較詳細(xì)了,所以就直接把書里面的內(nèi)容拿來用了。老規(guī)矩,不復(fù)制、不黏貼,全部內(nèi)容手打,邊打邊學(xué)習(xí)、理解。

DNS域名解析

我們知道互聯(lián)網(wǎng)都是通過URL來發(fā)布和請求資源的,而URL中的域名需要解析成IP地址才能與遠(yuǎn)程主機(jī)建立連接,如何將域名解析成IP地址就屬于DNS解析的工作范疇。

DNS域名解析過程

當(dāng)我們在瀏覽器中輸入www.abc.com時(shí),DNS解析將會有將近10個(gè)步驟,這個(gè)過程大體大體由一張圖可以表示:

整個(gè)過程大體描述如下,其中前兩個(gè)步驟是在本機(jī)完成的,后8個(gè)步驟涉及到真正的域名解析服務(wù)器:

1、瀏覽器會檢查緩存中有沒有這個(gè)域名對應(yīng)的解析過的IP地址,如果緩存中有,這個(gè)解析過程就結(jié)束。瀏覽器緩存域名也是有限制的,不僅瀏覽器緩存大小有限制,而且緩存的時(shí)間也有限制,通常情況下為幾分鐘到幾小時(shí)不等,域名被緩存的時(shí)間限制可以通過TTL屬性來設(shè)置。這個(gè)緩存時(shí)間太長和太短都不太好,如果時(shí)間太長,一旦域名被解析到的IP有變化,會導(dǎo)致被客戶端緩存的域名無法解析到變化后的IP地址,以致該域名不能正常解析,這段時(shí)間內(nèi)有一部分用戶無法訪問網(wǎng)站。如果設(shè)置時(shí)間太短,會導(dǎo)致用戶每次訪問網(wǎng)站都要重新解析一次域名。

2、如果用戶瀏覽器緩存中沒有數(shù)據(jù),瀏覽器會查找操作系統(tǒng)緩存中是否有這個(gè)域名對應(yīng)的DNS解析結(jié)果。其實(shí)操作系統(tǒng)也有一個(gè)域名解析的過程,在Windows中可以通過C:\Windows\System32\drivers\etc\hosts文件來設(shè)置,在Linux中可以通過/etc/hosts文件來設(shè)置,用戶可以將任何域名解析到任何能夠訪問的IP地址。例如,我們在測試時(shí)可以將一個(gè)域名解析到一臺測試服務(wù)器上,這樣不用修改任何代碼就能測試到單獨(dú)服務(wù)器上的代碼的業(yè)務(wù)邏輯是否正確。正是因?yàn)橛羞@種本地DNS解析的規(guī)程,所以有黑客就可能通過修改用戶的域名來把特定的域名解析到他指定的IP地址上,導(dǎo)致這些域名被劫持。

3、前兩個(gè)過程無法解析時(shí),就要用到我們網(wǎng)絡(luò)配置中的"DNS服務(wù)器地址"了。操作系統(tǒng)會把這個(gè)域名發(fā)送給這個(gè)LDNS,也就是本地區(qū)的域名服務(wù)器。這個(gè)DNS通常都提供給用戶本地互聯(lián)網(wǎng)接入的一個(gè)DNS解析服務(wù),例如用戶是在學(xué)校接入互聯(lián)網(wǎng),那么用戶的DNS服務(wù)器肯定在學(xué)校;如果用戶是在小區(qū)接入互聯(lián)網(wǎng),那么用戶的DNS就是再提供接入互聯(lián)網(wǎng)的應(yīng)用提供商,即電信或聯(lián)通,也就是通常說的SPA,那么這個(gè)DNS通常也會在用戶所在城市的某個(gè)角落,不會很遠(yuǎn)。Windows環(huán)境下通過命令行輸入ipconfig,Linux環(huán)境下通過cat /etc/resolv.conf就可以查詢配置的DNS服務(wù)器了。這個(gè)專門的域名解析服務(wù)器性能都會很好,它們一般都會緩存域名解析結(jié)果,當(dāng)然緩存時(shí)間是受到域名的失效時(shí)間控制的。大約80%的域名解析到這里就結(jié)束了,所以LDNS主要承擔(dān)了域名的解析工作。

4、如果LDNS仍然沒有命中,就直接到Root Server域名服務(wù)器請求解析。

5、根域名服務(wù)器返回給本地域名服務(wù)器一個(gè)所查詢的主域名服務(wù)器(gTLD Server)地址。gTLD是國際頂級域名服務(wù)器,如.com、.cn、.org等,全球只有13臺左右

6、本地域名服務(wù)器LDNS再向上一步返回的gTLD服務(wù)器發(fā)送請求

7、接受請求的gTLD服務(wù)器查找并返回此域名對應(yīng)的Name Server域名服務(wù)器的地址,這個(gè)Name Server通常就是用戶注冊的域名服務(wù)器,例如用戶在某個(gè)域名服務(wù)提供商申請的域名,那么這個(gè)域名解析任務(wù)就由這個(gè)域名提供商的服務(wù)器來完成

8、Name Server域名服務(wù)器會查詢存儲的域名和IP的映射關(guān)系表,在正常情況下都根據(jù)域名得到目標(biāo)IP地址,連同一個(gè)TTL值返回給DNS Server域名服務(wù)器

9、返回該域名對應(yīng)的IP和TTL值,LDNS會緩存這個(gè)域名和IP的對應(yīng)關(guān)系,緩存時(shí)間由TTL值控制

10、把解析的結(jié)果返回給用戶,用戶根據(jù)TTL值緩存在本地系統(tǒng)緩存中,域名解析過程結(jié)束

在實(shí)際的DNS解析過程中,可能還不止這10步,如Name Server可能有很多級,或者有一個(gè)GTM來負(fù)載均衡控制,這都有可能會影響域名解析過程。

清除緩存的域名

我們知道DNS域名解析后會緩存解析結(jié)果,其中主要在兩個(gè)地方緩存:

1、Local DNS Server

2、用戶的本地機(jī)器

這兩個(gè)緩存都是TTL值和本機(jī)緩存大小控制的,但是最大緩存時(shí)間是TTL值,基本上Local DNS Server的緩存時(shí)間就是TTL控制的,很難人工介入,但是我們的本機(jī)緩存可以通過如下方式清除:

1、Windows環(huán)境下可以再命令行執(zhí)行ipconfig /flushdns命令來刷新緩存,如圖

2、Linux環(huán)境下可以通過/etc/init.d/nscd restart來清除緩存,因?yàn)槲壹依镫娔X裝的虛擬機(jī)比較卡,就不截圖了

重啟依然是解決很多問題的第一選擇。

在Java應(yīng)用中JVM也會緩存DNS的解析結(jié)果,這個(gè)緩存是在InetAddress類中完成的,而且這個(gè)緩存時(shí)間還比較特殊,它有兩種緩存策略:

1、正確解析結(jié)果緩存

2、失敗解析結(jié)果緩存

這兩個(gè)緩存時(shí)間有兩個(gè)配置項(xiàng)控制,配置項(xiàng)在%JAVA_HOME%\lib\security\java.security文件中配置的,這兩個(gè)配置項(xiàng)分別是networkaddress.cache.ttl和networkaddress.cache.negative.ttl,它們的默認(rèn)值分別是-1(永不失效)和10(緩存10秒),直接修改這兩個(gè)值就可以了,也可以通過在Java啟動參數(shù)中增加-Dsun.net.inetaddr.ttl=xxx來修改默認(rèn)值,也可以通過InetAddress類動態(tài)修改。

幾種域名解析方式

域名解析記錄主要分為A記錄、MX記錄、CNAME記錄、NS記錄和TXT記錄:

1、A記錄

A代表Address,用來指定域名對應(yīng)的IP地址,如將item.taobao.com指定到115.238.23.xxx,將switch.taobao.com指定到121.14.24.xxx。A記錄可以將多個(gè)域名解析到一個(gè)IP地址,但是不能將一個(gè)域名解析到多個(gè)IP地址

2、MX記錄

Mail Exchange,就是可以將某個(gè)域名下的郵件服務(wù)器指向自己的Mail Server,如taobao.com域名的A記錄IP地址是115.238.25.xxx,如果將MX記錄設(shè)置為115.238.25.xxx,即xxx@taobao.com的郵件路由,DNS會將郵件發(fā)送到115.238.25.xxx所在的服務(wù)器,而正常通過Web請求的話仍然解析到A記錄的IP地址

3、CNAME記錄

Canonical Name,即別名解析。所謂別名解析就是可以為一個(gè)域名設(shè)置一個(gè)或者多個(gè)別名,如將aaa.com解析到bbb.net、將ccc.com也解析到bbb.net,其中bbb.net分別是aaa.com和ccc.com的別名

4、NS記錄

為某個(gè)域名指定DNS解析服務(wù)器,也就是這個(gè)域名由指定的IP地址的DNS服務(wù)器取解析

5、TXT記錄

為某個(gè)主機(jī)名或域名設(shè)置說明,如可以為ddd.net設(shè)置TXT記錄為"這是XXX的博客"這樣的說明

?關(guān)于DNS解析的TTL參數(shù):

我們在配置DNS解析的時(shí)候,有一個(gè)參數(shù)常常容易忽略,就是DNS解析的TTL參數(shù),Time To Live。TTL這個(gè)參數(shù)告訴本地DNS服務(wù)器,域名緩存的最長時(shí)間。用阿里云解析來舉例,阿里云解析默認(rèn)的TTL是10分鐘,10分鐘的含義是,本地DNS服務(wù)器對于域名的緩存時(shí)間是10分鐘,10分鐘之后,本地DNS服務(wù)器就會刪除這條記錄,刪除之后,如果有用戶訪問這個(gè)域名,就要重復(fù)一遍上述復(fù)雜的流程。

其實(shí),如果網(wǎng)站已經(jīng)進(jìn)入穩(wěn)定發(fā)展的狀態(tài),不會輕易更換IP地址,我們完全可以將TTL設(shè)置到協(xié)議最大值,即24小時(shí)。帶來的好處是,讓域名解析記錄能夠更長時(shí)間的存放在本地DNS服務(wù)器中,以加快所有用戶的訪問。設(shè)置成24小時(shí),其實(shí),還解決了Googlebot在全球部署的服務(wù)器抓取網(wǎng)站可能帶來的問題,這個(gè)問題麥新杰專門有一篇博文,請參考:“Googlebot無法訪問您的站點(diǎn)”問題理解和處理方法

阿里云之所以只將TTL設(shè)置成10分鐘,是為了讓域名解析更快生效而已。因?yàn)橹暗慕馕鰰谧铋L10分鐘之后失效(本地DNS服務(wù)器將對應(yīng)的解析條目刪除),然后新的解析生效。如果是24小時(shí),這個(gè)生效的時(shí)間最長就是24小時(shí),甚至更長(本地DNS服務(wù)器要有用戶請求,才會發(fā)起查詢)。

域名解析簡略步驟:

例如,要查詢www.baidu.com的IP地址(DNS解析url):

瀏覽器搜索自己的DNS緩存(維護(hù)一張域名與IP地址的對應(yīng)表)

若沒有,則搜索操作系統(tǒng)中的DNS緩存(維護(hù)一張域名與IP地址的對應(yīng)表)

若沒有,則搜索操作系統(tǒng)的hosts文件(Windows環(huán)境下,維護(hù)一張域名與IP地址的對應(yīng)表,位置一般在 C:\Windows\System32\drivers\etc\hosts)

若沒有,則操作系統(tǒng)將域名發(fā)送至本地域名服務(wù)器- -(遞歸查詢方式),本地域名服務(wù)器 查詢自己的DNS緩存,查找成功則返回結(jié)果,否則,(以下是迭代查詢方式)

4.1本地域名服務(wù)器向根域名服務(wù)器(其雖然沒有每個(gè)域名的具體信息,但存儲了負(fù)責(zé)每個(gè)域,如com、net、org等的解析的頂級域名服務(wù)器的地址)發(fā)起請求,此處,根域名服務(wù)器返回com域的頂級域名服務(wù)器的地址

4.2本地域名服務(wù)器向com域的頂級域名服務(wù)器發(fā)起請求,返回baidu.com權(quán)限域名服務(wù)器(權(quán)限域名服務(wù)器,用來保存該區(qū)中的所有主機(jī)域名到IP地址的映射)地址

4.3本地域名服務(wù)器向baidu.com權(quán)限域名服務(wù)器發(fā)起請求,得到www.baidu.com的IP地址

本地域名服務(wù)器將得到的IP地址返回給操作系統(tǒng),同時(shí)自己也將IP地址緩存起來

操作系統(tǒng)將 IP 地址返回給瀏覽器,同時(shí)自己也將IP地址緩存起來

至此,瀏覽器已經(jīng)得到了域名對應(yīng)的IP地址

轉(zhuǎn)自:https://blog.csdn.net/victorde/article/details/79975880

相關(guān)內(nèi)容:https://study.163.com/course/courseMain.htm?courseId=1210406206&share=2&shareId=480000002227524

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

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