
DNS(Domain Name System,域名系統(tǒng)),萬(wàn)維網(wǎng)上作為域名和IP地址相互映射的一個(gè)分布式數(shù)據(jù)庫(kù),能夠使用戶更方便的訪問互聯(lián)網(wǎng),不用記住能夠被機(jī)器直接讀取的IP數(shù)串。通過域名,得到該域名對(duì)應(yīng)IP地址的過程叫做域名解析(或主機(jī)名解析)。DNS將主機(jī)名映射到IP地址上,就像電話本將人名映射到所對(duì)應(yīng)的電話號(hào)碼一樣,當(dāng)在瀏覽器中輸入http://www.baidu.com時(shí),連接到瀏覽器DNS解析器返回服務(wù)器的IP地址。像百度官網(wǎng)的IP地址為14.215.177.38。DNS協(xié)議運(yùn)行在UDP協(xié)議之上,使用端口號(hào)53。在RFC文檔中RFC 2181對(duì)DNS有規(guī)范說明,RFC 2136對(duì)DNS的動(dòng)態(tài)更新進(jìn)行說明,RFC 2308對(duì)DNS查詢的反向緩存進(jìn)行說明。
然而,DNS解析也是存在開銷的,通常瀏覽器查找一個(gè)指定主機(jī)名的IP地址,需要花費(fèi)20到120ms,在DNS解析完成之前,瀏覽器不能從主機(jī)名那里下載任何東西。DNS的查找有以下幾個(gè)步驟:
1) 瀏覽器檢查自身緩存中有沒有被解析過的這個(gè)域名對(duì)應(yīng)的IP地址,如果存在解析就結(jié)束了。
2) 如果瀏覽器緩存中命中,即沒有找到,那么瀏覽器會(huì)檢查操作系統(tǒng)緩存中有沒有對(duì)應(yīng)的已解析過的結(jié)果。在windows操作系統(tǒng)C:\Windows\System32\Drivers\etc路徑下有一個(gè)hosts的文件,在這里如果指定了一個(gè)域名對(duì)應(yīng)的IP地址,那么瀏覽器會(huì)首先使用這個(gè)IP地址進(jìn)行訪問。
3) 如果前面兩步都沒有命中域名,那么才會(huì)請(qǐng)求本地的域名服務(wù)器(LDNS)來解析這個(gè)域名,大約80%的域名解析會(huì)到這里完成。
4) 如果LDNS仍然沒有命中,就會(huì)直接跳到Root Server域名服務(wù)器請(qǐng)求解析。
5) Root Server域名服務(wù)器會(huì)返回一個(gè)查詢域的主域名服務(wù)器給LDNS。
6) 此時(shí)LDNS再發(fā)送一個(gè)請(qǐng)求給上一步返回的主域名服務(wù)器。
7) 接受請(qǐng)求的主域名服務(wù)器查找并返回這個(gè)域名對(duì)應(yīng)的Name Server的地址,Name Server是網(wǎng)站注冊(cè)的域名服務(wù)器。
8) Name Server根據(jù)映射關(guān)系表找一目標(biāo)IP,返回給LDNS。LDNS緩存這個(gè)域名和對(duì)應(yīng)的IP。
9) LDNS把解析的結(jié)果返回給用戶,用戶根據(jù)TTL值緩存到本地系統(tǒng)緩存中。
DNS解析的響應(yīng)時(shí)間依賴于DNS解析器、它所承擔(dān)的請(qǐng)求壓力、客戶端與服務(wù)器的距離和帶寬速度。
TTL(Time To Live)表示查找返回的DNS記錄包含的一個(gè)存活時(shí)間,表明記錄可以被緩存多久,這個(gè)值告訴客戶端可以對(duì)該記錄緩存多久。過期則這個(gè)DNS記錄將被拋棄。盡管操作系統(tǒng)緩存會(huì)考慮TTL值,但瀏覽器通常忽略該值,賆設(shè)置它自己的時(shí)間限制。并且瀏覽器對(duì)緩存DNS的記錄數(shù)量也是有限制的,而不管緩存記錄時(shí)間,如果用戶在短時(shí)間訪問了很多不同域名的網(wǎng)站,較早的DNS記錄將被丟棄,必須重新查詢?cè)撚蛎?/p>
不同的瀏覽器對(duì)于DNS緩存有所不同,Internet Explorer的DNS緩存在[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings]鍵下由三個(gè)設(shè)置控制:
"DnsCacheTimeout"=30分鐘
"KeepAliveTimeout"=1分鐘
"ServerInfoTimeOut"=2分鐘
這表示如果DNS服務(wù)器TTL值小于30分鐘的話,對(duì)瀏覽器進(jìn)行DNS查找的頻率產(chǎn)生的影響很小。
對(duì)于FireFox瀏覽器在about:config中設(shè)置就可以:
network.dnsCacheEntries=400
network.dnsCacheExpiration=60
network.http.keep-alive.timeout=115
在DNS解析過程中,減少唯一主機(jī)名的數(shù)量也呆以縮短DNS解析時(shí)間,如果客戶端的DNS緩存為空時(shí),DNS查找的數(shù)量與Web頁(yè)面中唯一主機(jī)名的數(shù)量相等。但是減少唯一主機(jī)名的數(shù)量有可能減少頁(yè)面中發(fā)生的并行下載量。減少并行下載可能會(huì)增加響應(yīng)時(shí)間。我的準(zhǔn)則是將這些組件分成至少兩個(gè)但不超過四個(gè)主機(jī)名。這在減少DNS查找和允許高度并行下載之間取得了很好的折衷。
綜上所述減少DNS查找通??梢蕴岣唔憫?yīng)性能。