本次內容比較hardcore,非科班出身可能會有理解障礙,能夠考慮不用掙扎,直接放棄。畢竟普通駕駛員是不須要理解內燃機原理和曲軸如何作功的,所謂術業有專攻也,能看完的不是同行就是真愛~html
DNS對於網絡應用的重要性不言而喻,先解釋一下其工做原理。java
咱們上網的原點就是打開瀏覽器,在上方地址欄輸入網址的那一刻,這個回車按了以後,發生了不少事情。首先,計算機只懂0和1,也就是說人類的字母網址計算機是不懂的,它只認識IP地址,若是是IPV4那就是4組8位的二進制數字。爲了人類方便,須要有一個把網址翻譯成IP地址的服務,就是DNS。其工做原理如圖linux
這是一個高度簡略的示意圖,實際上DNS整個獲取過程是被層層緩存的,一個DNS的獲取並不必定都是從權威處得到的響應。再來一個複雜點的示意圖:
chrome
查詢響應類型
DNS服務器對於客戶請求的答覆具備多種類型,常見的有如下四種:
權威答覆:權威答覆是返回給客戶的正向答覆,而且設置了DNS消息中的權威位。此答覆表明從具備權威的DNS服務器處發出;
正向答覆:正向答覆包含了匹配客戶端解析請求的資源記錄;
參考答覆:參考答覆只在DNS服務器工做在迭代模式下使用,包含了其餘有助於客戶端解析請求的信息。例如,當DNS服務器不能爲客戶端發起的解析請求找到某個匹配值時,則向DNS客戶端發送參考回覆,告訴它有助於解析請求的信息;
否認答覆:否認答覆指出權威服務器在解析客戶端的請求時可能遇到了如下兩種狀況之一:
權威DNS服務器報告客戶端查詢的名字不存在;
權威DNS服務器報告存在對應的名字可是不存在指定類型的資源記錄。windows
不管正向答覆仍是否認答覆,DNS客戶端都將結果保存在本身的本地緩存中。瀏覽器
DNS的TTL是指Time to live,既存活時間。緩存
一個簡單測試,先解析163域名服務器
C:\Users\cmcc>nslookup www.163.com 服務器: ns4.zj.chinamobile.com Address: 211.140.188.188 非權威應答: 名稱: c01.i05.cmbzj.hadns.net Addresses: 111.1.38.160 111.1.38.159 223.94.95.114 223.94.95.119 Aliases: www.163.com www.163.com.cloudcdn.net c01.i05.hacdn.net
能夠看到該域名返回了多個IP,DNS服務器對IP返回會有一些策略保證客戶訪問對服務器的負載均衡或速度保證,如IP隨機返回,按最近離用戶最近IP返回等,其主要的控制策略是調整列表中第一個返回的IP。RFC1794解釋了dns對負載均衡的支持:
http://www.faqs.org/rfcs/rfc1... 微信
通常的客戶端(如瀏覽器)對DNS返回的IP的選擇是取第一個IP,若是第一個IP失敗了再去取第二個IP。也有一些客戶端在鏈接第一個IP失敗後就直接失敗了。網絡
瀏覽器DNS緩存的時間跟DNS服務器返回的TTL值無關。
瀏覽器在獲取網站域名的實際IP地址後會對其IP進行緩存,減小網絡請求的損耗。每種瀏覽器都有一個固定的DNS緩存時間,其中Chrome的過時時間是1分鐘,在這個期限內不會從新請求DNS。Chrome瀏覽器看自己的DNS緩存時間比較方便,在地址欄輸入
chrome://net-internals/#dns
就能看到看瀏覽器的緩存
Java的網絡應用程序的DNS緩存是由JVM的緩存策略控制的,當InetAddress類第一次使用某個域名(如www.google.com)建立InetAddress對象後,JVM就會將這個域名和它從DNS上得到的信息(如IP地址)都保存在DNS緩存中。當下一次InetAddress類再使用這個域名時,就直接從DNS緩存裏得到所需的信息,而無需再訪問DNS服務器。兩種方式更改這個值:
能夠在應用程序中直接設置緩存過時時間:
java.security.Security.setProperty("networkaddress.cache.ttl", 10);
更改jre中security文件中的設置 C:Program FilesJavajre1.8.0_31libsecurityjava.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 cachedefault 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
該文件中的文字對以上值已經解釋的比較清楚。cache.negative.ttl就是指緩存DNS否認答覆的時間。
OS緩存會參考DNS服務器響應的TTL值,可是不徹底等於TTL值。
測試,以知乎的DNS解析爲例:
C:\windows\system32>ipconfig /displaydns
www.zhihu.com
記錄名稱. . . . . . . : www.zhihu.com
記錄類型. . . . . . . : 1
生存時間. . . . . . . : 323 (秒)
數據長度. . . . . . . : 4
部分. . . . . . . . . : 答案
A (主機)記錄 . . . . : 60.28.215.71記錄名稱. . . . . . . : www.zhihu.com
記錄類型. . . . . . . : 1
生存時間. . . . . . . : 323
數據長度. . . . . . . : 4
部分. . . . . . . . . : 答案
A (主機)記錄 . . . . : 60.28.215.70
經過域名解析命令獲取ISP端的域名服務中的TTL時間:
C:\Users\cmcc>nslookup -d www.zhihu.com
服務器: 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 = 18QUESTIONS:
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服務器上緩存的時間是15分鐘,就算刷新了本機操做系統緩存,ISP上仍然存在。
Windows2003以前的DNS緩存設置時間在註冊表的位置是HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Dnscache/Parameters
鍵名MaxCacheEntryTtlLimit,爲DNS緩存條目TTL最大值,在XP和2003系統中此項名稱爲MaxCacheTtl。
MSDN中對此有詳細介紹:https://technet.microsoft.com...
很是詳細的解釋了DNS域TTL與操做系統的DNS緩存策略的關係:
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系統可以使用:
ipconfig /displaydns 顯示本機dns, 生存時間, 80-8000都有 ipconfig /flushdns 刷新windows dns緩存
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設備上每24小時刷新一次DNS緩存
MAC
lookupd-flushcache 清緩存linux
/etc/init.d/nscd restart 清緩存
ISP(電信運營商)緩存有些不靠譜,有些緩存服務器(很少)會忽略網站DNS提供的TTL,本身設置一個較長的TTL,致使頂級DNS更新時不能及時拿到新的IP地址。
能夠看出,在從Root DNS請求域名解析的過程當中,有太多的層次影響DNS的獲取,緩存是雙刃劍,提升了獲取DNS的速度,也會影響DNS在IP變動時不能及時更新到最新。
文章來自微信平臺「麥芽麪包」(微信掃描二維碼關注)。未經容許,禁止轉載。