Web技術2:DNS域名解析

DNS域名解析過程

當用戶在瀏覽器中輸入域名按下回車之後,比如,請求www.baidu.com。DNS解析大概有以下10個步驟
在這裏插入圖片描述

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

2、如果用戶瀏覽器緩存中沒有數據,瀏覽器會查找操作系統緩存中是否有這個域名對應的DNS解析結果。其實操作系統也有一個域名解析的過程,一般通過家目錄下的\etc\hosts文件來設置(mac、linux),用戶可以將任何域名解析到任何能夠訪問的IP地址。例如,我們在測試時可以將一個域名解析到一臺測試服務器上,這樣不用修改任何代碼就能測試到單獨服務器上的代碼的業務邏輯是否正確。正是因爲有這種本地DNS解析的規程,所以有黑客就可能通過修改用戶的域名來把特定的域名解析到他指定的IP地址上,導致這些域名被劫持。

3、前兩個過程無法解析時,就要用到我們網絡配置中的"DNS服務器地址"了。操作系統會把這個域名發送給這個LDNS,也就是本地區的域名服務器。這個DNS通常都提供給用戶本地互聯網接入的一個DNS解析服務,例如用戶是在學校接入互聯網,那麼用戶的DNS服務器肯定在學校;如果用戶是在小區接入互聯網,那麼用戶的DNS就是再提供接入互聯網的應用提供商,即電信或聯通,也就是通常說的SPA,那麼這個DNS通常也會在用戶所在城市的某個角落,不會很遠。Windows環境下通過命令行輸入ipconfig,Linux環境下通過cat /etc/resolv.conf就可以查詢配置的DNS服務器了。大概是下面這樣

search openvpn
nameserver x.x.x.x

這個專門的域名解析服務器性能都會很好,它們一般都會緩存域名解析結果,當然緩存時間是受到域名的失效時間控制的。大約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來負載均衡控制,這都有可能會影響域名解析過程。

域名解析過程

在Linux和Windows下可以使用nslookup命令來查看域名解析過程和結果,如下

> www.baidu.com
Server:		x.x.x.x
Address:	x.x.x.x#53

Non-authoritative answer:
www.baidu.com	canonical name = www.a.shifen.com.
www.a.shifen.com	canonical name = www.wshifen.com.
Name:	www.wshifen.com
Address: x.x.x.x
Name:	www.wshifen.com
Address: x.x.x.x

或者使用dig www.baidu.com也可以查看到域名的解析過程,這裏就不再演示了,可以自己嘗試一下

清除緩存的域名

我們知道DNS域名解析後會緩存解析結果,其中主要在兩個地方緩存,一個是Local DNS Server,另一個是用戶的本地機器。這兩個緩存都是TTL值和本機緩存大小控制的,但是最大緩存時間是TTL值,基本上Local DNS Server的緩存時間就是TTL控制的,很難人工介入,但是我們的本機緩存可以通過如下方式清除:

1、Windows環境下可以再命令行執行ipconfig /flushdns命令來刷新緩存;Linux環境下可以通過/etc/init.d/nscd restart來清除緩存

2、重啓

在Java應用中JVM也會緩存DNS的解析結果,這個緩存是在InetAddress類中完成的,而且這個緩存時間還比較特殊,它有兩種緩存策略:正確解析結果緩存和失敗解析結果緩存。這兩個緩存時間有兩個配置項控制,配置項在%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記錄:

A記錄

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

MX記錄

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

CNAME記錄

Canonical Name,即別名解析。所謂別名解析就是可以爲一個域名設置一個或者多個別名,如將aaa.com解析到bbb.net等

NS記錄

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

TXT記錄

爲某個主機名或域名設置說明,如可以爲ddd.net設置TXT記錄爲"這是XXX的博客"這樣的說明

文章參考《深入分析Java Web技術內幕》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章