首先是 DNS 查詢客们,如果這一步做了智能 DNS 解析的話,會提供訪問速度最快的 IP 地址回來。
DNS
DNS 的作用就是通過域名查詢到具體的 IP叙淌。
因為 IP 存在數(shù)字和英文的組合(IPv6),很不利于人類記憶愁铺,所以就出現(xiàn)了域名鹰霍。你可以把域名看成是某個 IP 的別名,DNS 就是去查詢這個別名的真正名稱是什么茵乱。
在 TCP 握手之前就已經(jīng)進行了 DNS 查詢茂洒,這個查詢是操作系統(tǒng)自己做的。當你在瀏覽器中想訪問 www.google.com
時瓶竭,會進行一下操作:
- 操作系統(tǒng)會首先在本地緩存中查詢 IP
- 沒有的話會去系統(tǒng)配置的 DNS 服務器中查詢
- 如果這時候還沒得話督勺,會直接去 DNS 根服務器查詢,這一步查詢會找出負責 com 這個一級域名的服務器
- 然后去該服務器查詢
google
這個二級域名 - 接下來三級域名的查詢其實是我們配置的斤贰,你可以給
www
這個域名配置一個 IP智哀,然后還可以給別的三級域名配置一個 IP
以上介紹的是 DNS 迭代查詢,還有種是遞歸查詢荧恍,區(qū)別就是前者是由客戶端去做請求瓷叫,后者是由系統(tǒng)配置的 DNS 服務器做請求,得到結(jié)果后將數(shù)據(jù)返回給客戶端。
接下來是 TCP 握手摹菠,應用層會下發(fā)數(shù)據(jù)給傳輸層盒卸,這里 TCP 協(xié)議會指明兩端的端口號,然后下發(fā)給網(wǎng)絡層辨嗽。網(wǎng)絡層中的 IP 協(xié)議會確定 IP 地址世落,并且指示了數(shù)據(jù)傳輸中如何跳轉(zhuǎn)路由器。然后包會再被封裝到數(shù)據(jù)鏈路層的數(shù)據(jù)幀結(jié)構(gòu)中糟需,最后就是物理層面的傳輸了屉佳。
在這一部分中,可以詳細說下 TCP 的握手情況以及 TCP 的一些特性洲押。
當 TCP 握手結(jié)束后就會進行 TLS 握手武花,然后就開始正式的傳輸數(shù)據(jù)。
在這一部分中杈帐,可以詳細說下 TLS 的握手情況以及兩種加密方式的內(nèi)容体箕。
數(shù)據(jù)在進入服務端之前,可能還會先經(jīng)過負責負載均衡的服務器挑童,它的作用就是將請求合理的分發(fā)到多臺服務器上累铅,這時假設(shè)服務端會響應一個 HTML 文件。
首先瀏覽器會判斷狀態(tài)碼是什么站叼,如果是 200 那就繼續(xù)解析娃兽,如果 400 或 500 的話就會報錯,如果 300 的話會進行重定向尽楔,這里會有個重定向計數(shù)器投储,避免過多次的重定向,超過次數(shù)也會報錯阔馋。
瀏覽器開始解析文件玛荞,如果是 gzip 格式的話會先解壓一下,然后通過文件的編碼格式知道該如何去解碼文件呕寝。
文件解碼成功后會正式開始渲染流程勋眯,先會根據(jù) HTML 構(gòu)建 DOM 樹,有 CSS 的話會去構(gòu)建 CSSOM 樹下梢。如果遇到 script 標簽的話客蹋,會判斷是否存在 async 或者 defer ,前者會并行進行下載并執(zhí)行 JS怔球,后者會先下載文件嚼酝,然后等待 HTML 解析完成后順序執(zhí)行浮还。
如果以上都沒有竟坛,就會阻塞住渲染流程直到 JS 執(zhí)行完畢。遇到文件下載的會去下載文件,這里如果使用 HTTP/2 協(xié)議的話會極大的提高多圖的下載效率担汤。
CSSOM 樹和 DOM 樹構(gòu)建完成后會開始生成 Render 樹涎跨,這一步就是確定頁面元素的布局、樣式等等諸多方面的東西
在生成 Render 樹的過程中崭歧,瀏覽器就開始調(diào)用 GPU 繪制隅很,合成圖層,將內(nèi)容顯示在屏幕上了率碾。
這一部分就是渲染原理中講解到的內(nèi)容叔营,可以詳細的說明下這一過程。并且在下載文件時所宰,也可以說下通過 HTTP/2 協(xié)議可以解決隊頭阻塞的問題绒尊。
總的來說這一章節(jié)就是帶著大家從 DNS 查詢開始到渲染出畫面完整的了解一遍過程,將之前學習到的內(nèi)容連接起來仔粥。
當來這一過程遠遠不止這些內(nèi)容婴谱,但是對于大部分人能答出這些內(nèi)容已經(jīng)很不錯了,你如果想了解更加詳細的過程躯泰,可以閱讀這篇文章谭羔。