DNS域名解析過程

五月的倉頡發表於2015-11-02

前言

本文來自《深入分析Java Web技術內幕》一書,因為本人對DNS不是特別熟悉,這本書關於DNS的部分也已經講得比較詳細了,所以就直接把書裡面的內容拿來用了。老規矩,不復制、不黏貼,全部內容手打,邊打邊學習、理解。

 

DNS域名解析

我們知道網際網路都是通過URL來發布和請求資源的,而URL中的域名需要解析成IP地址才能與遠端主機建立連線,如何將域名解析成IP地址就屬於DNS解析的工作範疇。

可以毫不誇張地說,雖然我們平時上網感受不到DNS解析的存在,但是一旦DNS解析出錯,可能會導致非常嚴重的網際網路災難。目前世界上的整個網際網路有幾個DNS根域名伺服器,任何一臺根伺服器壞掉,後果都非常嚴重。

 

DNS域名解析過程

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

整個過程大體描述如下,其中前兩個步驟是在本機完成的,後8個步驟涉及到真正的域名解析伺服器:

1、瀏覽器會檢查快取中有沒有這個域名對應的解析過的IP地址,如果快取中有,這個解析過程就結束。瀏覽器快取域名也是有限制的,不僅瀏覽器快取大小有限制,而且快取的時間也有限制,通常情況下為幾分鐘到幾小時不等,域名被快取的時間限制可以通過TTL屬性來設定。這個快取時間太長和太短都不太好,如果時間太長,一旦域名被解析到的IP有變化,會導致被客戶端快取的域名無法解析到變化後的IP地址,以致該域名不能正常解析,這段時間內有一部分使用者無法訪問網站。如果設定時間太短,會導致使用者每次訪問網站都要重新解析一次域名。

2、如果使用者瀏覽器快取中沒有資料,瀏覽器會查詢作業系統快取中是否有這個域名對應的DNS解析結果。其實作業系統也有一個域名解析的過程,在Windows中可以通過C:\Windows\System32\drivers\etc\hosts檔案來設定,在Linux中可以通過/etc/hosts檔案來設定,使用者可以將任何域名解析到任何能夠訪問的IP地址。例如,我們在測試時可以將一個域名解析到一臺測試伺服器上,這樣不用修改任何程式碼就能測試到單獨伺服器上的程式碼的業務邏輯是否正確。正是因為有這種本地DNS解析的規程,所以有黑客就可能通過修改使用者的域名來把特定的域名解析到他指定的IP地址上,導致這些域名被劫持。

3、前兩個過程無法解析時,就要用到我們網路配置中的"DNS伺服器地址"了。作業系統會把這個域名傳送給這個LDNS,也就是本地區的域名伺服器。這個DNS通常都提供給使用者本地網際網路接入的一個DNS解析服務,例如使用者是在學校接入網際網路,那麼使用者的DNS伺服器肯定在學校;如果使用者是在小區接入網際網路,那麼使用者的DNS就是再提供接入網際網路的應用提供商,即電信或聯通,也就是通常說的SPA,那麼這個DNS通常也會在使用者所在城市的某個角落,不會很遠。Windows環境下通過命令列輸入ipconfig,Linux環境下通過cat /etc/resolv.conf就可以查詢配置的DNS伺服器了。這個專門的域名解析伺服器效能都會很好,它們一般都會快取域名解析結果,當然快取時間是受到域名的失效時間控制的。大約80%的域名解析到這裡就結束了,所以LDNS主要承擔了域名的解析工作。

4、如果LDNS仍然沒有命中,就直接到Root Server域名伺服器請求解析

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

6、本地域名伺服器LDNS再向上一步返回的gTLD伺服器傳送請求

7、接受請求的gTLD伺服器查詢並返回此域名對應的Name Server域名伺服器的地址,這個Name Server通常就是使用者註冊的域名伺服器,例如使用者在某個域名服務提供商申請的域名,那麼這個域名解析任務就由這個域名提供商的伺服器來完成

8、Name Server域名伺服器會查詢儲存的域名和IP的對映關係表,在正常情況下都根據域名得到目標IP地址,連同一個TTL值返回給DNS Server域名伺服器

9、返回該域名對應的IP和TTL值,LDNS會快取這個域名和IP的對應關係,快取時間由TTL值控制

10、把解析的結果返回給使用者,使用者根據TTL值快取在本地系統快取中,域名解析過程結束

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

 

清除快取的域名

我們知道DNS域名解析後會快取解析結果,其中主要在兩個地方快取:

1、Local DNS Server

2、使用者的本地機器

這兩個快取都是TTL值和本機快取大小控制的,但是最大快取時間是TTL值,基本上Local DNS Server的快取時間就是TTL控制的,很難人工介入,但是我們的本機快取可以通過如下方式清除:

1、Windows環境下可以再命令列執行ipconfig /flushdns命令來重新整理快取,如圖

2、Linux環境下可以通過/etc/init.d/nscd restart來清除快取,因為我家裡電腦裝的虛擬機器比較卡,就不截圖了

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

在Java應用中JVM也會快取DNS的解析結果,這個快取是在InetAddress類中完成的,而且這個快取時間還比較特殊,它有兩種快取策略:

1、正確解析結果快取

2、失敗解析結果快取

這兩個快取時間有兩個配置項控制,配置項在%JAVA_HOME%\lib\security\java.security檔案中配置的,這兩個配置項分別是networkaddress.cache.ttl和networkaddress.cache.negative.ttl,它們的預設值分別是-1(永不失效)和10(快取10秒),直接修改這兩個值就可以了,也可以通過在Java啟動引數中增加-Dsun.net.inetaddr.ttl=xxx來修改預設值,也可以通過InetAddress類動態修改。

 

幾種域名解析方式

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

1、A記錄

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

2、MX記錄

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

3、CNAME記錄

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

4、NS記錄

為某個域名指定DNS解析伺服器,也就是這個域名由指定的IP地址的DNS伺服器取解析

5、TXT記錄

為某個主機名或域名設定說明,如可以為ddd.net設定TXT記錄為"這是XXX的部落格"這樣的說明

 

相關文章