很久沒寫博客了,我原先的標題是 「從輸入url到頁面加載完成的XXX」?css
但想着,這是別人嚼爛不少次的內容,缺少挑戰性,並且,頁面操做過程當中能優化的地方實在太多了。html
那就乾脆給本身挖個坑吧,好歹也在運維開發部待過一年的時間。前端
本文將嘗試從先後端或運維多個角度,來述說整個站點從解析到操做過程當中的優化。vue
不少大公司面試喜歡問這樣一道面試題,輸入URL到看見頁面發生了什麼?,今天咱們來總結一下。 簡單來講,共有如下幾個過程webpack
DNS
),找到IP服務器TCP
鏈接,HTTP
三次握手,發送請求(Request
)html css js images
等gzip
壓縮,瀏覽器先解壓)咱們在頁面渲染完成以後執行某些操做:nginx
姑且將以上都歸爲 ==> 8. 界面操做web
還在步驟3:發起TCP鏈接 前插入:面試
下面就讓咱們從DNS解析開始...算法
以Chrome
瀏覽器爲例:chrome
Chrome瀏覽器 會首先搜索瀏覽器自身的DNS緩存。
(緩存時間比較短,默認只有1分鐘,且只能容納1000條緩存)
chrome://net-internals/#dns
來進行查看
Chrome
自身的緩存)
Chrome
會搜索操做系統自身的DNS緩存Windows
- 在Windows
中查看DNS
緩存條目的過程很是簡單。只需打開命令提示符並輸入如下命令:ipconfig /displaydns
。
Mac
- 在Mac
上查看DNS
緩存條目的過程略有不一樣。須要先打開控制檯應用,從左側邊欄選擇設備,而後輸入:any:mdnsresponder
進入搜索欄。接下來,打開命令行並輸入如下命令:
sudo log config --mode "private_data:on"
sudo killall -INFO mDNSResponder
複製代碼
而後,返回控制檯應用程序並查看緩存的DNS記錄列表。例如,下面的屏幕截圖顯示了wx.qlogo.cn
的緩存CNAME
記錄。
若是在系統的DNS緩存也沒有找到,那麼嘗試讀取hosts
文件。看看這裏面有沒有該域名對應的IP地址,若是有則解析成功。
Windows
位於C:\Windows\System32\drivers\etc
,Mac
則是/etc/hosts
。hosts
文件裏的內容把域名解析到他指定的ip
地址上,形成所謂的域名劫持,因此將hosts
文件設置成了只讀模式,防止被惡意篡改。若是在hosts
文件中也沒有找到對應的條目,瀏覽器就會發起一個DNS
的系統調用,請求本地域名服務器localDNS
(LDNS
)來解析這個域名。
UDP
協議向DNS
的53端口發起請求,這個請求是遞歸的請求,也就是運營商的DNS
服務器必 須得提供給咱們該域名的IP
地址)LDNS
)來解析這個域名,這臺服務通常在你城市的某個角落,距離不會很遠,而且他的性能很好,通常都會緩存域名解析結果,大概80%的域名解析到這裏都結束了。直到這裏,瀏覽器能作的全部DNS解析已完成,接下來的步驟就是和服務器相關了。不想看的能夠忽略。
localDNS
仍然沒有命中,就直接到Root Server
域名服務器請求解析。gTLD Server
)地址。gTLD
是國際頂級域名服務器,如.com
、.cn
、.org
等,全球只有13臺左右。localDNS
再向上一步返回的gTLD
服務器發送請求。gTLD
服務器查找並返回此域名對應的Name Server
域名服務器的地址,這個Name Server
一般就是用戶註冊的域名服務器,例如用戶在某個域名服務提供商申請的域名,那麼這個域名解析任務就由這個域名提供商的服務器來完成。Name Server
域名服務器會查詢存儲的域名和IP的映射關係表,在正常狀況下都根據域名獲得目標IP地址,連同一個TTL值返回給DNS Server
域名服務器。IP
和TTL
值,LDNS
會緩存這個域名和IP
的對應關係,緩存時間由TTL
值控制。注:在實際的DNS解析過程當中,可能還不止這11步(第1步其實能夠忽略不計。),如Name Server
可能有不少級,或者有一個GTM
來負載均衡控制,這都有可能會影響域名解析過程。
不想看文字能夠看圖:
首先須要明確一點:DNS緩存存在多級緩存,從離瀏覽器的距離排序的話,有如下幾種:
IPS
服務器緩存若是每次都通過這麼多步驟解析,是否太耗時間?如何減小該過程的步驟呢? 那就須要DNS
優化了。而在前端優化中與DNS
有關的有兩點:
DNS
的請求次數DNS
預解析DNS
做爲互聯網的基礎協議,其解析的速度彷佛很容易被網站優化人員忽視。如今大多數新瀏覽器已經針對DNS解析進行了優化,典型的一次DNS
解析須要耗費20-120
毫秒,減小DNS解析時間和次數是個很好的優化方式。這裏就再也不述說,着重談DNS
預解析吧。
DNS prefetch
DNS prefetch
是讓具備此屬性的域名不須要用戶點擊連接就在後臺解析,而域名解析和內容載入是串行的網絡操做,因此這個方式能 減小用戶的等待時間,提高用戶體驗 。
默認狀況下瀏覽器會對頁面中和當前域名(正在瀏覽網頁的域名)不在同一個域的域名進行預獲取,而且緩存結果,這就是隱式的 DNS Prefetch
。
若是想對頁面中沒有出現的域進行預獲取,那麼就要使用顯示的 DNS Prefetch
。
其用法也很簡單,只要在link
標籤上加上對應的屬性:
/* 這是用來告知瀏覽器當前頁面要作DNS預解析 */
<meta http-equiv="x-dns-prefetch-control" content="on" />
<link rel="dns-prefetch" href="//example.com">
複製代碼
DNS
預解析雖好,可是也不能濫用。若是對多頁面重複DNS預解析,會增長DNS的查詢次數。目前不少大型站點也應用了這一優化,例如:
淘寶:
京東:
若是須要禁止隱式的 DNS Prefetch
,可使用如下的標籤:
<meta http-equiv="x-dns-prefetch-control" content="off">
複製代碼
CDN
與HTTPDNS
實際上後端&運維能作的優化有三種:
CDN
HTTPDNS
DNS
負載均衡但稍微大型的Web站點,基本捨棄DNS負載均衡這一方案了,缺點太多。感興趣的能夠自行搜索瞭解。
CDN
與DNS
循環CDN
, 全稱是Content Delivery Network
,即內容分發網絡。其目的是經過在現有的Internet
中增長一層新的CACHE
(緩存)層,將網站的內容發佈到最接近用戶的網絡」邊緣「的節點,使用戶能夠就近取得所需的內容,提升用戶訪問網站的響應速度。
DNS
循環: 當權威DNS
發現一個域名映射多個IP
時,會使用IP
輪詢的方式來將IP
平均分配給多個DNS
請求,從而達到負載均衡的效果。
爲何須要CDN
?
DNS
循環時平均分配,不能根據不一樣服務器的負載狀況優化分配,甚至若是有一臺服務器宕機了,DNS
不能及時瞭解到該狀況把該服務器的IP
分配出去,便會形成沒法訪問。DNS
和 服務器之間加上一個CDN
層就顯得很必要了。CDN
在具有調度分配服務器能力的基礎上,可以同步服務器運行狀況,而後根據該狀況及時適當調整調度策略,從而使得負載均衡能力大大提升。CDN
好處:
CDN
的訪問步驟:
(1)未部署CDN應用前:
網絡請求路徑:
在不考慮複雜網絡的狀況下,從請求到響應須要通過3
個節點,6
個步驟完成一次用戶訪問操做。
(2)部署CDN應用後:
網絡路徑:
在不考慮複雜網絡的狀況下,從請求到響應須要通過2
個節點,2
個步驟完成一次用戶訪問操做。
與不部署CDN
服務相比,減小了1
個節點,4
個步驟的訪問。極大的提升的系統的響應速度。
如下是結合具體網絡運維的步驟:
step1:用戶向localDNS發起請求查詢輸入域名對應的IP地址(如有緩存直接返回,不然去rootDNS查詢);
step2:localDNS迭代向rootDNS查詢,逐級迭代,rootDNS=>頂級DNS=>權限DNS;
step3:得到權限DNS後,localDNS向權限DNS發起域名解析請求;
step4:權限DNS一般會將域名CNAME
【若是有有CNAME則解析CNAME對應的CDN服務,不然的話默認爲普通請求,直接返回解析到的IP】到另外一個域名,這個域名最終會被指向CDN網絡中的智能DNS負載均衡系統;
step5:DNS負載均衡系統經過一些智能算法,將最合適的CDN節點IP地址返回給localDNS;
step6:localDNS將得到的IP地址返回給用戶;
step7:用戶獲得節點的IP地址後,向該節點發起訪問請求;
step8:CDN節點返回請求文件,若是該節點中請求的文件不存在,就會再回到源站獲取這個文件,而後返回給用戶。
複製代碼
HTTPDNS
:解決DNS
挾持:在慣有的印象中,不少時候以爲站點上完HTTPS
協議就VANS
。其實否則:
HTTPS
技術,部分邪惡的運營商,仍然使用DNS
污染技術,讓域名指向的他們本身服務器。SSL
服務(就算部署了,也會觸發 SSL
證書 Common name
不一致報警), 致使 443 端口直接被拒絕。運營商爲了賺廣告錢、省網間結算是不擇手段的。 他們廣泛使用的劫持手段是經過 ISP
提供的 DNS
僞造域名。 那有沒有什麼方法能夠解決 DNS
劫持呢?
業界有一套解決這類場景的方案,即 HTTPDNS
:
HTTPDNS
使用HTTP
協議進行域名解析,代替現有基於UDP
的DNS協議,域名解析請求直接發送到HTTPDNS
服務器,從而繞過運營商的Local DNS
,可以避免Local DNS
形成的域名劫持問題和調度不精準問題。
HTTPDNS
的原理很簡單,將 DNS
這種容易被劫持的協議,轉爲使用HTTP
協議請求Domain
<-> IP
映射。 得到正確IP
以後,Client
本身組裝HTTP
協議,從而避免ISP
篡改數據。
騰訊做爲首家提供HttpDNS
服務的雲服務商,有兩篇相隔四年發佈的文章,很是詳細的揭示其中技術細節:
下一篇的內容講圍繞HTTP 優化
的兩個大方向::
與其對應的內容有:
nginx
配置/ 域名發散收斂。webpack/Gzip
相關。須要轉載到公衆號的喊我加下白名單就好了。