從輸入URL到頁面載入發生了什麼?

来源:https://www.cnblogs.com/yinhaiying/archive/2019/12/04/11984003.html
-Advertisement-
Play Games

從輸入URL到頁面載入發生了什麼? 最近在進行前端性能優化方面的一些工作,發現前端性能方面太廣,不知道如何下手。參考了許多文章,發現最終都會歸咎於一個非常經典的問題: 從輸入URL到頁面載入發生了什麼? 通過連接這個過程,然後針對性地對每個過程進行優化,最終實現的就是我們的前端性能優化。本篇文章主要 ...


從輸入URL到頁面載入發生了什麼?

最近在進行前端性能優化方面的一些工作,發現前端性能方面太廣,不知道如何下手。參考了許多文章,發現最終都會歸咎於一個非常經典的問題:從輸入URL到頁面載入發生了什麼?通過連接這個過程,然後針對性地對每個過程進行優化,最終實現的就是我們的前端性能優化。本篇文章主要介紹一些基礎性的概念,很少涉及真正的性能優化。

具體過程?

打開瀏覽器,輸入URL,到頁面展示出來,這個中間大致經歷了這些過程:

  1. 輸入URL
  2. DNS解析
  3. TCP握手
  4. HTTP請求
  5. HTTP響應返回數據
  6. 瀏覽器解析並渲染頁面

URL過程.png

上面粗劣的介紹了輸入URL到頁面載入的大致過程,但是缺少更加詳細的過程,事實上w3c給我們提供了一個介面performance.timing更加詳細地介紹了每個過程,並且可以通過這個過程獲取頁面性能數據。如下圖所示:

timing-overview.png

上圖的過程大致可以分為三個大的階段:

  1. 緩存相關:主要包括Prompt for unload,redirect和App cache3個過程
  2. 網路相關:主要包括DNS,TCP和HTTP(Request,Response)3個過程
  3. 瀏覽器相關:主要包括Processing和onload兩個過程

通過將整個過程細分為3個大的階段,然後再每個階段每個階段介紹,這樣方便我們記憶和理解。

緩存相關

1、卸載已有的頁面(Prompt for unload)

我們在頁面中輸入URL時,首先會卸載掉原來的頁面。這是為了釋放頁面占據的記憶體,否則沒請求一次URL都占據一份記憶體,會導致瀏覽器占據記憶體越來越大。

2、重定向(redirect)

所謂的重定向實際上就是先從本地緩存中去查找請求的內容,如果本地緩存中有則直接使用,如果沒有則向伺服器進行請求(這隻是簡單的理解,實際上如何獲取數據是存在緩存策略的)。事實上,每次從伺服器獲取到文件,文件會被暫時存放到一個指定區域,當我們下次再次請求這個文件時,瀏覽器會首先從這個區域查看是否已經存在過這個文件,如果已經存在,則不需要再次進行請求數據。

3、App cache

網路相關

4、DNS

DNS(Domain Name System)功能變數名稱系統,顧名思義是用來解析功能變數名稱系統的。在網路中,我們人適合於記憶文本,因此我們輸入的都是www.baidu.com這種字元串,但是電腦適合於處理數字,每一臺電腦對應的是一個IP地址。因此,如果我們要訪問一個指定的資源,必須先找到對應的伺服器,而找到伺服器需要先將功能變數名稱轉換為對應的IP地址。而DNS就是幫助我們實現這個過程。

功能變數名稱級別

功能變數名稱的級別是指一個功能變數名稱由多少級組成,功能變數名稱的各個級別被"."分開,總而言之,有多少個點就是幾級功能變數名稱。
頂級功能變數名稱在開頭有一個點(.com .cn .net)
一級功能變數名稱就是在"com cn net"前加一級 (baidu.com)
二級功能變數名稱就是在一級功能變數名稱前再加一級(www.baidu.com)
二級功能變數名稱及以上級別的功能變數名稱,統稱為子功能變數名稱,不在註冊功能變數名稱的範疇中

功能變數名稱資源記錄

記錄類型 含義
SOA(StartOf Authority,起始授權記錄) 一個區域解析庫中有且只能有一個SOA記錄,而且必須放在第一條
A記錄(主機記錄,針對IPV4的記錄) 用於名稱解析的重要記錄,將特定的主機名映射到對應主機的IP地址上
CNAME記錄(別名記錄) 用於返回另外一個功能變數名稱,即當前查詢的功能變數名稱是另一個功能變數名稱的跳轉,主要用於功能變數名稱的內部跳轉,為伺服器配置提供靈活性
NS記錄(功能變數名稱伺服器記錄) 用於返回保存下一級功能變數名稱信息的伺服器地址。該記錄只能設置為功能變數名稱,不能設置為IP地址
MX(郵件記錄) 用戶返回接收電子郵件的伺服器地址
C記錄(IPV6記錄) 用於將特定的主機名映射到一個主機的IPV6地址

功能變數名稱伺服器

DNS.png

功能變數名稱的解析需要用到一系列的伺服器,而不是簡單的一個伺服器。比如:用戶想要解析www.google.com:

  1. 在本機上輸入www.google.com
  2. 2號伺服器是用戶在自己電腦上填寫的DNS地址,由於功能變數名稱和ip地址的對照表非常龐大,因此2號伺服器會進行分層管理。2號伺服器進行功能變數名稱解析是會先從緩存中進行查找,如果一個功能變數名稱被頻繁訪問,通常會被保存到緩存中。如果DNS這沒有對應的功能變數名稱-IP緩存,那麼就需要向根伺服器(Root Server)發起請求。
  3. 根伺服器負責維護全球的功能變數名稱-IP地址解析。根伺服器會檢查功能變數名稱尾碼(比如.com),根據不同的尾碼,交給不同的TLD伺服器處理。獲取到尾碼後,返回對應的TLD伺服器的ip地址(com = 1.1.1.1)。
  4. DNS拿到TLD伺服器的IP地址後,繼續向TLD伺服器進行詢問。TLD伺服器只返回頂級功能變數名稱對應的IP(google.com = 2222),交給頂級功能變數名稱對應的Name Server處理。
  5. DNS伺服器獲取到頂級功能變數名稱的IP後,繼續向Name Server進行詢問。Name Server返回具體的功能變數名稱對應的IP地址。
  6. DNS伺服器獲取到具體的功能變數名稱對應的IP後,會先進行緩存,避免下次請求時繼續多次詢問。

5、TCP

TCP是HTTP的下層協議,我們想要通過HTTP進行請求,必須先通過TCP進行連接,也就是說HTTP是依賴於TCP的。TCP的作用就是連接指定IP地址的伺服器(通過DNS已經獲取到對應的伺服器IP地址)。

每次連接的時候,TCP都會經歷三次握手,每次斷開連接時TCP都會經歷四次揮手。這些過程就是可以優化的地方,這裡不做闡釋。

6、HTTP請求(Request)和響應(Response)

在 HTTP/1.x 中,如果客戶端要想發起多個並行請求以提升性能,則必須使用多個 TCP 連接。 這是 HTTP/1.x 交付模型的直接結果,該模型可以保證每個連接每次只交付一個響應(響應排隊)。 更糟糕的是,這種模型也會導致隊首阻塞,從而造成底層 TCP 連接的效率低下。 也就是說在目前的HTTP1.X的協議下,瀏覽器對資源的併發請求個數是有限制的。 等到HTTP2到來的時候,通過二進位分幀層進行優化。 HTTP/2 中新的二進位分幀層突破了這些限制,實現了完整的請求和響應復用:客戶端和伺服器可以將 HTTP 消息分解為互不依賴的幀,然後交錯發送,最後再在另一端把它們重新組裝起來。

瀏覽器相關

7、文檔解析和DOM的載入(Processing)

HTTP請求後返回的是一個文本,我們需要將文本轉換成DOM樹,然後載入DOM

8、觸發Onload事件(onload)

DOM載入完成之後,觸發onload事件。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、分散式資料庫存儲 在前面的章節;GreenPlum資料庫是分散式架構資料庫;表的數據分佈在segment節點。那麼表的數據根據什麼策略來分佈的? GreenPlum資料庫性能依賴於跨數據節點均勻分佈 二、分佈策略 在GreenPlum資料庫在創建表時可以指定分佈策略:哈希分佈(DISTRIBUT ...
  • 假如有這樣一張表: 腳本如下: DROP TABLE IF EXISTS `jl_site_operation`;CREATE TABLE `jl_site_operation` ( `id` int(11) NOT NULL AUTO_INCREMENT, `site_id` int(11) DE ...
  • 文中使用mysql5.7 版本實現多實例,埠為3306和3307。 1、多實例本質在一臺機器上開啟多個不同的mysql服務埠(3306,3307),運行多個mysql服務進程,這些服務進程通過不同的socket監聽不同的服務埠來提供各自的服務; 多個實例共用一套mysql安裝程式,配置文件可以 ...
  • 轉載請標明出處:https://www.cnblogs.com/tangZH/p/11985745.html 有些手機中,給TextView設置lineSpacingExtra後會出現最後一行的文字也出現lineSpacingExtra,不是某些版本才會,這跟機型有關。 可以用下麵這種方法解決: ...
  • 作為JavaScript開發人員,NPM是我們一直使用的東西,並且我們的腳本在終端上連續運行。 如果我們可以節省一些時間呢? 1、直接從npm打開文檔 如果我們可以直接使用npm跳轉到軟體包的文檔怎麼辦? 2、打開bug頁面 為了以防萬一,我們想在程式包上提交一個錯誤。 如果有這個包的作者的鏈接,將 ...
  • 在web開發時,可能經常會用到sessionstorage存儲數據,存儲單個字元串數據變數時並不困難 var str = 'This is a string'; sessionstorage.setItem('param',str); 獲取sessionstorage var item = sess ...
  • js Brendan(布蘭登) Eich 輕量級的編程語言(ECMAscript5或6), 是一種解釋性腳本語言(代碼不進行預編譯), 主要用來向HTML頁面添加交互行為, 目前是互聯網上最流行的腳本語言, 支持面向對象、命令式和聲明式(如函數式編程)風格, JavaScript,他和Python一 ...
  • 事故起源於一個魔鬼測試人員,某天做網站UI優化的時候,突然甩了一個問題給我 第二列的數據是可以跳轉至其他頁面的,但是,魔鬼測試的電腦上,一直都有一條數據是與其他的樣式不同,於是便甩了這個問題給我,我一瞅,喲呵,還真是,而且不管如何F5,Ctrl + F5,都不能改變它變黑的事實,一時間都不敢回消息了 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...