DNS解析和DNS緩存

一、DNS解析

DNS解析也即是我們說的域名解析,為了方便記憶,網(wǎng)站都是注冊了一個域名,通過域名來訪問網(wǎng)站。訪問網(wǎng)站內(nèi)容,實際是通過訪問IP地址實現(xiàn)的,所以在域名和IP之前存在一種對應(yīng)關(guān)系,而域名解析服務(wù)器即DNS服務(wù)器則完成將域名翻譯成IP地址的任務(wù)。

對于用戶來說,永遠不需要關(guān)心訪問的IP地址是多少,只需要輸入域名即可,所以當IP發(fā)生變化時對用戶沒有一點影響,這就是動態(tài)域名解析。域名服務(wù)器承載著IP與域名的管理工作和解析工作,當域名對應(yīng)的IP出現(xiàn)變化時,域名服務(wù)器需要重新進行配置。

動態(tài)域名:域名對應(yīng)的IP地址不是固定的,是變化的,當IP變化后,計算機的域名軟件會將新的IP發(fā)送到域名服務(wù)器,域名服務(wù)器進行配置更新。

靜態(tài)域名:域名對應(yīng)的IP地址是固定的。

DNS查詢請求類型

DNS服務(wù)器對于客戶請求的答復(fù)具有多種類型,常見的有以下四種:

權(quán)威答復(fù):權(quán)威答復(fù)是返回給客戶的正向答復(fù),并且設(shè)置了DNS消息中的權(quán)威位。此答復(fù)代表從具有權(quán)威的DNS服務(wù)器處發(fā)出;

正向答復(fù):正向答復(fù)包含了匹配客戶端解析請求的資源記錄;

參考答復(fù):參考答復(fù)只在DNS服務(wù)器工作在迭代模式下使用,包含了其他有助于客戶端解析請求的信息。例如,當DNS服務(wù)器不能為客戶端發(fā)起的解析請求找到某個匹配值時,則向DNS客戶端發(fā)送參考回復(fù),告訴它有助于解析請求的信息;

否定答復(fù):否定答復(fù)指出權(quán)威服務(wù)器在解析客戶端的請求時可能遇到了以下兩種情況之一:

????????????????????權(quán)威DNS服務(wù)器報告客戶端查詢的名字不存在;

????????????????????權(quán)威DNS服務(wù)器報告存在對應(yīng)的名字但是不存在指定類型的資源記錄。

無論正向答復(fù)還是否定答復(fù),DNS客戶端都將結(jié)果保存在自己的本地緩存中。

DNS的TTL是指Time to live,既存活時間。

DNS服務(wù)器對IP返回會有一些策略保證客戶訪問對服務(wù)器的負載均衡或速度保證,如IP隨機返回,按最近離用戶最近IP返回等,其主要的控制策略是調(diào)整列表中第一個返回的IP。RFC1794解釋了dns對負載均衡的支持:http://www.faqs.org/rfcs/rfc1794.html

一般的客戶端(如瀏覽器)對DNS返回的IP的選擇是取第一個IP,如果第一個IP失敗了再去取第二個IP。也有一些客戶端在連接第一個IP失敗后就直接失敗了

二、各個環(huán)節(jié)的DNS緩存介紹

瀏覽器 DNS緩存

瀏覽器DNS緩存的時間跟DNS服務(wù)器返回的TTL值無關(guān)。

瀏覽器在獲取網(wǎng)站域名的實際IP地址后會對其IP進行緩存,減少網(wǎng)絡(luò)請求的損耗。每種瀏覽器都有一個固定的DNS緩存時間,其中Chrome的過期時間是1分鐘,在這個期限內(nèi)不會重新請求DNS。Chrome瀏覽器看本身的DNS緩存時間比較方便,在地址欄輸入

chrome://net-internals/#dns

就能看到看瀏覽器的緩存

Java DNS緩存

Java的網(wǎng)絡(luò)應(yīng)用程序的DNS緩存是由JVM的緩存策略控制的,當InetAddress類第一次使用某個域名(如www.google.com)創(chuàng)建InetAddress對象后,JVM就會將這個域名和它從DNS上獲得的信息(如IP地址)都保存在DNS緩存中。當下一次InetAddress類再使用這個域名時,就直接從DNS緩存里獲得所需的信息,而無需再訪問DNS服務(wù)器。兩種方式更改這個值:

可以在應(yīng)用程序中直接設(shè)置緩存過期時間:

java.security.Security.setProperty("<span style="color:#e45649">networkaddress</span><span style="color:#986801">.cache</span><span style="color:#986801">.ttl</span>"</span>, <span style="color:#2aa198">10</span>);

</code></span>

更改jre中security文件中的設(shè)置 C:\Program Files\Java\jre1.8.0_31\lib\security\java.security

The Java-level namelookup cache policy for successful lookups:

any negative value: caching forever

any positive value: the number of seconds to cache an address for

zero: do not cache

default value is forever (FOREVER). For security reasons, this

caching is made forever when a security manager is set. When a security

manager is not set, the default behavior in this implementation

is to cache for 30 seconds.

networkaddress.cache.negative.ttl=10

networkaddress.cache.ttl=-1

該文件中的文字對以上值已經(jīng)解釋的比較清楚。cache.negative.ttl就是指緩存DNS否定答復(fù)的時間。

OS DNS緩存

OS緩存會參考DNS服務(wù)器響應(yīng)的TTL值,但是不完全等于TTL值。

測試,以知乎的DNS解析為例:

<span style="color:#657b83"><code>C:\windows\system32>ipconfig /displaydns

</code></span>

www.zhihu.com

記錄名稱. . . . . . . : www.zhihu.com

記錄類型. . . . . . . : 1

生存時間. . . . . . . : 323 (秒)

數(shù)據(jù)長度. . . . . . . : 4

部分. . . . . . . . . : 答案

A (主機)記錄 . . . . : 60.28.215.71

記錄名稱. . . . . . . : www.zhihu.com

記錄類型. . . . . . . : 1

生存時間. . . . . . . : 323

數(shù)據(jù)長度. . . . . . . : 4

部分. . . . . . . . . : 答案

A (主機)記錄 . . . . : 60.28.215.70

通過域名解析命令獲取ISP端的域名服務(wù)中的TTL時間:

C:\Users\cmcc>nslookup -d www.zhihu.com

</code></span>

服務(wù)器: ns4.zj.chinamobile.com

Address: 211.140.188.188

Got answer:

HEADER:

opcode = QUERY, id = 2, rcode = NOERROR

header flags: response, want recursion, recursion avail.

questions = 1, answers = 2, authority records = 2, additional = 18

QUESTIONS:

www.zhihu.com, type = A, class = IN

ANSWERS:

-> www.zhihu.com

internet address = 60.28.215.71

ttl = 900 (15 mins)

-> www.zhihu.com

internet address = 60.28.215.70

ttl = 900 (15 mins)

AUTHORITY RECORDS:

-> zhihu.com

nameserver = ns3.dnsv4.com

ttl = 136 (2 mins 16 secs)

可以看到本地ISP服務(wù)器上緩存的時間是15分鐘,就算刷新了本機操作系統(tǒng)緩存,ISP上仍然存在。

Windows

Windows2003之前的DNS緩存設(shè)置時間在注冊表的位置是HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Dnscache/Parameters

鍵名MaxCacheEntryTtlLimit,為DNS緩存條目TTL最大值,在XP和2003系統(tǒng)中此項名稱為MaxCacheTtl。

MSDN中對此有詳細介紹:https://technet.microsoft.com/en-us/library/cc959517.aspx

非常詳細的解釋了DNS域TTL與操作系統(tǒng)的DNS緩存策略的關(guān)系:

The default value for MaxCacheEntryTtlLimit is DWORD = 0x15180 = 86400 seconds = 1 day

if DNS zone TTL < MaxCacheEntryTtlLimit, then DNS TTL is used

if DNS zone TTL > MaxCacheEntryTtlLimit, then MaxCacheEntryTtlLimit is used

以下命令windows系統(tǒng)可使用:


ipconfig?/displaydns 顯示本機dns, 生存時間,?80-8000都有

ipconfig /flushdns 刷新windows dns緩存

Android

Addresses are cached for 600 seconds (10 minutes) by default. Failed lookups are cached for 10 seconds.

DNS caching

In Android 4.0 (Ice Cream Sandwich) and earlier, DNS caching was performed both by InetAddress and by the C library, which meant that DNS TTLs could not be honored correctly. In later releases, caching is done solely by the C library and DNS TTLs are honored.

IOS

按照官方文檔說法,iOS 設(shè)備上每24小時刷新一次DNS緩存

其他系統(tǒng)的DNS相關(guān)命令

MAC

lookupd-flushcache 清緩存

Linux

/etc/init.d/nscd restart 清緩存

ipconfig/displaydns?? -查看被緩存的域名解析

?ipconfig/flushdns ? ? ? -清空DNS緩存

ISP DNS緩存

ISP(電信運營商)緩存有些不靠譜,有些緩存服務(wù)器(不多)會忽略網(wǎng)站DNS提供的TTL,自己設(shè)置一個較長的TTL,導(dǎo)致頂級DNS更新時不能及時拿到新的IP地址。

可以看出,在從Root DNS請求域名解析的過程中,有太多的層次影響DNS的獲取,緩存是雙刃劍,提高了獲取DNS的速度,也會影響DNS在IP變更時不能及時更新到最新。

?著作權(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ù)。

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