本次內容比較hardcore,非科班出身可能會有理解障礙,可以考慮不用掙扎,直接放棄。畢竟普通駕駛員是不需要理解內燃機原理和曲軸如何做功的,所謂術業有專攻也,能看完的不是同行就是真愛~
引
DNS對于網絡應用的重要性不言而喻,先解釋一下其工作原理。
我們上網的原點就是打開瀏覽器,在上方地址欄輸入網址的那一刻,這個回車按了之后,發生了很多事情。首先,計算機只懂0和1,也就是說人類的字母網址計算機是不懂的,它只認識IP地址,如果是IPV4那就是4組8位的二進制數字。為了人類方便,需要有一個把網址翻譯成IP地址的服務,就是DNS。其工作原理如圖
這是一個高度簡略的示意圖,實際上DNS整個獲取過程是被層層緩存的,一個DNS的獲取并不一定都是從權威處獲得的響應。再來一個復雜點的示意圖:
DNS查詢請求類型
查詢響應類型
DNS服務器對于客戶請求的答復具有多種類型,常見的有以下四種:
權威答復:權威答復是返回給客戶的正向答復,并且設置了DNS消息中的權威位。此答復代表從具有權威的DNS服務器處發出;
正向答復:正向答復包含了匹配客戶端解析請求的資源記錄;
參考答復:參考答復只在DNS服務器工作在迭代模式下使用,包含了其他有助于客戶端解析請求的信息。例如,當DNS服務器不能為客戶端發起的解析請求找到某個匹配值時,則向DNS客戶端發送參考回復,告訴它有助于解析請求的信息;
否定答復:否定答復指出權威服務器在解析客戶端的請求時可能遇到了以下兩種情況之一:
權威DNS服務器報告客戶端查詢的名字不存在;
權威DNS服務器報告存在對應的名字但是不存在指定類型的資源記錄。
無論正向答復還是否定答復,DNS客戶端都將結果保存在自己的本地緩存中。
DNS的TTL是指Time to live,既存活時間。
DNS服務器解析返回IP分配策略與客戶端對域名IP選擇策略
一個簡單測試,先解析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。
一般的客戶端(如瀏覽器)對DNS返回的IP的選擇是取第一個IP,如果第一個IP失敗了再去取第二個IP。也有一些客戶端在連接第一個IP失敗后就直接失敗了。
各個環節的DNS緩存介紹
瀏覽器 DNS緩存
瀏覽器DNS緩存的時間跟DNS服務器返回的TTL值無關。
瀏覽器在獲取網站域名的實際IP地址后會對其IP進行緩存,減少網絡請求的損耗。每種瀏覽器都有一個固定的DNS緩存時間,其中Chrome的過期時間是1分鐘,在這個期限內不會重新請求DNS。Chrome瀏覽器看本身的DNS緩存時間比較方便,在地址欄輸入
就能看到看瀏覽器的緩存
Java 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 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 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緩存
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 = 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服務器上緩存的時間是15分鐘,就算刷新了本機操作系統緩存,ISP上仍然存在。
Windows
Windows2003之前的DNS緩存設置時間在注冊表的位置是HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Services/Dnscache/Parameters
鍵名MaxCacheEntryTtlLimit,為DNS緩存條目TTL最大值,在XP和2003系統中此項名稱為MaxCacheTtl。
MSDN中對此有詳細介紹:https://technet.microsoft.com/en-us/library/cc959517.aspx
非常詳細的解釋了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緩存
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設備上每24小時刷新一次DNS緩存
其他系統的DNS相關命令
MAC
lookupd-flushcache 清緩存
linux
/etc/init.d/nscd restart 清緩存
ISP DNS緩存
ISP(電信運營商)緩存有些不靠譜,有些緩存服務器(不多)會忽略網站DNS提供的TTL,自己設置一個較長的TTL,導致頂級DNS更新時不能及時拿到新的IP地址。
可以看出,在從Root DNS請求域名解析的過程中,有太多的層次影響DNS的獲取,緩存是雙刃劍,提高了獲取DNS的速度,也會影響DNS在IP變更時不能及時更新到最新。
文章來自微信平臺「麥芽面包」(微信掃描二維碼關注)。未經允許,禁止轉載。
![]() |
不含病毒。www.avast.com |