如何獲取瀏覽器的DNS解析時(shí)間
原理:
a <= <random number> t1 http://a-doppler.facebook.com/test_pixel?HTTP1.0&t=1&size=0k t2 http://a-doppler.facebook.com/test_pixel?HTTP1.1&t=2&size=0k t3 http://a-doppler.facebook.com/test_pixel?HTTP1.1&t=3&size=0k t4 http://a-doppler.facebook.com/test_pixel?HTTP1.1&t=4&size=10k t1 = DNS + New Connection +RTT t2 = New Connection + RTT t3 = RTT 10k /(t4–t3)~TCP bandwidth
(來源:《MobilePerformanceVelocity2011.pdf》 by DavidWei.)
這方案有兩個(gè)關(guān)鍵點(diǎn):
1、為了避免各種DNS緩存,每組請(qǐng)求必須用一個(gè)從來沒被用過的全新N級(jí)域名。這就要求你的域名支持泛解析。例如我為了這個(gè)實(shí)踐,開了*.qgy18.com的解析。
2、每組的***個(gè)請(qǐng)求響應(yīng)必須以HTTP/1.0返回。我開始還沒注意這個(gè),經(jīng)aoao提醒才明白,這樣才可以確保后面的請(qǐng)求會(huì)重建Connection。
t2和t1指向同一個(gè)域名,且都需要重新建立連接,所以t2-t1是DNS解析時(shí)間;t2返回Connection: Keep-Alive,t3是在Keep-Alive指定的timeout時(shí)間內(nèi)發(fā)起的新請(qǐng)求,且返回內(nèi)容為空,所以是RTT(Round-Trip Time);t4在t3的基礎(chǔ)上只是把返回內(nèi)容大小由0k變成10k,所以t4-t3是加載這10k資源花費(fèi)的時(shí)間,這就可以得到網(wǎng)絡(luò)帶寬了。為了減少網(wǎng)絡(luò)波動(dòng),也可以多測(cè)幾次取平均值。